如何在VBA中执行长时间运行的进程而无需使用PC抓取?

我有一个VBA应用程序创build一个COM对象的实例,然后不断轮询对象DataReady属性,看看是否有新的数据。 当新数据可用时,它将数据粘贴到电子表格中。 问题是这个macros(VBBA子例程)不断运行,这慢慢爬行爬行,并使计算机有点不可用,而进程正在运行。 有没有办法,我可以开始这个过程在一个单独的线程或做一个像.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 

第二次尝试definitly工作更好,但它仍然大大减缓的事情。 有更好的解决scheme吗?

我的COM对象是我在C#中编写的一个类库。 当数据准备就绪时,我可以添加在类库中触发的事件,但是如何在VBA程序中侦听这些事件?

你有没有尝试使用DoEvents?

 While(True) If(myObject.DataReady) 'your code here End If DoEvents WEnd 

我会认为最好的解决scheme是在数据准备就绪时让COM对象引发VBA事件。

如果这不是一个选项(不能控制COM对象等),那么你将必须旋转CPU。 您所能做的只是增加检查DataReady属性(在第二个选项中已经发现)之间的时间间隔。 我想知道如何增加间隔,而不会丢失function,并将其留在那里。

试试这个,看看事情是否改善。

 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)