我正在尝试编写一个在编辑工作表时自动运行的宏。 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本身不会关闭,我不得不使用任务管理器结束它。
答案 0 :(得分:4)
使用
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
答案 1 :(得分:0)
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