【问题标题】:excel VBA run macro automatically whenever a cell is changed每当更改单元格时,excel VBA都会自动运行宏
【发布时间】:2013-02-26 12:52:29
【问题描述】:

是否有一种简单的方法可以让 Excel 在单元格更改时自动执行宏?

有问题的单元格位于Worksheet("BigBoard").Range("D2")

我认为简单的 Google 查询被证明更加复杂 - 每个样本都涉及相交(无论是什么)或颜色格式或任何其他看似无关的事物。

【问题讨论】:

  • 使用 Peter Albert 的答案。不要害怕相交线,这只是为了让 VBA 知道您正在监视哪些单元格的变化。他有 MsgBox,这就是你调用宏的地方。这是最简单的方法。
  • 能否请您标记对您有用的答案,以便此问题不再显示为未回答?提前谢谢!

标签: excel vba


【解决方案1】:

是的,这可以通过使用工作表事件来实现:

在 Visual Basic 编辑器中,双击左上角树中的工作表名称,打开您感兴趣的工作表(即“BigBoard”)。将以下代码放入模块中:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Range("D2")) Is Nothing Then Exit Sub
        Application.EnableEvents = False 'to prevent endless loop
        On Error Goto Finalize 'to re-enable the events      
        MsgBox "You changed THE CELL!"
    End If
Finalize:        
    Application.EnableEvents = True
End Sub

【讨论】:

  • 它测试 D2 是否在单元格范围内/或单元格已更改(即 - 目标的一部分)。如果不是,则代码退出。 +1 顺便说一句
  • Insersect(rng1,rng2) 返回两个输入范围“相交”的范围。因此,如果更改的单元格与 D2 的交集没有任何内容,则说明其他内容已更改,您不希望宏继续执行。 BTW:如果它解决了您的问题,请点击复选标记将其标记为解决方案!
  • 微软官方文档support.microsoft.com/kb/213612有类似的解决方案
  • +1 告诉我在工作表中使用此代码,我将它放在一个模块中但它不起作用,只要我把它放在工作表中,它就起作用了 :)
  • @MarkRomano 你是对的 - 如果发生错误,启用事件不会被重置。我扩展了代码。
【解决方案2】:

另一种选择是

Private Sub Worksheet_Change(ByVal Target As Range)
    IF Target.Address = "$D$2" Then
        MsgBox("Cell D2 Has Changed.")
    End If
End Sub

我相信这比 Intersect 使用的资源更少,如果您的工作表发生很大变化,这将很有帮助。

【讨论】:

  • 更简单,没有我在所选答案中提到的错误。
【解决方案3】:

为了找到一种方法,使 intersect 方法的目标单元格成为名称表数组,我偶然发现了一种简单的方法,可以在特定工作表上的任何单元格或一组单元格发生更改时运行某些东西。此代码也放置在工作表模块中:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 0 Then
'mycode here
end if
end sub

【讨论】:

    【解决方案4】:

    为了发现特定列中某处的更改(此处为“W”,即“23”),我将 Peter Alberts 的回答修改为:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Target.Column = 23 Then Exit Sub
        Application.EnableEvents = False             'to prevent endless loop
        On Error GoTo Finalize                       'to re-enable the events
        MsgBox "You changed a cell in column W, row " & Target.Row
        MsgBox "You changed it to: " & Target.Value
    Finalize:
        Application.EnableEvents = True
    End Sub
    

    【讨论】:

      【解决方案5】:

      我正在创建一个表单,用户在其中输入另一个宏使用的电子邮件地址,以通过电子邮件将特定单元组发送到输入的地址。我将这个来自多个站点的简单代码和我对 VBA 的有限知识拼凑在一起。这只是监视一个单元格(在我的情况下为 K22)更新,然后终止该单元格中的任何超链接。

      Private Sub Worksheet_Change(ByVal Target As Range)
          Dim KeyCells As Range
      
          ' The variable KeyCells contains the cells that will
          ' cause an alert when they are changed.
          Set KeyCells = Range("K22")
      
          If Not Application.Intersect(KeyCells, Range(Target.Address)) _
                 Is Nothing Then
      
              Range("K22").Select
              Selection.Hyperlinks.Delete
      
          End If 
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-23
        • 2010-09-29
        • 2018-09-05
        • 2016-12-03
        相关资源
        最近更新 更多