У меня есть две таблицы с пятью столбцами, которые я хочу отслеживать любые сделанные изменения.Я представляю исходное состояние этих столбцов на рабочем листе A и отмечаю изменение на рабочем листе B.
Снимок экрана рабочего листа B
Ниже приведен внешний вид рабочего листа B, скажем, что рабочий лист A имеетЧасть «ORIG», но с фильтрами и прочим: 
Примечание. Я уже написал другую подпрограмму рабочего листа, которая будет фильтровать «Все то же самое?»= False (это означает, что эта строка изменяется) всякий раз, когда активируется этот рабочий лист.
Я уже написал код, который будет работать для изменения одной ячейки (например, когда вы редактируете ячейку с помощью F2, а затемнажмите клавишу ВВОД, когда вы закончите) - подпрограмма рабочего листа, которая срабатывает при изменении рабочего листа.Подпрограмма проверит наличие измененного диапазона, и, если диапазон является указанной областью, соответствующая область будет обновлена в другом листе.
Подпрограмма рабочего листа
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. Проблема с этим подходом состоит в том, что он потребляет как пространство, так и скорость.Не могли бы вы придумать лучший способ?
Спасибо!