当单元格值更改时,宏不会自动运行

时间:2014-03-06 20:29:05

标签: excel vba excel-vba

我想通过计算 = DAYS360(B2,B1)

更新单元格 F1 中的值时运行宏
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F$1" Then
    MsgBox "You changed THE CELL!"
End If
End Sub

关于这一点有几个主题,没有一个解决方案适合我..我感到困惑。如果我手动更改单元格 F1 中的值,则宏会运行。但是,当我在日期列中添加一个新值,导致单元格 F1 中的计算更新时,没有任何反应。

其他一些主题使用交叉功能提供解决方案,但是,它们给我的结果相同。

1 个答案:

答案 0 :(得分:1)

您可以更改您的更改事件以查找F1正在查看的单元格。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$1" Or Target.Address = "$B$2" Then
    MsgBox "You changed THE CELL!"
End If
End Sub

这非常有意义,因为这些实际上是你正在改变的细胞,我从你的行中发现了这个when I add a new value in the date column that causes the calculation in cell F1 to update

另外,如果您的公式引用会发生变化,您可以使用以下代码:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
For Each r In Range("F1").Precedents
    If Target.Address = r.Address Then
        MsgBox "You changed THE CELL!"
        Exit For
    End If
Next r
End Sub

上述代码的作用是,当工作表中的任何单元格被更改时,它将转到单元格F1,然后查看被更改的单元格是否是F1依赖于其计算的单元格之一,如果它它是不是什么都没有,如果是的话,它会触发msgbox。

更新: 当单元格为单元格时,Sheet1上的单元格F1内的公式依赖于所有工作表以查看是否有任何单元格更改的另一个选项在另一页上可以找到下面。

Public Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
On Error GoTo NextStep
Dim r As Range
For Each r In Sheets("SheetF1IsOn").Range("F1").Precedents
    If Target.Address = r.Address Then
        MsgBox "You changed THE CELL!"
        Exit For
        Exit Sub
    End If
Next r

NextStep:
If InStr(Replace(Sheets("SheetF1IsOn").Range("F1").Formula, "'", ""), sh.Name + "!" + Target.Address) _
   Or InStr(Replace(Sheets("SheetF1IsOn").Range("F1").Formula, "'", ""), sh.Name + "!" + Target.Address(False)) _
   Or InStr(Replace(Sheets("SheetF1IsOn").Range("F1").Formula, "'", ""), sh.Name + "!" + Target.Address(, False)) _
   Or InStr(Replace(Sheets("SheetF1IsOn").Range("F1").Formula, "'", ""), sh.Name + "!" + Target.Address(False, False)) > 0 Then
        MsgBox "You changed THE CELL!"
End If
End Sub

如果它需要在其他工作表和当前工作表上同时工作,那么您必须在公式中添加另一个if target测试,然后查看工作簿中是否有工作表的名称和{{ 1}}

UPDATE2: 以上两点都有轻微缺陷(正如Simoco指出的那样)我能想到的最后一件事是使用公共变量来设置您的单元格的值以及每次计算工作表以测试值是否更改时。 (如果做整个列,你可能需要对一个集合或数组进行Dim测试)

因此,在您的工作表模块中,使用以下内容替换原始代码:

!

这将在工作簿打开时工作,但是当您关闭并重新打开工作簿时会出现错误,因此在Workbook模块中也添加以下代码:

Option Explicit
Public F1ValueOld As Variant

Private Sub Worksheet_Calculate()
    If Range("F1").Value <> F1ValueOld Then
        MsgBox "You changed THE CELL!"
        F1ValueOld = Range("F1").Value
    End If
End Sub

这不应该完成你的尝试。