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