Доброго времени суток. Подскажите - как макросом среагировать на изменение содержимого ячеек от формулы (без пересчета всего листа) ?
Вот этот код реагирует - только на изменения содержимого ячеек вручную. [vba]
Код
Private Sub Worksheet_Change(ByVal target As Range) If Not Application.Intersect(Range("G7:M16"), target) Is Nothing Then MsgBox "Значение ячейки изменено." End If End Sub
[/vba]
Доброго времени суток. Подскажите - как макросом среагировать на изменение содержимого ячеек от формулы (без пересчета всего листа) ?
Вот этот код реагирует - только на изменения содержимого ячеек вручную. [vba]
Код
Private Sub Worksheet_Change(ByVal target As Range) If Not Application.Intersect(Range("G7:M16"), target) Is Nothing Then MsgBox "Значение ячейки изменено." End If End Sub
Подозреваю, что надо использовать событие Worksheet_Calculate. И, возможно, внутри него придется временно отключать срабатывание событий с помощью Application.EnableEvents = False - чтобы не попасть в зацикливание.
Подозреваю, что надо использовать событие Worksheet_Calculate. И, возможно, внутри него придется временно отключать срабатывание событий с помощью Application.EnableEvents = False - чтобы не попасть в зацикливание.Gustav
А много у вас таких ячеек, за которыми надо следить, что они (хотя бы одна из них) пересчитались? Событие Calculate не имеет параметра Target как у события Change. Поэтому для того, чтобы узнать об изменении значения какой-либо ячейки, нужно иметь значения этой ячейки ДО (старое) и ПОСЛЕ (новое) пересчета. Значение “после” - это текущее значение ячейки на момент текущего исполнения события Calculate. Значение “до” - это значение ячейки во время предыдущего исполнения события Calculate. Очевидно, что начальные (инициирующие) значения “до” надо будет зафиксировать при каком-то другом событии: например, при открытии книги или активации листа или ручной правке (Change). После очередного сравнения значений “до” и “после”, разумеется, значения “после” копируются в значения “до”, готовясь к следующему событию Calculate.
Вы морально готовы к воплощению всех этих операций в коде VBA? Что вообще физически простыми словами вы хотите сделать? Давайте подумаем, может быть существуют какие-то альтернативные пути для достижения цели?
А много у вас таких ячеек, за которыми надо следить, что они (хотя бы одна из них) пересчитались? Событие Calculate не имеет параметра Target как у события Change. Поэтому для того, чтобы узнать об изменении значения какой-либо ячейки, нужно иметь значения этой ячейки ДО (старое) и ПОСЛЕ (новое) пересчета. Значение “после” - это текущее значение ячейки на момент текущего исполнения события Calculate. Значение “до” - это значение ячейки во время предыдущего исполнения события Calculate. Очевидно, что начальные (инициирующие) значения “до” надо будет зафиксировать при каком-то другом событии: например, при открытии книги или активации листа или ручной правке (Change). После очередного сравнения значений “до” и “после”, разумеется, значения “после” копируются в значения “до”, готовясь к следующему событию Calculate.
Вы морально готовы к воплощению всех этих операций в коде VBA? Что вообще физически простыми словами вы хотите сделать? Давайте подумаем, может быть существуют какие-то альтернативные пути для достижения цели?Gustav
По мотивам кода i691198 для данного случая предложу свою версию процедуры ChangeRng: [vba]
Код
Sub ChangeRng() Dim currArr, i, j, isDiffer As Boolean currArr = Worksheets("Лист").Range("$G$7:$M$16").Value
For i = 1 To UBound(currArr, 1) For j = 1 To UBound(currArr, 2) isDiffer = currArr(i, j) <> KArr(i, j) If isDiffer Then Exit For Next j If isDiffer Then Exit For Next i
If isDiffer Then MsgBox "Значение одной из ячеек изменено." KArr = currArr 'первоначально KArr инициируется в событии Workbook_Open End If End Sub
[/vba]
По мотивам кода i691198 для данного случая предложу свою версию процедуры ChangeRng: [vba]
Код
Sub ChangeRng() Dim currArr, i, j, isDiffer As Boolean currArr = Worksheets("Лист").Range("$G$7:$M$16").Value
For i = 1 To UBound(currArr, 1) For j = 1 To UBound(currArr, 2) isDiffer = currArr(i, j) <> KArr(i, j) If isDiffer Then Exit For Next j If isDiffer Then Exit For Next i
If isDiffer Then MsgBox "Значение одной из ячеек изменено." KArr = currArr 'первоначально KArr инициируется в событии Workbook_Open End If End Sub