Excel 当单元格结果按公式更改时运行宏

Excel 当单元格结果按公式更改时运行宏,excel,vba,Excel,Vba,我需要的:一个要触发的宏,让我们调用宏“MacroRuns”,每当单元格C3返回一个与当前不同的值时,根据其公式,而不是手动键入不同的值 我花了一整天的时间在谷歌搜索的前两页上通读并尝试每一个“解决方案”。到目前为止,对我来说似乎什么都不管用。请帮忙!!!我将非常感激 示例: 我现在已经试过了,但它在运行了几次后会损坏我的文件 Private Sub Worksheet_Calculate() If Range("E3") <> Range("C3").Value Then

我需要的:一个要触发的宏,让我们调用宏“MacroRuns”,每当单元格C3返回一个与当前不同的值时,根据其公式,而不是手动键入不同的值

我花了一整天的时间在谷歌搜索的前两页上通读并尝试每一个“解决方案”。到目前为止,对我来说似乎什么都不管用。请帮忙!!!我将非常感激

示例:

我现在已经试过了,但它在运行了几次后会损坏我的文件

Private Sub Worksheet_Calculate()
    If Range("E3") <> Range("C3").Value Then
        Range("E3") = Range("B3").Value
        MsgBox "Successful"
    End If
End Sub
Private子工作表_Calculate()
如果范围(“E3”)范围(“C3”)。那么
范围(“E3”)=范围(“B3”).值
MsgBox“成功”
如果结束
端接头
模块1,第1页(计算),此工作簿(打开) 集锦
  • 当工作簿打开时,
    C3
    中的值将被读取到公共文件中 变量
    TargetValue
    通过
    TargetStart
  • 当计算
    C3
    中的值时,
    TargetCalc
    被激活 通过计算事件。如果
    C3
    中的当前值不同于
    TargetValue
    ,则触发
    宏运行
    ,并使用
    C3
    中的值更新
    TargetValue
代码 模块1

Option Explicit

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

Sub TargetCalc(ws as Worksheet)
    If ws.Range(cTarget) <> TargetValue Then
        MacroRuns
        TargetValue = ws.Range(cTarget).Value
    End If
End Sub

Sub TargetStart()
    TargetValue = Sheet1.Range(cTarget).Value
End Sub

Sub MacroRuns()
    MsgBox "MacroRuns"
End Sub
Option Explicit

Private Sub Worksheet_Calculate()
    TargetCalc Me
End Sub
表1

Option Explicit

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

Sub TargetCalc(ws as Worksheet)
    If ws.Range(cTarget) <> TargetValue Then
        MacroRuns
        TargetValue = ws.Range(cTarget).Value
    End If
End Sub

Sub TargetStart()
    TargetValue = Sheet1.Range(cTarget).Value
End Sub

Sub MacroRuns()
    MsgBox "MacroRuns"
End Sub
Option Explicit

Private Sub Worksheet_Calculate()
    TargetCalc Me
End Sub

如果我理解您的问题,您可以尝试以下代码:

