Excel 2010 зависает при выполнении инструкции SQL через макрос

У меня возникла проблема с выполнением SQL-запроса через макрос vs, просто нажав "Обновить" в excel 2010.

настроено:

  • Я открываю новый рабочий лист excel 2010.
  • перейдите на вкладку "Данные"
  • В разделе "Получить внешние данные" я нажимаю "Из других источников", и из раскрывающегося списка я нажимаю "Из запроса Microsoft"
  • Затем я выбираю надлежащее соединение ODBC, отменяю окно "Мастер запросов" и закрываю окно "Добавить таблицы"
  • Затем в окне "Microsoft Query" я просто нажимаю кнопку "SQL", введите свой запрос и нажмите ok
  • Он выполняет запрос в окне "Microsoft Query", затем я закрываю это окно, выбираю ячейку, которую я хочу, чтобы она заполнялась, когда она была предложена, и нажмите "ОК".
  • Затем запрос заполняется в моей таблице.

Вот где проблема возникает:

Если я щелкнул правой кнопкой мыши по таблице и выберите "Обновить" во всплывающем меню правой кнопки мыши, данные будут обновляться, и появится маленький вращающийся глобус внизу экрана с надписью "Запуск фонового запроса..." и вращение, пока запрос не завершится, и excel не замерзнет, ​​и я могу работать на других вкладках или других листах.

Однако, если я выполняю этот точный оператор через макрос:

Range("A6").Select
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False

Вращающийся глобус не появляется, excel перестает отвечать, иногда идет белым, и мышь превращается в вращающийся "не отвечающий" круг, зависающий над excel. На данный момент я не могу работать в excel вообще до тех пор, пока запрос не завершит выполнение, и excel начнет отвечать снова.

Это проблема, потому что для большинства моих отчетов я использую ячейки в excel, чтобы позволить пользователям вставлять параметры в операторы SQL, которые я выполняю.

Пример:

Dim oQuery As QueryTable
Dim oDate As String

Set oQuery = ActiveWorkbook.Sheets("Sheet1").ListObjects(1).QueryTable

oDate = Range("B1")

oQuery.CommandText = "exec database.dbo.ExampleProcedure @SuppliedDate = '" + oDate + "'"

oQuery.Refresh False

Это не проблема в Excel 2003, но появилась только при переходе на 2010 год и мне пришлось изменить код vb таблицы запросов, как показано в примере ниже

в 2003 году:

 Set oQuery = Sheet1.QueryTables(1)

в 2010 году:

Set oQuery = ActiveWorkbook.Sheets("Sheet1").ListObjects(1).QueryTable

Также это происходит примерно на 75% отчетов, которые я пишу, и это только заметная проблема, когда SQL-запросы занимают более нескольких секунд для обновления. Это становится довольно большой проблемой, поэтому я буду чрезвычайно благодарен всем, кто мог бы помочь. Большое спасибо.

+1
источник поделиться
1 ответ

Вот он:

BackgroundQuery:=False 

Это означает: "Не позволяйте никому ничего делать, пока запрос не завершится".

Excel делает то, что вы просили. Если вы хотите, чтобы люди могли продолжить, вам нужно изменить False на True.

Если вам нужно выполнить дальнейшую обработку после запроса, у вас есть два варианта (помимо ускорения запросов, которые, как я полагаю, вы уже сделали).

Либо используйте цикл DoEvents, пока вы ждете завершения запроса (отметьте QueryTables.Item(1).Refreshing, чтобы проверить, все ли он работает),

Sub RefreshQueryAndWait(ByVal oQuery As QueryTable)
  '' Assume oQuery is the current query
  oQuery.Refresh BackgroundQuery:=False
  Do While oQuery.Refreshing
    DoEvents
  Loop
End Sub

Или: поместите вторую половину кода VB (после обновления) в другой Sub, который вы вызываете, когда запрос завершается.

Подробнее о том, как это сделать, см. http://support.microsoft.com/kb/213187.

+4
источник

Посмотрите другие вопросы по меткам или Задайте вопрос