如何修改VBA代码在Excel审计日志中添加对应行的ALERT_NAME
解决方法:在审计日志中添加对应行的ALERT_NAME
很简单,我们只需要找到修改单元格(Target)所在行对应的A列(也就是命名范围ALERT_NAME)的内容,然后把它写入日志的第一列即可。这里分两种场景来处理:
场景1:每次只修改单个单元格(符合你描述的状态变更场景)
直接获取Target所在行的A列值就行,因为ALERT_NAME就是A列的命名范围,两者完全对应。修改后的代码如下:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If ActiveSheet.Name <> "LogDetails" Then Application.EnableEvents = False ' 获取当前修改行对应的ALERT_NAME(A列)内容 Dim alertName As String alertName = Sh.Range("A" & Target.Row).Value ' 写入日志,用With语句简化重复操作 With Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) .Value = alertName .Offset(0, 1).Value = Sh.Name & "-" & Target.Address(0, 0) .Offset(0, 2).Value = Target.Value .Offset(0, 3).Value = Application.UserName .Offset(0, 4).Value = Now End With Sheets("LogDetails").Columns("A:E").AutoFit Application.EnableEvents = True End If End Sub
关键修改点:
- 新增
alertName变量存储对应行的A列内容,用Sh.Range("A" & Target.Row).Value直接获取(Sh是触发事件的工作表,比ActiveSheet更可靠) - 用
With语句简化日志写入代码,避免重复查找最后一行,提升效率
场景2:支持批量修改多行单元格
如果用户可能一次性修改多行C列的状态,上面的代码只会记录第一行的ALERT_NAME,这时我们需要循环遍历Target中的每个单元格,分别写入日志:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If ActiveSheet.Name <> "LogDetails" Then Application.EnableEvents = False Dim logSheet As Worksheet Set logSheet = Sheets("LogDetails") Dim cell As Range For Each cell In Target ' 获取当前单元格所在行的ALERT_NAME Dim alertName As String alertName = Sh.Range("A" & cell.Row).Value ' 写入单行日志 With logSheet.Range("A" & Rows.Count).End(xlUp).Offset(1, 0) .Value = alertName .Offset(0, 1).Value = Sh.Name & "-" & cell.Address(0, 0) .Offset(0, 2).Value = cell.Value .Offset(0, 3).Value = Application.UserName .Offset(0, 4).Value = Now End With Next cell logSheet.Columns("A:E").AutoFit Application.EnableEvents = True End If End Sub
额外说明:
- 用
logSheet变量缓存日志工作表对象,减少重复查找操作 - 循环
Target中的每个单元格,确保每一行的修改都能对应到自己的ALERT_NAME - 全程用
Sh替代ActiveSheet,避免切换工作表时出现错误
内容的提问来源于stack exchange,提问作者Argus1956
相关产品推荐
相关产品推荐

