как передать параметры для запроса в SQL (Excel) - PullRequest
25 голосов
/ 25 марта 2011

Я «связал» Excel с Sql, и он работал нормально - я написал несколько сценариев SQL, и они отлично работали.Все, что я хочу сделать, это передать параметр в запрос.Как и всякий раз, когда я делаю обновление, я хочу иметь возможность передавать параметр (условие фильтра) в Sql Query.В «Свойствах соединения» кнопка «Параметры» отключена.Поэтому я не могу сделать запрос параметров.Кто-нибудь может мне помочь?

Ответы [ 2 ]

27 голосов
/ 09 мая 2012

Этот пост достаточно старый, поэтому этот ответ, вероятно, будет бесполезен для ОП, но я потратил целую вечность, пытаясь ответить на этот же вопрос, поэтому я решил обновить его своими выводами.

Этот ответПредполагается, что у вас уже есть рабочий запрос SQL в вашем документе Excel.Существует множество обучающих программ, показывающих, как выполнить это в Интернете, и множество, в которых объясняется, как добавить параметризованный запрос к одному, за исключением того, что ни один из них не работает для существующего запроса OLE DB .

Итак, если вы, как и я, получили устаревший документ Excel с рабочим запросом, но пользователь хочет иметь возможность фильтровать результаты по одному из полей базы данных, и если вы, как и я,Вы не являетесь ни Excel, ни SQL-гуру, это может помочь вам.

Большинство ответов на этот вопрос в Интернете говорят, что вы должны добавить «?» в свой запрос, чтобы Excel подсказал вамдля пользовательского параметра или поместите подсказку или ссылку на ячейку в [скобках], где должен быть параметр.Это может работать для запроса ODBC, но, похоже, не работает для OLE DB, возвращая «Нет значения, заданного для одного или нескольких обязательных параметров» в предыдущем экземпляре, и «Неверное имя столбца« xxxx »» или «Неизвестный объект».«хххх» в последних двух.Точно так же использование мифических кнопок «Параметры…» или «Редактировать запрос ...» также не вариант, так как в этом случае они кажутся постоянно серыми.(Для справки я использую Excel 2010, но с книгой Excel 97-2003 (* .xls))

Однако мы можем добавить ячейку параметра и кнопку с простой подпрограммой дляпрограммно обновите наш текст запроса.

Сначала добавьте строку над таблицей внешних данных (или где-либо еще), где вы можете поместить подсказку параметра рядом с пустой ячейкой и кнопкой (Developer-> Insert-> Button (Контроль формы) - вам может понадобиться включить вкладку «Разработчик», но вы можете узнать, как это сделать в другом месте), например так:

[Picture of a cell of prompt (label) text, an empty cell, then a button.]

Далее выберите ячейку вОбласть «Внешние данные» (синяя), затем откройте «Данные» -> «Обновить все» (выпадающий список) -> Свойства подключения…, чтобы посмотреть на ваш запрос.Код в следующем разделе предполагает, что у вас уже есть параметр в запросе (Свойства соединения-> Определение-> Текст команды) в форме «ГДЕ (DB_TABLE_NAME.Field_Name =« Параметр запроса по умолчанию »)» (включая скобки).Очевидно, что «DB_TABLE_NAME.Field_Name» и «Параметр запроса по умолчанию» должны отличаться в вашем коде, в зависимости от имени таблицы базы данных, имени поля значения столбца (столбца) и некоторого значения по умолчанию, которое нужно искать при открытии документа (еслиу вас установлено автоматическое обновление).Запишите значение «DB_TABLE_NAME.Field_Name», которое понадобится вам в следующем разделе, а также «Имя соединения» вашего запроса, которое можно найти в верхней части диалогового окна.

ЗакройтеСвойства подключения и нажмите Alt + F11, чтобы открыть редактор VBA.Если вы этого еще не сделали, щелкните правой кнопкой мыши на имени листа, содержащего вашу кнопку, в окне «Проект» и выберите «Просмотр кода».Вставьте следующий код в окно кода (рекомендуется копирование, так как одинарные / двойные кавычки рискованны и необходимы).

