首页 > 解决方案 > Worksheet_Change:由用户或宏触发

问题描述

在我的更改事件中,我需要捕获单元格的旧值,因此我使用了 Application.Undo。但是,我有一个进行更改的宏,它显然会清除撤消堆栈,但仍然依赖于更改事件过程的其余部分。

不能依赖选择更改事件,因为如果用户已经在单元格上,则不会触发此事件。无法使用隐藏/镜像表,因为我的完整应用程序基于主模板构建这些表。我必须复制用户从 Master 创建的尽可能多的工作表的信息。

并且使用 On Error Resume Next 是 kludgy 代码。

有没有办法检查撤消堆栈或确定更改事件是由用户交互还是我的宏引起的。

这是一个显示问题的快速演示:

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

标签: excelvba

解决方案


跳过“NewValue = Target.Value”之后的步骤。在这些行之间添加逻辑:

    NewValue = Target.Value
    On Error Resume Next ' Add this line of code
    Application.Undo

推荐阅读