Самый простой способ сделать это - поместить функцию Worksheet_Change
в код рабочего листа в Sheet1
Для этого щелкните правой кнопкой мыши таблицу "Sheet1" и выберите код представления.
объяснение
Мы можем использовать что-то вроде этого для отслеживания изменений в Sheet1:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$1" Or Target.Address = "$C$2" Or Target.Address = "$B$3" Or Target.Address = "$A$2" Then
MsgBox ("Value changed")
End If
End Sub
Это просто ищет изменения на листе и возвращает изменение как переменную Target
.
Затем мы проверяем адрес изменения с помощью Target.Address
который возвращается в форме $A$1
.
Простой оператор If
затем проверяет, является ли целью какая-либо из указанных нами ячеек.
Теперь нам нужно получить значение на другой лист.
Сначала я хочу несколько переменных. Я называю их rSave (диапазон для сохранения значения) и iRow (целое число, которое захватывает последнюю использованную строку.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim iRow As Integer, rSave As Range
Set rSave = Worksheets("Sheet2").Range("A1")
If Target.Address = "$B$1" Or Target.Address = "$C$2" Or Target.Address = "$B$3" Or Target.Address = "$A$2" Then
iRow = rSave(Rows.Count).End(xlUp).Row
rSave.Offset(iRow).Value = Target.Value
'Target.Value = ""
End If
End Sub
Мы устанавливаем переменную диапазона в ячейку выше, где мы хотим начать выводить числа.
Мы проверяем изменения и устанавливаем в iRow
последнюю использованную строку столбца на sheet2.
Мы смещаем наш диапазон строкой из iRow
и записываем наш целевой номер.
Затем мы хотим установить значение в Sheet1 обратно в ноль. Однако это вызывает изменение ячеек, которые мы отслеживаем, и в основном вызывает бесконечный цикл.
Чтобы обойти это, мы сначала проверяем, не пуста ли ячейка, прежде чем пытаться снова.
И мы, наконец, в конечном итоге с этим:
Актуальный ответ
Private Sub Worksheet_Change(ByVal Target As Range)
Dim iRow As Integer, rSave As Range
Set rSave = Worksheets("Sheet2").Range("A1")
If Target.Address = "$B$1" Or Target.Address = "$C$2" Or Target.Address = "$B$3" Or Target.Address = "$A$2" Then
If Target.Value <> "" Then
iRow = rSave(Rows.Count).End(xlUp).Row
rSave.Offset(iRow).Value = Target.Value
Target.Value = ""
End If
End If
End Sub
Удачи!
Обратите внимание, что это сохранит все, что введено в ячейки Sheet1. Вы можете ограничить это, просто добавив And
в If Target.Value <> "" Then
и проверьте наличие дополнительных критериев, таких как конкретные числа или аналогичные.