Ваша ошибка в использовании MS-Query. Закодируйте вызовы базы данных, используя ADODB, и дождитесь метода Execute объекта ADODB.Command.
... Если это то, что вы на самом деле делаете. Здесь есть определенное количество догадок, но похоже, что информация запроса, а не лист, в который он встроен, - это информация, которая вам нужна.
Этот код вызывает SQL-запрос асинхронно - он концептуально похож на командный объект, который является (я думаю) тем, что вы на самом деле делаете, - и грубый цикл «сна» можно заменить индикатором выполнения или кодом флаги опроса и вычисления в другом месте.
К вашему сведению, свойства состояния и состояния объектов ADO могут сбивать с толку. В общем случае ноль означает закрытие, а 1 означает открытие (для объектов, которые возвращают открытое соединение или набор данных), а значения выше 1 соответствуют ожиданию или выполнению.
Конечно, вы можете просто вызвать запрос синхронно.
Я мог бы дать вам код для 'DataConnection', но вам гораздо лучше пойти на ConnectionStrings.com для этого.
Public Function FetchRecordSet(SQL As String, Optional CursorType As CursorTypeEnum = adOpenForwardOnly) As ADODB.Recordset
On Error Resume Next
Set FetchRecordSet = New ADODB.Recordset
With FetchRecordSet
.CacheSize = 8
Set .ActiveConnection = DataConnection
.Open SQL, , CursorType, adLockReadOnly, adCmdText + adAsyncFetch
Do While .State > 1
Application.StatusBar = "Retrieving data... "
Sleep 250
Loop
End With
Application.StatusBar = False
End Function
[Обновить]
Я кое-что узнал с тех пор, как опубликовал этот ответ:
Если вам известно имя команды, функции, возвращающей набор строк, или именованный запрос в базе данных MS-Access, не беспокойтесь о ее вызове следующим образом:
SQL = "SELECT * FROM MyQuery"
.Open SQL, , CursorType, adLockReadOnly, adCmdText + adAsyncFetch
Вызовите команду по имени и скажите ядру базы данных, что это именованная команда, используя константу adCmdStoredProc
:
SQL = "MyQuery"
.Open SQL, , CursorType, adLockReadOnly, adCmdStoredProc + adAsyncFetch
Он работает намного, намного быстрее.
Найдите CommandTypeEnum в MSDN и используйте все, что вам подходит:
https://msdn.microsoft.com/en-us/library/ms675946(v=vs.85).aspx
Используйте adCmdTable
для именованных таблиц и посмотрите, работает ли это лучше, чем adCmdStoredProc
для объектов 'view' - я обнаружил, что это зависит от механизмов баз данных.
[/ Update]