Excel 当单元格结果按公式更改时运行宏–;但是一个不需要的宏重新触发的问题

Excel 当单元格结果按公式更改时运行宏–;但是一个不需要的宏重新触发的问题,excel,triggers,formula,Excel,Triggers,Formula,我有一个问题与另一个问题“当单元格结果按公式更改时运行宏”中提供的信息有关,我被要求创建一个新问题。我还阅读了“当单元格更改时excel VBA自动运行宏”中的答复https://stackoverflow.com/questions/38083021/excel-vba-run-macro-automatically-when-a-cell-is-changed 但我很难为我想要实现的目标找到不同的答案/片段 如果单元格C3中的公式=1,我在下面添加的代码示例将触发宏_01 如果C3中的公式给

我有一个问题与另一个问题“当单元格结果按公式更改时运行宏”中提供的信息有关,我被要求创建一个新问题。我还阅读了“当单元格更改时excel VBA自动运行宏”中的答复https://stackoverflow.com/questions/38083021/excel-vba-run-macro-automatically-when-a-cell-is-changed 但我很难为我想要实现的目标找到不同的答案/片段

如果单元格C3中的公式=1,我在下面添加的代码示例将触发宏_01

如果C3中的公式给出C3从1更改为2,则会触发宏_02

C3中的单元格公式是只有两个可能值的IF语句,即1或2

我遇到的问题是,每当工作表中的任何其他值/单元格更新(自动或手动)时,宏_01或宏_02也会重新触发(一次又一次…)——这不是我想要的

例如:如果C3中的If公式变为1(以前为2),宏_01将正确触发,但如果值1保留在单元格C3中,因为If语句未更改,并且更新或重新计算了另一个完全不相关的单元格-例如单元格E12 have=RAND()+9,然后按Enter键–然后单元格E12将更新,宏_01将再次触发–我不希望在单元格C3没有更改的情况下触发宏_01

请注意,如果您(作为测试)改为在单元格C3中手动输入值5或文本“hello”,则当工作表中的其他内容更新时,VBA代码将不会再次触发。我的假设/问题是,C3中的公式每次作为公式时都会触发

下面的示例代码将触发两个不同的宏,其中宏\u 01将在一秒钟后在单元格A3中输入文本“Hi\u 01”,然后输入“There\u 01”,或者宏\u 02将在同一单元格A3中输入“Hi\u 02”,然后输入“There\u 02”

测试设置:

打开一个空的Excel Sheet1并输入:

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

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

    c) 覆盖单元格C3中的内容,手动输入值5或“hello”=>宏_01(正确)不会被触发,宏_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 Worksheet_Calculate()
        TargetCalc Me
    End Sub
    
    此工作簿

    Option Explicit
    
    Private Sub Workbook_Open()
        TargetStart
    End Sub
    
    表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 Worksheet_Calculate()
        TargetCalc Me
    End Sub
    

    您需要测试该值是否已更改

    如果ws.Range(cTarget)TargetValue,则
    Application.EnableEvents=False
    选择案例ws.Range(cTarget.Value)
    案例1
    宏_01
    案例2
    宏_02
    结束选择
    TargetValue=ws.Range(cTarget.Value)
    Application.EnableEvents=True
    如果结束
    
    您还应该阅读我用您的答案更新了代码-现在它工作正常。非常感谢!