Excel自动添加评论与单元格编辑历史logging

我在“工作表macros”(右击表 – 查看代码)中有以下代码。 它曾经工作,但现在它不是在我指定的范围A5:AQ155添加注释。

Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False 'If (Target.Row > 3 And Target.Row < 155) Then Cells(Target.Row, "AT") = Now() Const sRng As String = "A5:AQ155" ' change as required Dim sOld As String Dim sNew As String Dim sCmt As String Dim iLen As Long Dim bHasComment As Boolean With Target(1) If Intersect(.Cells, Range(sRng)) Is Nothing Then Exit Sub sNew = .Text sOld = .Text .Value = sNew Application.EnableEvents = True sCmt = "Edit: " & Format$(Now, "dd Mmm YYYY hh:nn:ss") & " by " & Application.UserName & Chr(10) & "Previous Text :- " & sOld If Target(1).Comment Is Nothing Then .AddComment Else iLen = Len(.Comment.Shape.TextFrame.Characters.Text) End If With .Comment.Shape.TextFrame .AutoSize = True .Characters(Start:=iLen + 1).Insert IIf(iLen, vbLf, "") & sCmt End With End With End Sub 

我做错了什么?

该代码停止发射,因为事件激发被禁用,从来没有打开。 编写代码的方式,只要有人对A5:AQ155范围以外的工作表进行了更改,事件就会被禁用而不被重新打开,这意味着后续的事件触发器将不会被触发(即: – 下一次你编辑一个单元格)。

如果你在代码中做了这些细微的调整,它应该按照预期进行。

但是,在执行此操作之前,请在即时窗口中键入Application.EnableEvents = True ,然后按Enter键以重新打开事件,以便代码再次启动。

 Private Sub Worksheet_Change(ByVal Target As Range) Const sRng As String = "A5:AQ155" ' change as required Dim sOld As String Dim sNew As String Dim sCmt As String Dim iLen As Long If Not Intersect(Target, Me.Range(sRng)) Is Nothing Then Application.EnableEvents = False With Target sNew = .Value2 Application.Undo sOld = .Value2 .Value2 = sNew Application.EnableEvents = True sCmt = "Edit: " & Format$(Now, "dd Mmm YYYY hh:nn:ss") & " by " & Application.UserName & Chr(10) & "Previous Text :- " & sOld If .Comment Is Nothing Then .AddComment Else iLen = Len(.Comment.Shape.TextFrame.Characters.Text) End If With .Comment.Shape.TextFrame .AutoSize = True .Characters(Start:=iLen + 1).Insert IIf(iLen, vbLf, "") & sCmt End With End With End If End Sub 

这是最终的代码,让我所需的行为。 我根据@Scott Holtzman的评论改变了第一个IF声明。 IF语句现在重置Application.EnableEvents = True然后用End Sub结束macros

编辑:包括“我”。 在“Me.range(sRng)”

 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False 'If (Target.Row > 3 And Target.Row < 155) Then Cells(Target.Row, "AT") = Now() Const sRng As String = "A5:AQ155" ' change as required Dim sOld As String Dim sNew As String Dim sCmt As String Dim iLen As Long Dim bHasComment As Boolean With Target(1) If Intersect(.Cells, Me.Range(sRng)) Is Nothing Then Application.EnableEvents = True Exit Sub End If sNew = .Text sOld = .Text .Value = sNew Application.EnableEvents = True sCmt = "Edit: " & Format$(Now, "dd Mmm YYYY hh:nn:ss") & " by " & Application.UserName & Chr(10) & "Previous Text :- " & sOld If Target(1).Comment Is Nothing Then .AddComment Else iLen = Len(.Comment.Shape.TextFrame.Characters.Text) End If With .Comment.Shape.TextFrame .AutoSize = True .Characters(Start:=iLen + 1).Insert IIf(iLen, vbLf, "") & sCmt End With End With End Sub Sub Hide_Comments_in_Workbook_Completely() 'This macro hides the comments and comment indicators - users wont know there is a comment within the excel workbook Application.DisplayCommentIndicator = xlNoIndicator End Sub