Excel VBA-在Excel中手动更改单元格的旧值时,日志会更改
当表1中的单元格值发生更改时,我想在“审计”表中添加详细的日志和更改。但是,在空白单元格中输入值时,不应记录任何更改。我正在处理以下代码,但无法删除空白单元格更改日志Excel VBA-在Excel中手动更改单元格的旧值时,日志会更改,vba,excel,Vba,Excel,当表1中的单元格值发生更改时,我想在“审计”表中添加详细的日志和更改。但是,在空白单元格中输入值时,不应记录任何更改。我正在处理以下代码,但无法删除空白单元格更改日志 Option Explicit Const LiveWS As String = "Sheet1" Const AuditWS As String = "Audit" Private Sub Workbook_Open() Dim iRow As Integer Dim iCol As Integer Dim
Option Explicit
Const LiveWS As String = "Sheet1"
Const AuditWS As String = "Audit"
Private Sub Workbook_Open()
Dim iRow As Integer
Dim iCol As Integer
Dim iLastRow As Long
For iRow = 9 To 20
For iCol = 4 To 22
If Sheets(AuditWS).Cells(iRow, iCol).Value <> Sheets(LiveWS).Cells(iRow, iCol).Value Then
iLastRow = Sheets(AuditWS).Cells(Rows.Count, 1).End(xlUp).Row
Sheets(AuditWS).Cells(iLastRow + 1, 1) = "Cell(" & CStr(iRow) & "," & CStr(iCol) & ") " _
& "changed from '" & Sheets(AuditWS).Cells(iRow, iCol).Value & "' " _
& "to '" & Sheets(LiveWS).Cells(iRow, iCol).Value & "'"
Sheets(AuditWS).Cells(iRow, iCol) = Sheets(LiveWS).Cells(iRow, iCol).Value
End If
Next iCol
Next iRow
iLastRow = Sheets(AuditWS).Cells(Rows.Count, 1).End(xlUp).Row
Sheets(AuditWS).Cells(iLastRow + 1, 1) = "Workbook opened by " & Environ("USERNAME") _
& " on " & Format(Now(), "dd/mm/yyyy") & " at " & Format(Now(), "hh:nn:ss")
ActiveWorkbook.Save
End Sub
选项显式
Const LiveWS As String=“Sheet1”
Const AuditWS As String=“Audit”
私有子工作簿_Open()
Dim iRow作为整数
作为整数的Dim-iCol
暗淡的伊拉斯特罗一样长
对于iRow=9到20
对于iCol=4到22
如果工作表(AuditWS).Cells(iRow,iCol).Value Sheets(LiveWS).Cells(iRow,iCol).Value然后
iLastRow=Sheets(AuditWS).Cells(Rows.Count,1).End(xlUp).Row
表格(审计工作)。单元格(iLastRow+1,1)=“单元格(&CStr(iRow)&“,&CStr(iCol)&”)”_
&“已从”“工作表(AuditWS).Cells(iRow,iCol).Value&”“更改”_
&“到”“工作表(LiveWS).Cells(iRow,iCol).Value&”“”
工作表(AuditWS).Cells(iRow,iCol)=工作表(LiveWS).Cells(iRow,iCol).Value
如果结束
下一个iCol
下一步
iLastRow=Sheets(AuditWS).Cells(Rows.Count,1).End(xlUp).Row
工作表(AuditWS).Cells(iLastRow+1,1)=“工作簿打开人”&环境(“用户名”)_
&“on”格式(现在(),“dd/mm/yyyy”)和“at”格式(现在(),“hh:nn:ss”)
活动工作簿。保存
端接头
您可以将事件表化以跟踪更改。
在你的sheet 1后面
试试这样
Option Explicit
Public bLog As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
If bLog Then
''''' YOUR Logging code here or a call to logging routine
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
bLog = Not IsEmpty(Target.Value2)
End Sub
如果审核的(9,4)到(20,22)范围中的每个单元格的值与表1中的相应单元格的值相等,则检查每个开口。如果不是,则写入审核值、Sheet1值以及该单元格的地址。对的这就是你想做的?对空白支票行,但我认为代码需要更大的修改。如果用户1更改了内容,那么用户2会打开和关闭工作表3次,然后用户1返回并没有更改任何内容,它会将所有这些记录为“更改”,因为值仍然不同。是的,但此问题是次要的。我认为这行代码可以删除。请帮我解决空白支票问题,这是需要解决的问题!我还将添加一个公共字符串,该字符串接受当前选择的值。这样,如果有变化,你可以有一个适当的前后!同意。更改前保留旧值对于日志记录非常重要。注意:只有在一次选择一个单元格时,此操作才有效。如果您(有意或无意)选择多个单元格,例如按delete键,则…良好的观察@stenci。考虑到这一点,还可以创建所选范围的日志。将所选内容的地址放入公共字符串中,如果有更改,请注意整个范围。这样,只会显示活动单元格,但您知道整个范围实际上已更改(可能更改为相同的值…但在拖动公式的情况下可能不会)。有效点。但您需要了解excel(和vba)的容量和限制。可以使用范围撤消/重做、剪贴板、win消息作为防弹记录器。但是,在VBA中,如果需要这种广泛的特性,那么使用其他的语言是更有效和更明智的。