Импорт данных из базы данных SQL в Excel 2003 VS Excel 2010 (VBA)

Итак, моя компания наконец-то перешла на MS Office 2010. До сих пор я работал в 2003 году. Я программист SQL и постоянно создаю отчеты в Excel, которые извлекают данные из нашей базы данных. В большинстве случаев я буду создавать макросы, принимающие параметры, которые пользователи будут вводить в определенные ячейки, изменять запрос, а затем обновлять его в соответствии с параметрами.

Вот действительно простой пример:

  1. В Excel 2003 я бы открыл новую книгу.
  2. Щелкните «Данные», затем «Импортировать внешние данные», затем «Новый запрос к базе данных».
  3. Затем он предлагает вам выбрать источник данных, поэтому я бы выбрал базу данных, из которой я хотел запросить (которая уже была настроена с подключением ODBC).
  4. Затем я отменяю выход из окон мастера запросов, а затем, когда нахожусь в редакторе запросов Microsoft, я просто ввожу свой запрос.

    • Для простоты я выберу * из таблицы с именем Agents, которая представляет собой просто список агентов, работающих в компании, и их EmployeeIds.

    • select * from Agents

  5. Затем я «x» выхожу из редактора запросов, и появляется окно с названием «Импортировать данные», в котором спрашивается, куда вы хотите поместить данные: на существующий лист? новый рабочий лист? и т. д. Я просто вернул данные в существующем листе, начиная с ячейки A2

Итак, я пишу этот простой макрос в редакторе Visual Basic в модуле для книги:

Sub Refresh()

Dim oQuery as QueryTable
Dim oAgent as String

set oQuery = Sheet1.QueryTables(1)

oAgent = Sheet1.Range("A1")

oQuery.CommandText = "select * from Agents where Agent = '"+oAgent+"'"
oQuery.Refresh

End Sub

Я создаю кнопку, запускающую этот макрос, и вставляю ее в B1. Таким образом, пользователь открывает отчет, вводит имя в A1, нажимает кнопку, и этот агент и его идентификатор появляются в таблице ниже. Действительно просто, правда? Но я не могу заставить это работать в Excel 2010.

Вот мои шаги и следующая ошибка:

  1. Я открываю Excel 2010 и перехожу на вкладку «Данные».
  2. В разделе «Получить внешние данные» я нажимаю «Из других источников» и выбираю «Из запроса Mircrosoft» из раскрывающегося списка.
  3. Затем появится диалоговое окно «Выбрать источник данных», аналогичное шагам 3, 4 и 5, описанным выше.

Затем я пишу тот же макрос, создаю кнопку и назначаю ее marco, но когда я нажимаю кнопку, я получаю следующую ошибку:

Run-time error '9':
Subscript out of range

Я нажимаю отладку, и отладчик выделяет эту строку

Set oQuery = Sheet1.QueryTables(1)

Я попытался сделать эту строку более конкретной:

Set oQuery = WorkBooks("Book 1").Sheets("Sheet 1").QueryTables(1)

Но я получаю ту же ошибку.

Итак, в основном мне нужно знать, как делать такие вещи в Excel 2010. Но вот интересное примечание: если я создам этот отчет в Excel 2003, сохраню его как .xls, а затем открою его в 2010 году, он будет Работа. Я даже могу сохранить копию как .xlsm, затем открыть ее, и она будет работать с тем же макросом. Только когда я создаю отчет в 2010 году, я не могу заставить его работать. По какой-то причине кажется, что он просто не может найти запрос, чтобы изменить текст своей команды, а затем обновить. Пожалуйста, помогите, я застрял на этом несколько дней!


person BillSchwartzky    schedule 13.10.2010    source источник


Ответы (1)


В XL2007 и 2010 таблицы запросов содержатся в объекте ListObject на листе, поэтому вам просто нужно настроить свой код так, чтобы:

Set oQuery = WorkBooks("Book 1").Sheets("Sheet 1").ListObjects(1).QueryTables(1)

http://msdn.microsoft.com/en-us/library/ff841237.aspx

Тим

person Tim    schedule 14.10.2010
comment
Спасибо, Тим, я очень ценю помощь. Я скорректировал приведенный выше код, но затем получил следующую, другую ошибку: ошибка времени выполнения «438». Объект не поддерживает это свойство или метод. Я гуглил эту ошибку и ищу на сайте msdn, но пока не нашел исправления. Мы будем очень благодарны за любые предложения о том, почему это может происходить. Еще раз спасибо, Билл - person BillSchwartzky; 15.10.2010
comment
Хорошо, Тим, вот и ответ. И, слава богу, наконец-то все заработало. Установите oQuery = Workbooks (Book 1) .Sheets (Sheet 1) .ListObjects (1) .QueryTable. - person BillSchwartzky; 15.10.2010