2010-02-12 14 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

相关问题