【发布时间】:2019-04-23 20:25:14
【问题描述】:
我创建了一个日志历史工作表并保存其他工作表的更改详细信息。
Dim oldValue As Variant
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim sSheetName As String
sSheetName = "Data"
If ActiveSheet.Name <> "LogDetails" Then
Application.EnableEvents = False
Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = ActiveSheet.Name & "-" & Target.Address(0, 0)
Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 1).Value = oldValue
Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 2).Value = Target.Formula
Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 3).Value = Environ("username")
Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 4).Value = Now
Sheets("LogDetails").Columns("A:D").AutoFit
Application.EnableEvents = True
End If
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
oldValue = Target.Formula
End Sub
这适用于单个单元格,例如:
如果 A1 存储“ABC”并更改为“123”,Log Detail 将保存 Cell 地址、旧值、新值、用户名和日期/时间。
最大的问题是当我选择一整列时,例如所有列(B)。会报错
“类型不匹配”。
我知道问题出在
oldValue = Target.Value
如何保存对列的更改?
【问题讨论】:
-
你想要发生什么?我不太明白“它也可以保存列的更改”。是否要记录选择更改?用户不容易修改多个单元格,除了复制+粘贴。 The issue with
oldValue = Target.Valueis that when multiple cells are selected,Target.Valuewill return an array, which you can't store in a simple string variable.因此类型不匹配。所以你需要决定在多单元格选择的情况下你到底想要发生什么?也许强制选择仅第一个单元格? -
还要考虑同时记录多个更改的含义:是否应该单独记录列的所有单元格中的更改(因此 1048576 更改)?您的日志表将立即填满。还是您想以某种方式将这些更改压缩到更少的行中? (怎么会?)
-
抱歉回复晚了,我想做的是,例如,如果我改变范围(“A1”)公式:=C1+D1,然后选择一个范围,如 A1-A20然后 Ctrl+D 将公式替换为整个选择。在我看来,记录应该显示 2 记录。第一个是我替换 A1 范围内的公式第二个是我替换 A2-A20 范围内的公式,但我不知道如何显示它....
-
我第一次做这个 vba 是我希望列的所有单元格中的更改将被自己记录,我知道这将立即被填满。但我的工作簿文件有时会获得更多 2000 条记录。这将是一个漫长而漫长的过程,所以如果可能的话,将在其中显示 2 条记录。
-
还有一个问题是,当我更改单元格的公式并记录它时。 logdetail 只显示值的变化,而不是公式的变化。(我希望它在目标中显示 =A1+B1 。值,类似的东西)。可以改变显示格式吗?