Событие worksheet_calculate наступает всякий раз, когда данные вводятся где-либо в книге - PullRequest
0 голосов
/ 29 августа 2018

Я немного новичок, чтобы преуспеть. Мне (с помощью онлайн-поиска) удалось наконец создать макрос события worksheet_calculate, который, кажется, работает. Макрос должен возвращать окно сообщения (CHANGE DETECTED!) Всякий раз, когда значение в ячейках W4656: W4657 изменяется. На эти значения ссылаются из другого листа в той же книге. Моя проблема в том, что событие worksheet_calculate вызывается всякий раз, когда данные вводятся где-либо в книге. Был бы очень рад, если бы мой макрос мог быть изменен так, чтобы событие worksheet_calculate вызывалось только при изменении данных в определенной ячейке (ячейке на другом листе), а не всякий раз, когда данные вводились где-либо еще в книге. Спасибо.

Вот код, который я хочу изменить:

Private Sub Worksheet_Calculate()
Dim Xrg As Range
Set Xrg = Range("W4656:W4657")
If Not Intersect(Xrg, Range("W4656:W4657")) Is Nothing Then
MsgBox ("CHANGE DETECTED!!")
      ActiveWorkbook.Save
End If
End Sub

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Хорошо, если мы рассмотрим эти строки вашего кода

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
0 голосов
/ 01 сентября 2018

Итак, мне удалось найти решение (обойти?) Моей проблемы. В итоге я использовал макрос, чтобы проверить, изменилось ли число в листе 38, ячейка W4656, на которую ссылается лист 5, ячейка J2. Если да, запустите макрос. Если нет, ничего не делай. Я понял, что с помощью приведенного ниже кода событие worksheet_calculate вызывается только при изменении в Листе 5, ячейке J2 или листе 38, ячейке W4656, чего я и хочу.

Private Sub Worksheet_Calculate()
Static OldVal As Variant
 If Range("w6").Value <> 24 Then
  MsgBox ("XX")
'Call Macro
End If
End Sub
0 голосов
/ 29 августа 2018

Я обновил свой код и сделал его чище, и бесстыдно украл некоторые Подход Chronocidal (мой оригинальный код требовал, чтобы рабочая тетрадь была закрыта и открыта для работы). Вот как выглядит Sheet5 в моем примере:

Sheet5

А вот и Лист38. В моем примере я просто устанавливаю формулы в Sheet38! W4656: W4657 равными Sheet5! $ J $ 2 ... поэтому, когда изменяется Sheet5! $ J $ 2, изменяется и Sheet38! W4656: W4657, который вызывает код.

Sheet38

И скопируйте этот код в ThisWorkbook ...

Option Explicit

Dim vCheck1 As Variant
Dim vCheck2 As Variant

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If vCheck1 <> Sheet38.Range("W4656") Or vCheck2 <> Sheet38.Range("W4657") Then
        MsgBox ("CHANGE DETECTED!!")
        Application.DisplayAlerts = False
        ActiveWorkbook.Save
        Application.DisplayAlerts = True
        vCheck1 = Sheet38.Range("W4656")
        vCheck2 = Sheet38.Range("W4657")
    End If
End Sub

Вот так ...

Workbook

Надеюсь, что теперь это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...