Excel操作记录如何生成日志
https://blog.csdn.net/qq_29234631/article/details/88524171
Log files using VBA in Microsoft Excel:
这两天在帮一个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