Sub RefreshQuery()
 Dim queryPreText As String
 Dim queryPostText As String
 Dim valueToFilter As String
 Dim paramPosition As Integer
 valueToFilter = "DB_TABLE_NAME.Field_Name ="

 With ActiveWorkbook.Connections("Connection name").OLEDBConnection
     queryPreText = .CommandText
     paramPosition = InStr(queryPreText, valueToFilter) + Len(valueToFilter) - 1
     queryPreText = Left(queryPreText, paramPosition)
     queryPostText = .CommandText
     queryPostText = Right(queryPostText, Len(queryPostText) - paramPosition)
     queryPostText = Right(queryPostText, Len(queryPostText) - InStr(queryPostText, ")") + 1)
     .CommandText = queryPreText & " '" & Range("Cell reference").Value & "'" & queryPostText
 End With
 ActiveWorkbook.Connections("Connection name").Refresh
End Sub

Замените «DB_TABLE_NAME.Field_Name» и «Имя соединения» (в двух местах)с вашими значениями (двойные кавычки и знак пробела и равенства должны быть включены).

Замените «Ссылка на ячейку» на ячейку, в которую будет идти ваш параметр (пустая ячейка с начала) - моя былаВторая ячейка в первом ряду, поэтому я поставил «B1» (опять же, нужны двойные кавычки).

Сохраните и закройте редактор VBA.

Введите ваш параметр в соответствующую ячейку.

Щелкните правой кнопкой мыши по кнопке, чтобы назначить подпрограмму RefreshQuery в качестве макроса, затем нажмите кнопку.Запрос должен обновить и отобразить правильные данные!

Примечания. Использование всего имени параметра фильтра ("DB_TABLE_NAME.Field_Name =") тольконеобходимо, если в вашем запросе есть объединения или другие вхождения знаков равенства, в противном случае достаточно просто знака равенства и вычисление Len () будет излишним.Если ваш параметр содержится в поле, которое также используется для объединения таблиц, вам необходимо изменить строку «paramPosition = InStr (queryPreText, valueToFilter) + Len (valueToFilter) - 1» в коде на «paramPosition = InStr (Справа (.CommandText, Len (.CommandText) - InStrRev (.CommandText, "WHERE")), valueToFilter) + Len (valueToFilter) - 1 + InStr (.CommandText, "WHERE") ", так что он ищет только valueToFilter после «ГДЕ».

Этот ответ был создан с помощью «BaconBits» datapig, где я нашел базовый код для обновления запроса.

9 голосов
/ 05 апреля 2011

Это зависит от базы данных, к которой вы пытаетесь подключиться, метода, с помощью которого вы создали соединение, и версии Excel, которую вы используете. (Также, скорее всего, версия соответствующего драйвера ODBC на вашем компьютере.)

В следующих примерах используются SQL Server 2008 и Excel 2007 на локальном компьютере.

Когда я использовал Мастер подключения к данным (на вкладке «Данные» на ленте в разделе «Получение внешних данных» в разделе «Из других источников»), я увидел то же самое, что и вы: кнопка «Параметры» была отключена и добавлено параметр к запросу, что-то вроде select field from table where field2 = ?, заставил Excel жаловаться, что значение параметра не было указано, и изменения не были сохранены.

Когда я использовал Microsoft Query (в том же месте, что и мастер подключения к данным), я мог создавать параметры, указывать отображаемое имя для них и вводить значения при каждом запуске запроса. В окне «Свойства соединения» для этого соединения включена кнопка «Параметры ...», и параметры можно изменять и использовать по своему усмотрению.

Мне также удалось сделать это с базой данных Access. Кажется разумным, что Microsoft Query можно использовать для создания параметризованных запросов, затрагивающих другие типы баз данных, но сейчас я не могу легко это проверить.

...