如何在VBA中执行长时间运行的进程而无需使用PC抓取?
我有一个创建COM对象实例的VBA应用程序,然后不断轮询对象DataReady属性以查看是否有新数据。 当新数据可用时,它将数据粘贴到电子表格中。 问题在于这个宏(vba子例程)不断运行,这会导致爬行速度变慢,并使进程运行时计算机有些不可用。 有没有办法让我可以在单独的线程上开始这个过程,或者做一些类似于.NET的后台工作者?
我的两个尝试是使用这样的while循环..
While(True)
If(myObject.DataReady)
Do some stuff here
End If
WEnd
然后这个
Sub GrabNewPoint()
If (myModule.NewDataReady_Receiver = True) Then
Do some stuff here...
End If
If (StopTest = False) Then
NextTime = Now() + TimeValue("00:00:20")
Application.OnTime NextTime, "GrabNewPoint"
End If
第二次尝试肯定会更好,但它仍然会大大减慢速度。 有更好的解决方案吗?
我的COM对象是我在C#中编写的一个类库。 当数据准备就绪时,我可以添加在类库中触发的事件,但是如何在VBA程序中侦听这些事件?
你有没有尝试过使用DoEvents?
While(True)
If(myObject.DataReady)
'your code here
End If
DoEvents
WEnd
我认为最好的解决方案是在数据准备就绪时让COM对象引发VBA事件。
如果这不是一个选项(不能控制COM对象等),那么你将需要旋转CPU。 您所能做的只是增加检查DataReady属性之间的时间间隔,您在第二个选项中已经发现该属性。 我想知道如何增加间隔而不会丢失功能并将其留在那里。
试试这个,看看事情是否改善。
Just pause, let the CPU fly... key is to trap it here so it releases as long as you like
Public Sub App_Hard_Wait_DoEvents(dblSeconds As Double)
If dblSeconds = 0 Then Exit Sub
Dim varStart As Variant
varStart = Timer
Do While Timer < (varStart + dblSeconds)
DoEvents
Loop
End Sub
DO
Call App_Hard_Wair_DoEvents(10)
loop until (myObject.DataReady)
链接地址: http://www.djcxy.com/p/37991.html
上一篇: How can I execute a long running process in VBA without making pc crawl?
下一篇: Sending formatted Lotus Notes rich text email from Excel VBA