受欢迎的博客标签

利用Excel VBA代码编写日志,查看表格操作修改记录。

Published

Excel操作记录如何生成日志

https://blog.csdn.net/qq_29234631/article/details/88524171

Log files using VBA in Microsoft Excel:

https://www.exceltip.com/files-workbook-and-worksheets-in-vba/log-files-using-vba-in-microsoft-excel.html

这两天在帮一个ExcelHome论坛的朋友解决问题时,用到了Workbook_SheetChange事件。经过这次的练习,获得了对Workbook_SheetChange事件的一些了解,自己感觉收获颇丰。他的需求是用工作表中固定单元格中的日期来自动命名工作表。我有解决方法是这样的:

 

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Address = "$G$1" Then
       If Target.Value <> "" Then
           Sh.Name = Target.Text
       Else
           Sh.Name = Sh.CodeName
       End If
    End If
End Sub


可能有人会问了:为什么不用Worksheet_Change事件?这是由他的需求决定的。因为他希望这个功能对工作簿中的所有工作表都有效,包括以后新增的工作表。而Worksheet_Change事件只能针对当前工作表。因此,只能选用Workbook_SheetChange事件。

另外,还要注意这个事件的两个参数,一个是Sh,一个是Target,前面表示发生Change事件的工作表,后者表示发生改变的单元格。前者可以用来限制事件只对某个或某几个特定工作表的Change事件进行响应,这可以通过对工作表的名称(即Sh.Name)进行分析实现,后者则可以用来限制事件只对某个或某个区域的单元格进行响应,这可以通过对单元格的地址(Target.Address)进行分析实现。在对单元格地址进行分析时,还可对行号和列标分别进行分析。这可以借助Split函数实现,Split(Target.Address,"$")(1)就表示单元格的列标,Split(Target.Address,"$")(2)则表示行号。例如,要求事件只对A1:A100区域的单元格进行响应,则可以这样进行分析:

Split(Target.Address,"$")(1) = "A" And Split(Target.Address,"$")(2) <101

 

整个工作簿,则为工作簿的事件,第一行为:Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

你运行的宏如果对[A1:U50]区间单元格数据有更改,就会形成循环事件,所以在调用此类代码之前先要停止事件响应,结束时开启事件响应,这样就只执行一次代码。

Private Sub Worksheet_Change(ByVal Target As Range)
   If Application.Intersect([A1:U50], Target) Is Nothing Then Exit Sub
   Application.EnableEvents = False
   Call Macros1
   Application.EnableEvents = True
End Sub