Вы, кажется, путаете Worksheet_Calculate с Worksheet_Change и используете Intersect, как если бы один из аргументов был Target (которого нет в Worksheet_Calculate).
Intersect(cbX1, Range("A1:F1"))
равен всегда , не ничто, потому чтоВы сравниваете шесть яблок с теми же шестью яблоками.Вы также можете спросить '1,2,3,4,5,6 - это то же самое, что 1,2,3,4,5,6?' .
Вам нужен метод записи значений диапазона ваших формул от одного цикла расчета к следующему.Некоторые используют открытую переменную, объявленную вне подпроцедуры Worksheet_calculate;лично я предпочитаю статический вариантный массив, объявленный в подпункте Worksheet_calculate.
Проблема с этими значениями - это начальные значения, но это может быть достигнуто, поскольку рабочие книги при открытии проходят цикл вычислений.Однако он не будет регистрироваться сейчас в столбце G при первом запуске цикла расчета;у вас уже есть открытая книга, когда вы вставляете код, и требуется один цикл вычислений для «заполнения» массива, содержащего значения предыдущего цикла вычислений.
Option Explicit
Private Sub Worksheet_Calculate()
Static vals As Variant
If IsEmpty(vals) Then 'could also be IsArray(vals)
vals = Range(Cells(1, "A"), Cells(3, "F")).Value2
Else
Dim i As Long, j As Long
With Range(Cells(1, "A"), Cells(3, "F"))
For i = LBound(vals, 1) To UBound(vals, 1)
For j = LBound(vals, 2) To UBound(vals, 2)
If .Cells(i, j).Value2 <> vals(i, j) Then
Application.EnableEvents = False
.Cells(i, "G") = Now
Application.EnableEvents = True
vals(i, j) = .Cells(i, j).Value2
End If
Next j
Next i
End With
End If
End Sub