如果另一个更改事件触发,VBA可防止触发更改事件

时间:2012-03-28 10:26:04

标签: excel events vba

这个可能无法在VBA中解决,但我想看看你的专家对此有什么看法。

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

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

我知道我可以让用户“按回车”或其他任何东西然后运行宏,但这不是我想要的。我希望他自由打字并看到他的打字结果动态显示,不需要其他类型的交互。

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

现在这会起作用,我想我会知道如何编码,除非我不知道如何让用户有权在第一次更改事件运行时继续输入。

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

你们在这里看到我的问题吗?你会怎么做?我有机会达到我想要的结果吗?

非常感谢任何帮助,谢谢你们!

1 个答案:

答案 0 :(得分:4)

我测试了以下内容,并且它有效(假设我正确地理解了您要做的事情)。

在代码模块中,写下:

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,在这里我正在使用它的更改事件,但您可以将此代码放在TextBox1_Change()事件中,而不是完全相同。

相关问题