Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-在Excel中手动更改单元格的旧值时,日志会更改_Vba_Excel - Fatal编程技术网

Excel VBA-在Excel中手动更改单元格的旧值时,日志会更改

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

当表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 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中,如果需要这种广泛的特性,那么使用其他的语言是更有效和更明智的。