Почему задача в VBA выполняется до того, как предыдущая была завершена? - PullRequest
1 голос
/ 12 февраля 2010

Как начинающий VBA, у меня возникают проблемы с пониманием поведения VBA.

Я получил следующий код, который считывает строки из БД в элемент управления 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 - но я никогда не могу знать, сколько времени займет мой запрос - и это похоже на очень плохой стиль.

1 Ответ

0 голосов
/ 12 февраля 2010

Не уверен, но вот несколько вещей, которые нужно проверить:

  • Является ли компонент ActiveX .exe или .dll? Кажется, я помню в VB6, что dll запускается «в процессе», а exe - «вне процесса», то есть асинхронно. Я не уверен, как это относится к VBA.
  • Знаете ли вы, вызывает ли ваш компонент ActiveX событие, чтобы сказать, что он завершил свой запрос? Вы можете прослушать это событие, прежде чем перейти в цикл.
...