Импорт данных из базы данных SQL в Excel 2003 VS Excel 2010 (VBA) - PullRequest
2 голосов
/ 13 октября 2010

Итак, моя компания, наконец, обновилась до 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, нажимает кнопку, и этот агент и его Id появляются в таблице ниже.Действительно просто верно?Но я не могу заставить это работать в Excel 2010.

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

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

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

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

1 Ответ

2 голосов
/ 15 октября 2010

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

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

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

Тим

...