簡體   English   中英

VBA:如何通過工作表模塊中的“填充”或“復制/粘貼”(或任何多個單元格)找到正在編輯的范圍

[英]VBA: How to locate range being edited through “fill down” or “copy/paste” (or any multiple cells) in worksheet module

我有兩個包含五個專欄的工作表,我想跟蹤所做的任何更改。 我在工作表A中顯示這些列的原始狀態,並在工作表B中標記更改。

工作表B的屏幕截圖

以下是工作表B的外觀,假設工作表A具有“ ORIG”部分,但具有過濾器和其他功能: 原始狀態與新狀態的比較

注意:我已經編寫了另一個工作表子例程,該子例程將過濾為“都一樣嗎?” = False(表示此行已更改),只要此工作表被激活。

我已經編寫了適用於更改一個單元格的代碼(例如,當您使用F2編輯該單元格,然后在完成時按ENTER鍵)-一個工作表子例程,該例程在工作表更改時觸發。 該子例程將檢查更改的范圍,如果范圍是指定的區域,則在另一個工作表中更新相應的區域。

工作表子例程

Private Sub Worksheet_Change(ByVal target As Range)
    Dim start_row As Long: start_row = 4
    Dim last_row As Long: last_row = findLastRow()

' when values are changed in "REPORT", check if values are ouputable and update these values
    If IsInArray(Number2Letter(target.Column), inputColumns) And target.row >= start_row And target.row <= last_row Then
        ' Update corresponding cell in worksheetB
    End If
End Sub

其他UDF / UDS

Public Function Number2Letter(ColumnNumber As Long) As String
'convert a given number into it's corresponding Letter Reference
    Dim columnLetter As String
    columnLetter = Split(Cells(1, ColumnNumber).Address, "$")(1)
    Number2Letter = columnLetter
End Function

Public Function IsInArray(valToBeFound As Variant, arr As Variant) As Boolean
'INPUT: Pass the function a value to search for and an array of values of any data type.
'OUTPUT: True if is in array, false otherwise

    Dim element As Variant
    On Error GoTo IsInArrayError: 'array is empty
        For Each element In arr
            If element = valToBeFound Then
                IsInArray = True
                Exit Function
            End If
        Next element
    Exit Function
IsInArrayError:
    On Error GoTo 0
    IsInArray = False
End Function

Public Function findLastRow() As Long
'Finds the last non-blank cell on a sheet
    Dim lRow As Long
        lRow = Cells.Find(what:="*", _
                        After:=Range("A1"), _
                        lookat:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).row
    findLastRow = lRow
End Function

為了簡單起見,我隱藏了“做某事”部分,但是該部分已經可以使用了。 使用UDF / UDS的情況與我僅在有人感興趣時向他們展示的情況相同。 另外,數組inputColumns已經存在,因此也不必擔心該部分。

我要的是:


1.是否有像targetRange這樣的屬性可以像我提到的那樣用於填充或粘貼?
2.還是可以使用其他工作表事件
3.如果兩者都不存在,我正在考慮在數組中標記原始狀態,並將其與每次進入工作表B時在第一個工作表上可見的狀態進行比較。這種方法的問題在於,它既占用空間又消耗速度。 您能想到更好的方法嗎?

謝謝!

我認為相交功能將在這里為您提供很多幫助。 您可以定義要“審核”的范圍,並將其與工作表中單個操作更改的所有值進行比較。 如果有任何重疊,請將那些單元格的值寫到某個目標位置。

Private Sub Worksheet_Change(ByVal target As Range)

    Dim AuditRange As Range
    Set AuditRange = Range("B4:F16") 'your "Audit Area"

    Set range_auditedAndChanged = Intersect(target, AuditRange)
    If Not range_auditedAndChanged Is Nothing Then

        For Each c In range_auditedAndChanged
                'put in whereever your audit workbook is for Sheets("Sheet2")
                Sheets("Sheet2").Range(c.Address).Value = c.Value
        Next c

    End If
End Sub

在此處輸入圖片說明 在此處輸入圖片說明

目前,您只審核了值-沒有任何格式。 您可以將“值”分配更改為某種副本,但是即使關閉了屏幕更新,這也會劫持用戶一段時間。

無論如何,我認為這是更干凈,性能更好的,並且要管理的UDF少得多。 希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM