我是新来的佼佼者。我(通过在线搜索)设法最终创建了一个似乎有效的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
答案 0 :(得分:0)
我已经更新了代码,并使代码更整洁,并且无耻地偷了一些 Chronocidal的方法(我的原始代码要求关闭工作簿并打开工作簿)。这就是我的示例中Sheet5的外观:
这是Sheet38。在我的示例中,我只是将Sheet38!W4656:W4657中的公式设置为等于Sheet5!$ J $ 2 ...,因此,当Sheet5!$ J $ 2更改时,Sheet38!W4656:W4657也会触发代码。
并将此代码复制到 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
喜欢这个...
希望现在对您有用。
答案 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