Хорошо, если мы рассмотрим эти строки вашего кода
Dim Xrg As Range
Set Xrg = Range("W4656:W4657")
If Not Intersect(Xrg, Range("W4656:W4657")) Is Nothing Then
Так как мы установили Xrg
, то сразу же используем его, мы можем переписать это как
If Not Intersect(Range("W4656:W4657"), Range("W4656:W4657")) Is Nothing Then
что всегда будет правдой. Таким образом, каждый раз, когда лист вычисляет, он будет говорить «ИЗМЕНЕНО ОБНАРУЖЕНО!»
В идеале, вы хотите где-то хранить значения в этих ячейках, а затем просто выполнить сравнение между ячейками и сохраненными значениями. Используя Переменные Рабочего листа, вы можете получить следующее: (Вы также можете сохранить значения в скрытом рабочем листе в качестве альтернативы)
Option Explicit 'This line should almost ALWAYS be at the start of your code modules
Private StoredW4656 As Variant 'Worksheet Variable 1
Private StoredW4657 As Variant 'Worksheet Variable 2
Private Sub Worksheet_Calculate()
On Error GoTo SaveVars 'In case the Variables are "dropped"
'If the values haven't changed, do nothing
If (Me.Range("W4656").Value = StoredW4656) And _
(Me.Range("W4657").Value = StoredW4657) Then Exit Sub
MsgBox "CHANGE DETECTED!", vbInformation
SaveVars:
StoredW4656 = Me.Range("W4656").Value
StoredW4657 = Me.Range("W4657").Value
End Sub