在变更事件中,我需要捕获一个单元格的旧值,所以我使用了一个Application.Undo。但是,我有一个进行更改的宏,它明显地清除了撤销堆栈,但仍然依赖于其余的更改事件过程。
不能依赖选择更改事件,因为如果用户已经在单元格上,则此事件不会触发。无法使用隐藏/镜像工作表,因为我的完整应用程序基于主模板构建这些工作表。我将不得不复制的信息,为尽可能多的纸张,用户创建的主人。
接下来使用的是错误恢复程序,这是一种简单的代码。
是否有方法检查撤消堆栈或确定更改事件是由用户交互或我的宏引起的。
下面是一个展示问题的快速演示:
Sheet1代码-隐藏:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NewValue As String
Dim OldValue As String
On Error GoTo ErrorHandler
Application.EnableEvents = False
If Not Intersect(Target, Me.Range("F3")) Is Nothing Then
NewValue = Target.Value
Application.Undo
OldValue = Target.Value
Target.Value = NewValue
MsgBox "Changed from: " & OldValue & " to " & NewValue
End If
ErrorHandler:
If Err.Number > 0 Then MsgBox Err.Description
Application.EnableEvents = True
End Sub
标准模块代码:
Option Explicit
Sub MacroTest()
'clears undo stack
Sheet1.Range("F3").Value = "Macro Run"
End Sub
发布于 2020-06-20 23:02:39
跳过"NewValue = Target.Value“之后的步骤。在这些行之间添加逻辑:
NewValue = Target.Value
On Error Resume Next ' Add this line of code
Application.Undo
https://stackoverflow.com/questions/62492159
复制相似问题