【问题标题】:Excel VBA - Run a macro when a cell is changedExcel VBA - 更改单元格时运行宏
【发布时间】:2013-10-02 20:22:45
【问题描述】:

我正在尝试编写一个在编辑工作表时自动运行的宏。 H 列的标题为“已更新”,宏应将今天的日期放在单元格 H# 中,其中 # 是已更改单元格的行。这是我使用的代码:

Private Sub Worksheet_Change(ByVal Target As Range)

Target.Select
Range("H" & ActiveCell.Row).Select
ActiveCell.Value = Date

End Sub

保存工作簿并更改单元格 A2 的值后,代码按我的预期将今天的日期放入 H2,但随后给了我一个错误。我点击调试,Target.Select 行被突出显示。我认为循环是问题所在,所以我更新了代码:

Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False
Target.Select
Range("H" & ActiveCell.Row).Select
ActiveCell.Value = Date
Application.EnableEvents = True

End Sub

这一次,我更改了单元格 B3 的值,并将今天的日期放入 B4。然后 Excel 部分冻结:我仍然可以编辑该工作簿,但我无法打开或查看任何其他工作簿。我关闭了所有工作簿,但 Excel 本身不会关闭,我不得不使用任务管理器来结束它。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    使用

    Private Sub Worksheet_Change(ByVal Target As Range)
        Range("H" & Target.Row).Value = Date
    End Sub
    

    会给你更好的稳定性。 Target 是更改的范围。

    更改值可能会重新触发 Worksheet_Change 事件(我在家所以无法检查)。如果是这样,则使用

    阻止递归
    Private Sub Worksheet_Change(ByVal Target As Range)
       If Target.Address <> Range("H" & Target.Row).Address Then        
           Range("H" & Target.Row).Value = Date
       End If
    End Sub
    

    【讨论】:

      【解决方案2】:
      Private Sub Worksheet_Change(ByVal Target As Range)
          const DATE_COL as long = 8
          Dim c as range
      
          Set c = Target.Cells(1)
          If c.Column = DATE_COL Then Exit Sub
          On Error Goto haveError
          Application.EnableEvents=False
          Me.Cells(c.Row, DATE_COL).Value = Date
      
      haveError:
          Application.EnableEvents=True
      
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-01
        相关资源
        最近更新 更多