2015-04-26 3 views
2

У меня есть прогресс бар, который обновляет на основе линии:VBA - Обновление индикатор выполнения во время выполнения SQL-запроса

Call ProgressBar(X) 

где X указывает процент, что бар отображается как «полное».

Я грубо подсчитал различные временные интервалы по всему коду и разместил линию на несколько мест. Он находится в точке, где он работает довольно гладко для большинства кода, но только в половине бара, при этом проблема заключается в вынужденном прыжке с 10% до 60%.

Я использую ADODB-соединение для запуска SQL-запроса в коде (я не могу извлечь его из кода, потому что через него передаются переменные). Скачок от 10 до 60 по обе стороны от линии, где я выполнения запроса

Set rs = conn.Execute(QryND) 

где г определяется как ADODB.Recordset и Конн, как ADODB.Connection.

Я думаю, в идеале, что я после должен был бы знать, если это можно сказать:

 Call ProgressBar(10) 
     'code to the effect of: "in x seconds, execute the next line but in 
    'the meantime continue with the code 

      Call ProgressBar(20) 
     'code to the effect of: "in 2x seconds, execute the line but in the 
'meantime continue with the code 
      Call ProgressBar(30) 
      Set rs = conn.Execute(QryND) 

Или что-то по этому вопросу.

В качестве альтернативы средство выполнения запроса в фоновом режиме и продолжение кода до точки. Например:

 Call ProgressBar(10) 
'instruct to run in backrgound: 
    Set rs = conn.Execute(QryND) 
Call ProgressBar(10) 
'wait x seconds 
Call ProgressBar(20) 
'wait x seconds 
. 
. 
. 

'Stop running query in background (in case it hasn't finished) 

Возможно ли сделать любой из этих звуков?

+0

ADO поддерживает запланированное выполнение async, если вы считаете его целесообразным реализовать: https://support.microsoft.com/en-us/kb/190988 –

ответ

0

Запуск фоновых запросов не рекомендуется, так как они могут запускать ваш код в виде ошибок. Фактически вы можете оставить StatusBar только f * и проверить его с помощью циклов (или через равные промежутки времени), т. Е. Извлекает ли соединение, запускает или завершает работу.
Что вы можете сделать, это создать объект ActiveX, чтобы отображать все, что вы хотели сказать, даже до фантастических нагрузочных баров и многострочной обратной связи.
Вы не можете иметь асинхронные процессы в однопоточном приложении, если вы не вызываете внешние скрипты для их выполнения.

+0

Извините, я не думаю, что буду следовать за вами. Не могли бы вы уточнить «проверять его с помощью циклов (или через регулярные промежутки времени)»? Я не уверен, как это сделать, пока обрабатывается одна строка кода. – user2842721

+0

Черт, извините. Я не думал, что могут быть прочитаны только созданные пользователем тексты. То, что вы, вероятно, захотите, похоже на [this] (http://stackoverflow.com/a/5181347/3819867). Если вы можете проверить статус или статус обновления запроса (из которого обновляется сама строка состояния), это будет ваше решение. К сожалению, мой краткий поиск оказался неудачным. Изменить: я нашел свойство QueryTable.Refreshing в msdn (https://msdn.microsoft.com/en-us/library/office/ff834459.aspx). – user3819867

+0

Продолжение кода, но запуск обновления состояния может быть выполнен с помощью метода [Application.OnTime] (https://msdn.microsoft.com/en-us/library/office/ff196165.aspx). Примечание: вы захотите закончить заданный субтитр для его запуска. Затем он может вызвать вторую часть вашего кода и т. Д. – user3819867

Смежные вопросы