我有一个VBA应用程序,它创建一个COM对象的实例,然后不断轮询对象 DataReady 属性以查看是否有新数据。当有新数据可用时,它会将数据粘贴到电子表格中。问题是这个宏(vba子例程)不断运行,这会减慢excel到爬行,并使进程运行时计算机有些无法使用。有没有办法可以在一个单独的线程上启动此过程或执行类似.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程序中监听这些事件?
答案 0 :(得分:2)
您是否尝试过使用DoEvents?
While(True)
If(myObject.DataReady)
'your code here
End If
DoEvents
WEnd
答案 1 :(得分:0)
我认为最好的解决方案是在数据就绪时让COM对象引发VBA事件。
如果这不是一个选项(无法控制COM对象等),那么你将必须旋转CPU。您所能做的就是增加检查DataReady属性(在第二个选项中已发现)之间的时间间隔。我会弄清楚你可以增加间隔而不会丢失功能,然后将它留在那里。
答案 2 :(得分:0)
试试这个,看看情况是否有所改善。
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)