2010-08-09 29 views
0

我有一個VBA應用程序,它創建一個COM對象的實例,然後不斷輪詢對象DataReady屬性以查看是否有新數據。當新數據可用時,它將數據粘貼到電子表格中。問題在於這個宏(vba子例程)不斷運行,這會導致爬行速度變慢,並使進程運行時計算機有些不可用。有沒有辦法讓我可以在單獨的線程上開始這個過程,或者做一些類似於.NET的後臺工作者?如何在不使PC爬行的情況下在VBA中執行長時間運行的進程?

我的兩次嘗試都使用這樣一個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工作得更好,但它仍然大大減緩下來。有更好的解決方案嗎?

我的COM對象是我在C#中編寫的類庫。當數據準備就緒時,我可以添加在類庫中觸發的事件,但是如何在VBA程序中偵聽這些事件?

回答

2

您是否嘗試過使用DoEvents?

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

我認爲最好的解決方案是在數據準備就緒時讓COM對象引發VBA事件。

如果這不是一個選項(無法控制COM對象等),那麼你將必須旋轉CPU。您所能做的只是增加檢查DataReady屬性之間的時間間隔,您在第二個選項中已經發現該屬性。我想知道如何增加間隔而不會丟失功能並將其留在那裏。

+0

你能給我提示如何從COM對象中引發VBA事件,以及如何讓我的VBA代碼響應事件嗎? – PICyourBrain 2010-08-09 13:45:24

+0

我不得不承認,我不知道。聽起來這是一個很好的問題,但這個網站... – DonaldRay 2010-08-09 14:28:16

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) 
相關問題