2013-10-02 62 views
2

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

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本身不会关闭,我不得不使用任务管理器来结束它。

回答

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 
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 
相关问题