这个可能无法在VBA中解决,但我想看看你的专家对此有什么看法。
我在userform上有一个文本框,可以在TextBox1_Change()类型的sub中触发宏。
如果用户在文本框中键入“ABC”,宏将被触发3次:一次用于“A”,一次用于“AB”,一次用于“ABC”。这个宏实际上很重,所以我希望它只在用户实际输入时运行,而不是在单键击之间运行。
我知道我可以让用户“按回车”或其他任何东西然后运行宏,但这不是我想要的。我希望他自由打字并看到他的打字结果动态显示,不需要其他类型的交互。
所以,我提出了让更改事件等待的想法,看看是否有另一个更改事件在第一个事件的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()
事件中,而不是完全相同。