我有一些旧的Excel VBA代码,我想在其中定期运行任务。如果我使用的是VB6,我会使用timer控件。
我找到了Application.OnTime()方法,它对于在Excel工作表中运行的代码工作得很好,但我不能让它在用户表单中工作。该方法永远不会被调用。
如何让Application.OnTime()调用用户窗体中的方法,或者是否有其他方法可以安排代码在VBA中运行?
发布于 2009-10-13 21:13:07
我找到了解决此问题的方法。如果您在一个模块中编写一个方法,该模块只调用用户表单中的一个方法,那么您可以使用Application.OnTime()来调度该模块方法。
有点杂乱无章,但除非有人有更好的建议,否则就行了。
下面是一个例子:
''//Here's the code that goes in the user form
Dim nextTriggerTime As Date
Private Sub UserForm_Initialize()
ScheduleNextTrigger
End Sub
Private Sub UserForm_Terminate()
Application.OnTime nextTriggerTime, "modUserformTimer.OnTimer", Schedule:=False
End Sub
Private Sub ScheduleNextTrigger()
nextTriggerTime = Now + TimeValue("00:00:01")
Application.OnTime nextTriggerTime, "modUserformTimer.OnTimer"
End Sub
Public Sub OnTimer()
''//... Trigger whatever task you want here
''//Then schedule it to run again
ScheduleNextTrigger
End Sub
''// Now the code in the modUserformTimer module
Public Sub OnTimer()
MyUserForm.OnTimer
End Sub发布于 2017-07-10 11:10:06
把所有的代码移到一个“定时器”模块怎么样?
Dim nextTriggerTime As Date
Dim timerActive As Boolean
Public Sub StartTimer()
If timerActive = False Then
timerActive = True
Call ScheduleNextTrigger
End If
End Sub
Public Sub StopTimer()
If timerActive = True Then
timerActive = False
Application.OnTime nextTriggerTime, "Timer.OnTimer", Schedule:=False
End If
End Sub
Private Sub ScheduleNextTrigger()
If timerActive = True Then
nextTriggerTime = Now + TimeValue("00:00:01")
Application.OnTime nextTriggerTime, "Timer.OnTimer"
End If
End Sub
Public Sub OnTimer()
Call MainForm.OnTimer
Call ScheduleNextTrigger
End Sub现在您可以从主窗体调用:
call Timer.StartTimer
call Timer.StopTimer要防止出现错误,请添加:
Private Sub UserForm_Terminate()
Call Timer.StopTimer
End Sub这将触发:
Public Sub OnTimer()
Debug.Print "Tick"
End Sub发布于 2019-10-09 06:12:02
感谢user1575005 !!
使用Module中的代码设置了一个Timer()进程:
Dim nextTriggerTime As Date
Dim timerActive As Boolean
Public Sub StartTimer()
Debug.Print Time() & ": Start"
If timerActive = False Then
timerActive = True
Call ScheduleNextTrigger
End If
End Sub
Public Sub StopTimer()
If timerActive = True Then
timerActive = False
Application.OnTime nextTriggerTime, "OnTimer", Schedule:=False
End If
Debug.Print Time() & ": End"
End Sub
Private Sub ScheduleNextTrigger()
If timerActive = True Then
nextTriggerTime = Now + TimeValue("00:00:10")
Application.OnTime nextTriggerTime, "OnTimer"
End If
End Sub
Public Sub OnTimer()
Call bus_OnTimer
Call ScheduleNextTrigger
End Sub
Public Sub bus_OnTimer()
Debug.Print Time() & ": Tick"
Call doWhateverUwant
End Sub
Private Sub doWhateverUwant()
End Subhttps://stackoverflow.com/questions/1562913
复制相似问题