2013-04-01 50 views
3

我正在撥打第三方遠程電話來獲取數據。 調用此函數後,DATAS將從細胞(1,1)填充細胞(10,1) 我的代碼是這樣的如何讓excel「等待」單元格的值改變?

application.caculation = xlmanual 
cells(1,1) = "some remotefunction" 
application.calculate 
while cells(10,1)<>"result" 

wend 
'if it goes here means we get the data 
deal_with_data 

然而,我的代碼將在while循環掛起。 那麼如何處理這個問題呢?

回答

1

當vba代碼正在運行時,我不希望任何其他單元格發生變化,除非您在循環中執行某些操作。

我會使用一個if函數,並且當你想檢查最後一個單元格時調用這個宏。我可以詳細說明你是否需要。

或者,如果您設想數據在循環運行時發生更改,則可以在循環中使用vba函數/方法。我相信,這個函數將使應用程序在這個宏運行時仍然運行和更新單元。

經過一番測試:我現在懷疑DoEvents功能將最適合你。

5

你在while循環中旋轉的當前方法不是一個好主意,因爲它消耗了所有可用資源來做...沒有。或者說,它會盡可能快地執行比較cells(10,1)<>"result"。用戶界面在此期間掛起。

總之,你發現VBA不適合異步或多線程編程。

謝天謝地,Excel爲您提供了一個內置的方法來完成這項工作,並付出了一點努力:Application.OnTime method。它可以讓你安排延遲調用方法,同時保持UI(和任何其他VBA代碼)的響應和可用性。您可以使用它來實現一種計時器。

以下是您的案例的基本方法。它每1秒檢查一次測試單元的值。如果該值沒有改變,它會自行安排在另一秒再次檢查。如果值是「結果」,它會調用另一個子代碼,您可以在代碼中處理結果。

Public Sub CallRemoteFunc() 
    Application.Calculation = xlManual 
    Cells(1, 1) = "some remotefunction" 
    Application.Calculate 
    Call WaitForUpdate 
End Sub 

Public Sub WaitForUpdate() 
    If Cells(10, 1) <> "result" Then 
     Debug.Print "Still waiting" 
     Application.OnTime Now + TimeValue("00:00:01"), WaitForUpdate 
    Else 
     Call DoStuffWithData 
    End If 
End Sub