2010-02-12 49 views
1

作爲VBA新手,我無法理解一些VBA行爲。爲什麼VBA中的任務在更早的任務完成之前得到執行?

我得到下面的代碼,它從db讀取行到activex控件中,然後嘗試將這些值放入數組中。 vxdata1 activex是專有的,沒有洞察力 - 但基本上它關心ADO連接,執行SQL命令並將結果集放入控制元素中。

//put all records from the db into the vxData1 datagrid 
vxData1.SQLCommand = "SELECT x,y,z FROM t ORDER BY z" 

//put the datagrid values into an array 
Dim Array_Werte(500) As String 
vxData1.MoveFirst 
For i = 0 To 500 Step 1 
    Array_Werte(i) = vxData1.Column1 & ";" & vxData1.Column2 & ";" & vxData1.Column3 
    vxData1.MoveNext 
Next i 

出現下列問題:數組並不總是包含所有它應該有(非常難以預測)的數據。

當我調試代碼並通過循環時,一切都像一個魅力。所以我得出結論:當我進入循環時,耗時的數據庫查詢(大型數據集)還沒有完成。

現在我想知道:這是代碼問題,還是它一般是vba或腳本語言的「特性」? 我已經看到了網絡中的東西,就像把User.wait放在那裏 - 但我永遠不知道我的查詢需要多長時間 - 這看起來很糟糕。

+0

只是猜測,你有沒有嘗試vxData1.MoveLast之前vxData1.MoveFirst填充vxData1? – Fionnuala 2010-02-12 13:03:16

+0

嗨。是的,我試過 - 相同的結果。 - 我經常看到這種做法 - 但實際上我也缺乏理解:當我執行MoveFirst時,我的recorset沒有完成 - 那麼MoveLast根本不應該工作! – 2010-02-12 13:27:26

回答

0

不知道,但這裏的幾件事情要檢查:

  • 是ActiveX組件.exe或.dll的?我似乎記得在VB6中,dll運行「進程內」,exe運行在「進程外」,即異步運行。我不確定這如何適用於VBA。
  • 你知道你的ActiveX組件是否引發一個事件來說它已經完成了它的查詢?在進入循環之前,您可以聽取該事件的觸發。
+0

嗨,謝謝。該組件是一個.ocx,並且似乎沒有任何類型的事件拋出。我認爲這可能是一些通用的腳本相關問題,因爲我聽說過類似的JavaScript問題。 – 2010-02-12 12:33:17

相關問題