Excel VBA,以防止在触发其他更改事件时触发更改事件

Excel VBA,以防止在触发其他更改事件时触发更改事件,excel,events,vba,Excel,Events,Vba,这个问题在VBA中可能无法解决,但我想看看各位专家对此有何看法 我在userform上有一个文本框,它在TextBox1_Change()类型的sub中触发一个宏 如果用户在文本框中键入“ABC”,宏将被触发3次:一次用于“A”,一次用于“AB”,一次用于“ABC”。这个宏实际上有点重,所以我希望它只在用户实际完成输入时运行,而不是在单键笔划之间运行 我知道我可以让用户“按enter键”或其他什么,然后才运行宏,但这不是我想要的。我想让他自由地打字,看到他打字的结果动态地显示出来,而不需要其他类

这个问题在VBA中可能无法解决,但我想看看各位专家对此有何看法

我在userform上有一个文本框,它在TextBox1_Change()类型的sub中触发一个宏

如果用户在文本框中键入“ABC”,宏将被触发3次:一次用于“A”,一次用于“AB”,一次用于“ABC”。这个宏实际上有点重,所以我希望它只在用户实际完成输入时运行,而不是在单键笔划之间运行

我知道我可以让用户“按enter键”或其他什么,然后才运行宏,但这不是我想要的。我想让他自由地打字,看到他打字的结果动态地显示出来,而不需要其他类型的交互

所以,我想到了让变更事件等待,看看是否在第一个变更事件发生后的1秒内触发另一个变更事件。如果发生这种情况,第一个更改事件将中止

现在这就行了,我想我会知道如何编写代码,只是我不知道如何让用户即使在第一个更改事件运行时也能保持键入

我的意思是,当第一个宏运行时,它会“冻结”所有内容。等待查看另一个更改事件触发器是否因此不起作用,因为在第一个宏运行完成之前不会触发任何内容

你们看到我的问题了吗?你会怎么做?有没有可能达到我想要的结果


非常感谢大家的帮助,谢谢大家

我测试了以下内容,它是有效的(假设我正确理解了您的意图)

在代码模块中,编写以下代码:

Public aRunIsScheduled As Boolean
Public nextRunTime As Variant

Sub MyMacro()
    'Flag macro as having been run, no longer scheduled.
    aRunIsScheduled = False

    'Place your macro code here.
    'I'll just use some dummy code:
    MsgBox "MyMacro is running!"

End Sub
在图纸模块中:

Private Sub CommandButton1_Click()

    If aRunIsScheduled Then
        ' Cancel the previously scheduled run.
        Application.OnTime EarliestTime:=nextRunTime, _
            Procedure:="MyMacro", Schedule:=False
        aRunIsScheduled = False
    End If

    ' Schedule a new run 3 seconds from now:
    nextRunTime = Now + TimeValue("00:00:03")
    Application.OnTime EarliestTime:=nextRunTime, _
            Procedure:="MyMacro", Schedule:=True
    aRunIsScheduled = True

End Sub

我在我的工作表中放了一个Commandbutton,这里我使用它的change事件,但是您可以用完全相同的方式将此代码放在
TextBox1\u change()
事件中

为什么不使用
TextBox1\u AfterUpdate
,它会在文本框失去焦点时触发?@brettdj感谢您的回复,这是一个选项,但我会将它放在“让用户按enter键或其他任何键”类别中。它需要文本框失去焦点,即用户以某种方式与工作表交互,而不是打字。我不想那样。:)通过使用更改事件,“我的文本框”看起来很像谷歌搜索栏,在这里输入一些文本,并在键入时动态显示一个可能性列表。这就是我在这里要做的。你有没有看过
DoEvents
?我可以想象一个可怕的,除了谷歌一样的黑客使用
Application.OnTime
和一个全局标志来记录
OnTime
是否已经被点燃。。。你应该问问自己:目的是否证明了手段的正当性?@creamyegg:
DoEvents
将刷新事件队列。据我所知,这与OP的要求相反。OP希望清除事件队列中除最后一个队列之外的所有内容。