每当在工作簿中的任何地方输入数据时,都会触发worksheet_calculate事件

时间:2018-08-29 08:44:57

标签: excel-vba excel-formula

我是新来的佼佼者。我(通过在线搜索)设法最终创建了一个似乎有效的worksheet_calculate事件宏。每当单元格W4656:W4657中的值更改时,宏将返回一个消息框(CHANGE DETECTED!)。这些值是从同一工作簿的另一张表中引用的。 我的问题是,每当在工作簿中的任何地方输入数据时,都会触发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 :(得分:0)

我已经更新了代码,并使代码更整洁,并且无耻地偷了一些 Chronocidal的方法(我的原始代码要求关闭工作簿并打开工作簿)。这就是我的示例中Sheet5的外观:

Sheet5

这是Sheet38。在我的示例中,我只是将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

希望现在对您有用。

答案 1 :(得分:0)

好吧,如果我们检查您的代码的这些行

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

这将永远是正确的。因此,每次工作表计算时,都会显示“ CHANGE DETECTED!”

理想情况下,您希望将值存储在这些单元格中的某个位置,然后仅在单元格和存储的值之间进行比较。使用工作表变量,您可以获得以下信息:(您还可以将值存储在隐藏的工作表中作为替代方法)

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

答案 2 :(得分:0)

因此,我设法找到了解决问题的方法(解决方法?)。 我最后使用宏检查表38(单元格J2)中引用的表38,单元格W4656中的数字是否已更改。如果是,则触发宏。如果没有,则什么也不做。 我已经意识到,使用下面的代码,只有在工作表5,单元格J2或工作表38,单元格W4656中发生更改时才触发worksheet_calculate事件。

Private Sub Worksheet_Calculate()
Static OldVal As Variant
 If Range("w6").Value <> 24 Then
  MsgBox ("XX")
'Call Macro
End If
End Sub