1

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

4

3 回答 3

2

您是否尝试过使用 DoEvents?

While(True)
    If(myObject.DataReady)
        'your code here
    End If
    DoEvents
WEnd
于 2010-09-09T15:47:37.287 回答
0

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

如果这不是一个选项(无法控制 COM 对象等),那么您将不得不旋转 CPU。您所能做的就是增加检查 DataReady 属性之间的时间间隔,您已经在第二个选项中发现了该属性。我会弄清楚你可以在不失去功能的情况下增加间隔有多胖,然后把它留在那里。

于 2010-08-09T13:38:18.850 回答
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)
于 2010-08-18T00:32:54.127 回答