gpt4 book ai didi

Excel 检测并跟踪任何工作表中的(值)变化

转载 作者:行者123 更新时间:2023-12-04 22:01:05 31 4
gpt4 key购买 nike

我已经设法编写了一个代码来检测任何工作表中特定单元格的值变化,但我一直在努力构建检测和跟踪范围(值)变化的东西。

例如,如果用户决定复制和粘贴某个范围的数据(假设超过 1 个单元格),它不会被宏捕获。用户选择范围然后在仍然选择范围时手动将值输入每个单元格时也是如此。

我当前的代码由 2 个宏构成,第一个在工作表选择发生更改时运行,它将 target.value 存储到以前的值变量中。第二个宏在工作表发生更改时运行,它测试目标值是否与前一个值不同,如果是,则通知用户已发生的更改。

最佳答案

好的,我在这里看不到任何涵盖整个事情的东西,所以这是一个粗略的尝试。

它将处理单个或多个单元格更新(最多可以设置一些限制,超出您不想去的范围......)

它不会处理多区域(非连续)范围更新,但可以扩展为这样做。

您可能还应该添加一些错误处理。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Where As String, OldValue As Variant, NewValue As Variant
Dim r As Long, c As Long

Dim rngTrack As Range

Application.EnableEvents = False
Where = Target.Address
NewValue = Target.Value
Application.Undo
OldValue = Target.Value 'get the previous values
Target.Value = NewValue
Application.EnableEvents = True

Set rngTrack = Sheets("Tracking").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

'multi-cell ranges are different from single-cell ranges
If Target.Cells.CountLarge > 1 And Target.Cells.CountLarge < 1000 Then
'multi-cell: treat as arrays
For r = 1 To UBound(OldValue, 1)
For c = 1 To UBound(OldValue, 2)
If OldValue(r, c) <> NewValue(r, c) Then
rngTrack.Resize(1, 3).Value = _
Array(Target.Cells(r, c).Address, OldValue(r, c), NewValue(r, c))
Set rngTrack = rngTrack.Offset(1, 0)
End If
Next c
Next r
Else
'single-cell: not an array
If OldValue <> NewValue Then
rngTrack.Resize(1, 3).Value = _
Array(Target.Cells(r, c).Address, OldValue, NewValue)
Set rngTrack = rngTrack.Offset(1, 0)
End If
End If

End Sub

获取先前值的“撤消”部分来自 Gary's Student's answer here:
Using VBA how do I detect when any value in a worksheet changes?

关于Excel 检测并跟踪任何工作表中的(值)变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35018093/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com