Если у меня есть формула в ячейке A1 (например, = B1 * C1), и я хочу запускать некоторый код VBA при каждом изменении A1 из-за обновлений в ячейке B1 или C1, тогда я могу использовать следующее:
Private Sub Worksheet_Calculate()
Dim target As Range
Set target = Range("A1")
If Not Intersect(target, Range("A1")) Is Nothing Then
//Run my VBA code
End If
End Sub
Обновление
Насколько я знаю, проблема с Worksheet_Calculate
заключается в том, что она запускается для всех ячеек, содержащих формулы в электронной таблице, и вы не можете определить, какая ячейка была пересчитана (т. Е. Worksheet_Calculate
не предоставляет объект Target
)
Чтобы обойти это, если у вас есть набор формул в столбце А, и вы хотите определить, какая из них обновлена, и добавить комментарий к этой конкретной ячейке, то я думаю, что следующий код достигнет этого:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim updatedCell As Range
Set updatedCell = Range(Target.Dependents.Address)
If Not Intersect(updatedCell, Range("A:A")) Is Nothing Then
updatedCell.AddComment ("My Comments")
End If
End Sub
Чтобы пояснить, для обновления формулы одна из входных ячеек в эту формулу должна измениться, например, если формула в A1
равна =B1 * C1
, то либо B1
, либо C1
должны измениться, чтобы обновить A1.
Мы можем использовать событие Worksheet_Change
, чтобы обнаружить изменение ячейки на листе / листе, а затем использовать функцию аудита Excel для отслеживания зависимостей, например. Ячейка A1 зависит от B1
и C1
, и в этом случае код Target.Dependents.Address
вернет $A$1
для любого изменения B1
или C1
.
Учитывая это, все, что нам теперь нужно сделать, это проверить, находится ли зависимый адрес в столбце A (используя Intersect
). Если он находится в столбце А, мы можем добавить комментарии в соответствующую ячейку.
Обратите внимание, что это работает только для добавления комментариев только один раз в ячейку. Если вы хотите продолжить перезаписывать комментарии в той же ячейке, вам нужно будет изменить код, чтобы сначала проверить наличие комментариев, а затем удалить при необходимости.