【问题标题】:Why does a task in VBA get executed before an earlier one has finished?为什么 VBA 中的任务会在前一个任务完成之前执行?
【发布时间】:2011-01-16 02:45:41
【问题描述】:

作为 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 放在那里 - 但我永远不知道我的查询需要多长时间 - 这似乎是一种非常糟糕的风格。

【问题讨论】:

  • 只是猜测,您是否尝试过在 vxData1.MoveFirst 之前使用 vxData1.MoveLast 来填充 vxData1?
  • 嗨。是的,我已经试过了——同样的结果。 - 我经常看到这种做法 - 但实际上我也缺乏理解:当我执行 MoveFirst 时我的 recorset 没有完成 - 那么 MoveLast 根本不应该工作!

标签: vba scripting vbscript


【解决方案1】:

不确定,但需要检查以下几点:

  • ActiveX 组件是 .exe 还是 .dll?我似乎记得在 VB6 中,dll 运行“进程内”而 exe 运行“进程外”,即异步运行。我不确定这如何适用于 VBA。
  • 您是否知道您的 ActiveX 组件是否会引发事件以表明它已完成查询?您可以在进入循环之前监听该事件的触发。

【讨论】:

  • 您好,谢谢。该组件是一个 .ocx 并且似乎没有抛出任何类型的事件。我认为这可能是一些与脚本相关的一般性问题,因为我听说过类似的 javascript 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
相关资源
最近更新 更多