(Я нахожусь на мобильном телефоне, поэтому я не могу дать очень подробный ответ прямо сейчас.)
Я написал код именно для этого. Моим намерением было отслеживать все изменения на критическом листе, отредактированном несколькими пользователями. Если возник спор о том, откуда поступили данные, я мог бы просмотреть журнал. Вот части VBA, которые пригодятся.
Событие Worksheet_Change
будет срабатывать при каждом изменении рабочего листа.
If Not Intersect(Target, Range("A1:G12")) Is Nothing
не скажет, находятся ли измененные ячейки в некотором диапазоне, о котором вы заботитесь.
Быстрее хранить значения, которые вы хотите зарегистрировать в массиве, и они устанавливают некоторый диапазон на вашем листе журнала равным этому массиву, в отличие от настройки каждой ячейки на листе журнала отдельно.
Сделай удар и посмотри, как далеко ты доберешься. Я могу быть немного более многословным завтра.
Следующий день Править
Вот некоторый код, который будет смотреть диапазон A1:G12
на любом листе с кодом в нем. Если r
- строка, которая была изменена, то код скопирует все из Ar:Gr
в лист с кодовым именем shtLog
. (Кодовое имя - это имя, отображаемое в VBA, а не имя на вкладке, которую вы видите в Excel.) Это должно заставить вас двигаться в правильном направлении.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Integer
Dim c As Integer
Dim arr(1 To 1, 1 To 12)
If Not Intersect(Target, Range("A1:G12")) Is Nothing Then
r = Target.Row
For c = 1 To 12
arr(1, c) = Cells(r, c).Value
Next
With shtLog
.Range(.Cells(.UsedRange.Rows.Count + 1, 1), .Cells(.UsedRange.Rows.Count + 1, 12)) = arr
End With
End If
End Sub