1) 在“图纸”选项卡上单击鼠标右键,然后单击“查看代码”

  • 复制此代码:

    私有子工作表_更改(ByVal目标作为范围)

    尺寸值1作为变量 静态值2作为变量

    值1=范围(“C3”)。值

    如果值1值2,则 MsgBox“单元格已更改。” 如果结束

    值2=范围(“C3”)。值

    端接头

  • 我试过这个:

    在单元格C3中,我已写入=和(A1:B1) 当我尝试更改此单元格中的值时,C3也会更改,我会得到msgBox

    希望这有帮助

    编辑代码以回答@MD Ismail Hosen

    如果我了解您的问题,您可以尝试以下示例代码:

    Private Sub Worksheet_Change(ByVal Target As Range)
    
    'in this code i have used two range on the same row, but you can change as 
    'you want. 
    'In my case, the range that i check is Range("A1:C1") and the RANGE that i 'save old value is 
    'RANGE("F1:H1") F1 is the sixth column.
    
    Dim counter As Byte
    Dim sizeRange As Byte
    
    sizeRange = 3 ' my size range
    
    For counter = 1 To sizeRange
        'on the left i check Range("A1:C1").On the right i check The Range("F1:H1")
        If Cells(1, counter) <> Cells(1, counter + 5) Then 'counter start from 1 
            MsgBox "Range Changed"
            Range("A1:C1").Copy Destination:=Range("F1:H1") ' use other code to copy the range
            Exit For
        End If
    Next counter
    End Sub
    

    希望这有帮助。

    对。我在这里要补充一点,这让我在尝试费迪南多的代码时感到非常沮丧(它本身非常简洁,谢谢你,费迪南多!!)

    主要的一点是-如果您要使用的不仅仅是一个messagebox(MsgBox“Cell has change.”),那么您需要在这一行的上方和下方添加以下行(否则Excel将因为无休止地尝试这样做而不断崩溃)。别问我为什么,我终于用这个解决了我的问题。下面是几行:

    If Value1 <> Value2 Then
    (ADD THIS:)     Application.EnableEvents = False
                    MsgBox "Cell has changed."
    (I call a macro running a query from MySQL instead of MsgBox)
    (AND ADD THIS:) Application.EnableEvents = True
    
    如果值1值2,则
    (添加此:)Application.EnableEvents=False
    MsgBox“单元格已更改。”
    (我调用从MySQL而不是从MsgBox运行查询的宏)
    (并添加以下内容:)Application.EnableEvents=True
    

    希望这能帮助我所处的处境中的任何人

    您可以使用工作表\u Calculate Event,但每当我使用工作表\u Calculate的解决方案时,每次访问相同或不同工作表的单元格并按enter键时,都会运行我的代码。我在其他帖子中看到,由于我在工作簿中使用了一个间接公式,它会导致工作表_Calculate以这种方式运行。是的,您需要将值保存在某个位置,并对照旧值检查新值,如果不同,则运行代码并更新保存值的单元格,为下一次测试做准备。我读过几种类似的解决方案,所以我同意,但由于某些原因,我无法让它们中的任何一种起作用。你有我可以尝试的代码示例吗?当我复制粘贴他们的解决方案并进行更改以满足我的需要时,可能我遗漏了一些东西。如果我放置一些测试代码,它可能会与您复制、粘贴和更改的代码有相同的问题。在这个网站上,提出问题的人展示了他们的代码并解释了收到的错误,而不是相反。非常感谢您抽出时间!我现在就来试试。我需要它记住的“C3”在一张名为“CALC_CompStatus”的隐藏表上。如何将其添加到您上面提供的代码中?@soundship:我不知道您在问什么。cTarget是包含“C3”的字符串,它不是范围。TargetCalc用于任何需要的工作表(不知道隐藏),TargetStart用于工作表1。因此,您必须调整Sheet1并将Sheet1的代码设置为实际的工作表代码。@VBASIC208
    Range(cTarget)
    将引用活动工作表,而不是调用它的工作表。您可能希望将工作表传递到sub:
    sub-TargetCalc(ws-as-worksheet)
    中,然后可以将范围对象附加到正确的父对象:
    ws.range(cTarget)
    ,您可以将其称为
    TargetCalc me
    谢谢@ScottCraner,它可以从另一张纸上完美地工作,即使带有C3的纸是隐藏的。非常感谢。非常感谢@Ferdinando!这是为了我。到目前为止,我还没有遇到任何问题,这正是我所希望的。这并不能回答问题。他所说的是当公式的结果发生变化时,而不是一个会触发这个程序的变化。例如用户手动更改单元格值。亲爱的加里·卡莱尔·库克,我认为我的答案是好的,因为在soundhip的帖子中他说这是有效的……不?费迪南多如果有一个范围(B10:B64)……它会有效吗……是的,@MD伊斯梅尔·霍森,试试看。在单元格C3中,您放置了这个新范围(B10:B64)。