如何在不进行PC爬行的情况下在VBA中执行长时间运行的进程?

时间:2010-08-09 13:25:21

标签: excel vba long-running-processes

我有一个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程序中监听这些事件?

3 个答案:

答案 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)