Excel VBA – 更改单元格时运行macros

我正在尝试编写一个在编辑工作表时自动运行的macros。 H列的标题为“Updated on”,macros应将当天的date放在H#单元格中,其中#是被更改的单元格的行。 这是我使用的代码:

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

在保存工作簿并更改单元格A2的值后,代码将今天的date按照我的预期放入H2,但是后来给我一个错误。 我点击debugging, 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的值,并把今天的date写入B4。 然后,Excel部分冻结:我仍然可以编辑该工作簿,但无法打开或查看任何其他工作簿。 我closures了所有的工作簿,但Excel本身不会closures,我不得不使用任务pipe理器来结束它。

运用

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

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

这是可能的(我在家里所以不能检查),改变值重新触发Worksheet_Change事件。 如果是这样,那么阻塞recursion

 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 
 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