运行 单元格结果按公式更改时的宏 - 但不需要的宏重新触发的问题

Run Macro when cell result changes by formula – but a problem with unwanted macro re-trigger

我有一个问题与另一个问题“运行 单元格结果按公式更改时的宏” 中提供的信息有关,我被要求创建一个新问题。我还阅读了“excel VBA 运行 自动更改单元格时的宏“ 中的回复,但我很难获得不同的 answers/pieces 一起完成我想要实现的目标。

如果单元格 C3 中的公式=1

,我在下面添加的代码示例将触发 Macro_01

如果 C3 中的公式改为将 C3 从 1 更改为 2,则将改为触发 Macro_02。

C3中的Cell公式是一个IF语句,只有两个possible值,1或2

我遇到的问题是 Macro_01 或 Macro_02 每次 Sheet 中的任何其他 values/cells 也会被重新触发(一次又一次......)已更新(自动或手动)——这不是我想要的。

例如:如果 C3 中的 IF 公式变为 1(之前为 2)– Macro_01 将正确触发,但如果值 1 保留在单元格 C3 中,因为 IF 语句未更改,并且另一个完全不相关的单元格被更新或重新计算 - 例如单元格 E12 有 =RAND()+9 然后你点击 Enter - 然后单元格 E12 将更新,并且 Macro_01 将再次被触发 - 我不想要Macro_01 在 C3 单元格没有变化的情况下被触发。

请注意,如果您(作为测试)在单元格 C3 中手动输入例如值 5 或文本“hello”,那么当输入其他内容时 VBA 代码将不会再次触发Sheet是updated.My assumption/question是和C3里面的公式每次都是公式触发有关系

下面的示例代码将触发两个不同的 Macros,其中 Macro_01 将输入文本“Hi_01”,然后在一秒后输入“There_01”单元格 A3,或 Macro_02 将在同一单元格 A3

中输入“Hi_02”,然后输入“There_02”

测试设置:

打开一个空的Excel Sheet1然后输入:

  1. 在单元格 C3 中,输入:=IF(D3<100,1,2)
  2. 在单元格 D3 中,输入:105
  3. 在单元格 E12 中,输入:=RAND()+9

单元格 C3 将显示 2,因为 105 大于 100

要突出problem/question:

a) 在单元格 D3 中,改为输入值 89 => 单元格 C3 将更改为 1,因为 89 os 低于 100,给定 IF 语句 => Macro_01 将是正确的已触发 => 单元格 A3 将首先显示“Hi_1”,然后在一秒钟后显示“There_1”。这一切都很好!

b) 然后,标记单元格 E12 并按 Enter => E12 将被重新计算 => 但是 Macro_02 也将(错误地)被触发(C3 仍然设置为 1,因为 89 是低于 100) => A3 单元格将首先显示“Hi_2”,然后在一秒钟后显示“There_2”。在 E12 中再次按 Enter,Marcro_02 再次被错误触发。这不好!

c) 覆盖单元格 C3 中的内容并手动输入值 5 或仅输入“hello”=> Macro_01 将(正确地)不会被触发,而 Macro_02 则不会再次要么。这只是一个假设性的例子来说明错误与它是一个被错误触发的公式有关。

代码

模块 1

Option Explicit

Public TargetValue As Variant
Private Const cTarget As String = "C3"

Sub TargetCalc(ws As Worksheet)
    If ws.Range(cTarget) = 1 Then
        Application.EnableEvents = False
        Macro_01
        TargetValue = ws.Range(cTarget).Value
        Application.EnableEvents = True
        
        ElseIf ws.Range(cTarget) = 2 Then
        Application.EnableEvents = False
        Macro_02
        TargetValue = ws.Range(cTarget).Value
        Application.EnableEvents = True
End If
End Sub

Sub TargetStart()
    TargetValue = Sheet1.Range(cTarget).Value
End Sub
Sub Macro_01()
'
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "Hi_01"
    Application.Wait Now + TimeValue("0:00:01")
    ActiveCell.FormulaR1C1 = "There_01"
End Sub
Sub Macro_02()
'
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "Hi_02"
    Application.Wait Now + TimeValue("0:00:01")
    ActiveCell.FormulaR1C1 = "There_02"
End Sub

本工作簿

Option Explicit

Private Sub Workbook_Open()
    TargetStart
End Sub

Sheet1

Option Explicit

Private Sub Worksheet_Calculate()
    TargetCalc Me
End Sub

您需要测试值是否改变

If ws.Range(cTarget) <>  TargetValue Then
    Application.EnableEvents = False
    Select Case ws.Range(cTarget).Value
        Case 1
            Macro_01
        Case 2
            Macro_02
    End Select
    TargetValue = ws.Range(cTarget).Value
    Application.EnableEvents = True
End If