Excel для Microsoft 365 Excel 2021 Excel 2019 Excel 2016 Excel 2013 Еще…Меньше
При запросе данных в Excel можно использовать входное значение ( параметр), чтобы указать что-то о запросе. Для этого нужно создать запрос с параметрами в Microsoft Query.
-
Параметры используются в предложении WHERE запроса— они всегда работают в качестве фильтра для извлечения данных.
-
Параметры могут запрашивать у пользователя входное значение при запуске или обновлении запроса, использовать константы в качестве входного значения или использовать содержимое указанной ячейки в качестве входного значения.
-
Параметр является частью запроса, который он изменяет, и его нельзя повторно использовать в других запросах.
Примечание Если вы хотите создать запросы с параметрами другим способом, см. создание запроса с параметрами (Power Query).
Последовательность действий
-
Щелкните Данные > Получить & Преобразование данных > Получить данные > из других источников > из Microsoft Query.
-
Следуйте шагам мастера запросов. На экране Мастер запросов — готово выберите Просмотр данных или изменение запроса в Microsoft Query и нажмите кнопку Готово. Откроется окно Microsoft Query и отобразит запрос.
-
Нажмите кнопку> SQL. В диалоговом SQL найдите предложение WHERE — строку, которая начинается со слова WHERE, обычно в конце SQL кода. Если предложение WHERE не существует, добавьте его, введя WHERE в новой строке в конце запроса.
-
После where введите имя поля, оператор сравнения (=, <, >, LIKE и т. д.) и одно из следующих данных:
-
Для запроса generic parameter (?) введите вопросии (?). В подсказке, которая появляется при запуске запроса, не отображается полезная фраза.
-
Введите фразу, заключенную в квадратные скобки, для запроса параметра, который помогает вводить допустимые данные. Фраза отображается в запросе с параметрами при запуске запроса.
-
-
Завершив добавление условий с параметрами в предложение WHERE, нажмите кнопку ОК, чтобы запустить запрос. Excel запрос на в качестве значения для каждого параметра, Microsoft Query отобразит результаты.
-
Когда вы будете готовы загрузить данные, закройте окно Microsoft Query, чтобы вернуться к Excel. Откроется диалоговое окно Импорт данных.
-
Чтобы просмотреть параметры, нажмите кнопку Свойства. Затем в диалоговом окне Свойства подключения на вкладке Определение нажмите кнопку Параметры.
-
В диалоговом окне Параметры отображаются параметры, используемые в запросе. Выберите параметр в области Имя параметра, чтобы просмотреть или изменить параметр How value is obtained. Вы можете изменить запрос параметра, ввести определенное значение или указать ссылку на ячейку.
-
Нажмите кнопку ОК, чтобы сохранить изменения и закрыть диалоговое окно Параметры, а затем в диалоговом окне Импорт данных нажмите кнопку ОК, чтобы отобразить результаты запроса Excel.
Теперь в книге есть запрос с параметрами. При запуске запроса или обновлении подключения к данным Excel проверяет параметр, чтобы завершить предложение WHERE запроса. Если параметр запросит значение, Excel отобразит диалоговое окно Введите значение параметра для сбора входных данных. Вы можете ввести значение или щелкнуть ячейку со значением. Вы также можете указать, что указанное значение или ссылка всегда должны использоваться, а при использовании ссылки на ячейку можно указать, что Excel должно автоматически обновлять подключение к данным (то есть повторно выполнить запрос) при внесении изменений в указанную ячейку.
См. также
Настройка запроса с параметрами
Создание запроса с параметрами (Power Query)
Создание раскрывающегося списка
Нужна дополнительная помощь?
Зачем нужен Power Query
Как установить Power Query
Как его Настроить
Как изменить запрос
This post is old enough that this answer will probably be little use to the OP, but I spent forever trying to answer this same question, so I thought I would update it with my findings.
This answer assumes that you already have a working SQL query in place in your Excel document. There are plenty of tutorials to show you how to accomplish this on the web, and plenty that explain how to add a parameterized query to one, except that none seem to work for an existing, OLE DB query.
So, if you, like me, got handed a legacy Excel document with a working query, but the user wants to be able to filter the results based on one of the database fields, and if you, like me, are neither an Excel nor a SQL guru, this might be able to help you out.
Most web responses to this question seem to say that you should add a “?” in your query to get Excel to prompt you for a custom parameter, or place the prompt or the cell reference in [brackets] where the parameter should be. This may work for an ODBC query, but it does not seem to work for an OLE DB, returning “No value given for one or more required parameters” in the former instance, and “Invalid column name ‘xxxx’” or “Unknown object ‘xxxx’” in the latter two. Similarly, using the mythical “Parameters…” or “Edit Query…” buttons is also not an option as they seem to be permanently greyed out in this instance. (For reference, I am using Excel 2010, but with an Excel 97-2003 Workbook (*.xls))
What we can do, however, is add a parameter cell and a button with a simple routine to programmatically update our query text.
First, add a row above your external data table (or wherever) where you can put a parameter prompt next to an empty cell and a button (Developer->Insert->Button (Form Control) – You may need to enable the Developer tab, but you can find out how to do that elsewhere), like so:
Next, select a cell in the External Data (blue) area, then open Data->Refresh All (dropdown)->Connection Properties… to look at your query. The code in the next section assumes that you already have a parameter in your query (Connection Properties->Definition->Command Text) in the form “WHERE (DB_TABLE_NAME.Field_Name = ‘Default Query Parameter’)” (including the parentheses). Clearly “DB_TABLE_NAME.Field_Name” and “Default Query Parameter” will need to be different in your code, based on the database table name, database value field (column) name, and some default value to search for when the document is opened (if you have auto-refresh set). Make note of the “DB_TABLE_NAME.Field_Name” value as you will need it in the next section, along with the “Connection name” of your query, which can be found at the top of the dialog.
Close the Connection Properties, and hit Alt+F11 to open the VBA editor. If you are not on it already, right click on the name of the sheet containing your button in the “Project” window, and select “View Code”. Paste the following code into the code window (copying is recommended, as the single/double quotes are dicey and necessary).
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
Replace “DB_TABLE_NAME.Field_Name” and «Connection name» (in two locations) with your values (the double quotes and the space and equals sign need to be included).
Replace «Cell reference» with the cell where your parameter will go (the empty cell from the beginning) — mine was the second cell in the first row, so I put “B1” (again, the double quotes are necessary).
Save and close the VBA editor.
Enter your parameter in the appropriate cell.
Right click your button to assign the RefreshQuery sub as the macro, then click your button. The query should update and display the right data!
Notes:
Using the entire filter parameter name («DB_TABLE_NAME.Field_Name =») is only necessary if you have joins or other occurrences of equals signs in your query, otherwise just an equals sign would be sufficient, and the Len() calculation would be superfluous.
If your parameter is contained in a field that is also being used to join tables, you will need to change the «paramPosition = InStr(queryPreText, valueToFilter) + Len(valueToFilter) — 1» line in the code to «paramPosition = InStr(Right(.CommandText, Len(.CommandText) — InStrRev(.CommandText, «WHERE»)), valueToFilter) + Len(valueToFilter) — 1 + InStr(.CommandText, «WHERE»)» so that it only looks for the valueToFilter after the «WHERE».
This answer was created with the aid of datapig’s “BaconBits” where I found the base code for the query update.
Доброе утро всем! |
|
JeyCi Пользователь Сообщений: 3357 |
#2 07.04.2015 09:55:54 можно
частный пример:
проводит отбор id, fio, comment столбцов из таблицы test_table Изменено: JeyCi — 07.04.2015 20:42:39 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||
Андрей Панькин Пользователь Сообщений: 46 |
#3 07.04.2015 10:01:18 Запрос написать не проблема, проблема в том что в условие WHERE хотелось бы видеть ссылку на ячейку Excel. Что-то типа:
|
||
B.Key Пользователь Сообщений: 633 |
#4 07.04.2015 10:02:58 В принципе можно и без VBA в 2003 это просто:
Изменено: B.Key — 09.04.2015 17:44:19 |
|
B.Key Пользователь Сообщений: 633 |
Да забыл добавить в более молодых версиях, либо запрос с параметром, который будете ручками вбивать, либо VBA |
Vitallic Пользователь Сообщений: 239 |
#6 07.04.2015 10:14:06 Добрый день, я делаю так
|
||
Андрей Панькин Пользователь Сообщений: 46 |
#7 07.04.2015 10:23:53
В 2013 версии не нашел такого( |
||
TheBestOfTheBest Пользователь Сообщений: 2366 Excel 2010 +PLEX +SaveToDB +PowerQuery |
Сие возможно только поправив в подключении строку с SQL кодом — ручками!! Оно Вам надо? Есть еще возможность использовать отбор полученного результат по расширенному фильтру. Изменено: TheBestOfTheBest — 07.04.2015 11:42:51 Неизлечимых болезней нет, есть неизлечимые люди. |
JeyCi Пользователь Сообщений: 3357 |
#9 07.04.2015 11:43:52 xl 2010 — делаю запрос макросом (пример т к отсутствует пример от ТС)
на таблице — результате запроса ПКМ — «Параметры» — почему-то не подсвечена?? может, если запрос настроить вручную — то можно более тонкую настройку сделать? к сожалению не знаю, как вручную??… Изменено: JeyCi — 07.04.2015 12:11:25 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
JeyCi Пользователь Сообщений: 3357 |
#10 07.04.2015 18:20:41 запрос через ODBC, сделанный макросом — тоже не даёт залезть в ПКМ-Параметры… (не подсвечен, как на скрине поста предыдущего)
возможно какой-то способ есть для xl2010? Изменено: JeyCi — 07.04.2015 19:30:09 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
|
JeyCi Пользователь Сообщений: 3357 |
#11 07.04.2015 19:22:05
вот, кстати, наверно, и ответ на вопрос… в самом запросе должны быть (изначально) указаны Параметры… тогда похоже и будет доступ к ним через ПКМ… если не ошибаюсь… ЧТО xl понимает как Параметры запроса?? и как прописать? — Xapa6apga приводил примеры в ветках: CreateParameter Null — 14 Фев 2015 17:58:45 Экспорт из Excel в SQL Server — 3 Апр 2015 15:15:03 Формирование параметрических запросов P.P.S здесь почти кратко от Jom (30 Июл 2010 08:40:37 SQL запрос из Excel VBA ) Изменено: JeyCi — 07.04.2015 20:20:53 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
TheBestOfTheBest Пользователь Сообщений: 2366 Excel 2010 +PLEX +SaveToDB +PowerQuery |
MS QUERY, на базе которого осуществляется подключения, такое не допускает. Используйте Дополнительный/Расширенный фильтр. Неизлечимых болезней нет, есть неизлечимые люди. |
JeyCi Пользователь Сообщений: 3357 |
как вариант http://www.excelworld.ru/forum/2-12367-1 (пример от Gustav 13.08.2014, 12:16 ) чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
TheBestOfTheBest Пользователь Сообщений: 2366 Excel 2010 +PLEX +SaveToDB +PowerQuery |
Макросом можно слепить любую SQL команду, но изначально «Возможно ли это сделать без использования VBA?» Неизлечимых болезней нет, есть неизлечимые люди. |
B.Key Пользователь Сообщений: 633 |
#15 08.04.2015 23:38:10
———- ——— ps…. кол-во параметров можно изменять, добавляя их ms query и делать ссылки на добавленные параметры как описано выше Изменено: B.Key — 08.04.2015 23:53:04 |
||
Андрей Панькин Пользователь Сообщений: 46 |
#16 09.04.2015 09:23:58
Запнулся на шаге 3. Где это? Изменено: Андрей Панькин — 09.04.2015 09:24:45 |
||
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
Доброе время суток
Увы, не работает:cry: Прикрепленные файлы
Изменено: Андрей VG — 09.04.2015 09:56:49 |
B.Key Пользователь Сообщений: 633 |
#18 09.04.2015 10:00:57 Андрей VG,
|
||
Все разобрался, все работает как задумано. Класс! Спасибо огромное всем. Теперь будет юзерам счастье:D |
|
B.Key Пользователь Сообщений: 633 |
Эту тему можно и в копилку добавить, так на самом деле информации в сети нет. |
Андрей Пользователь Сообщений: 46 |
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#22 09.04.2015 13:32:41 Можно и программно, только непонятно, почему с ODBC работает, а OLEDB не хочет. В инете ответа не нашёл. Пример для файла Excel
Можно потом сохранить в файл подключения и править «ручками» по мере необходимости. |
||
JeyCi Пользователь Сообщений: 3357 |
#23 09.04.2015 13:59:26
как-то так
Изменено: JeyCi — 09.04.2015 17:31:57 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
|||
JeyCi Пользователь Сообщений: 3357 |
#24 09.04.2015 17:29:04
можно лишь предполагать: (на основе моего 1-го скрина из #23, в котором видно [по тексту за макрос спасибо! — я вчера тоже думала об этой строке (не смогла найти правильную интерпретацию)…
Изменено: JeyCi — 09.04.2015 17:48:36 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||
vikttur Пользователь Сообщений: 47199 |
JeyCi, спойлер не кусается. |
JeyCi Пользователь Сообщений: 3357 |
у меня вот только один вопрос остался — может быть, кто-нибудь подскажет? можно ли в этом окне найти Конструктор запросов (как в Access)?? (помимо простого select*from where <условие> )… что-нибудь посерьёзнее (union, join)??.. p.s. vikttur не успела подумать.. (спасибо за исправление) Изменено: JeyCi — 09.04.2015 17:50:46 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
B.Key Пользователь Сообщений: 633 |
В конструкторе нет, а в запросе, где нашли пожалуйста |
vikttur Пользователь Сообщений: 47199 |
JeyCi, «не первый день замужем»! |
JeyCi Пользователь Сообщений: 3357 |
#29 09.04.2015 18:24:33
когда знаете, что в Конструкторе xl — нет никаких возможностей — то легко заявить, что вопрос не по теме… а не зная, как он выглядит (этот конструктор), — нет оснований верить (в своё незнание), что ссылку на ячейку в нём не указать… если есть возможность, тему раскрыть полно согласно заявленному оглавлению — зачем плодить другие, в которых от перестановки мест слагаемых сумма не меняется… если считаете мои посты НЕ ПО ТЕМЕ — будьте добры удалите всё!.. чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
vikttur Пользователь Сообщений: 47199 |
#30 09.04.2015 18:28:23 Не нервничайте. Как можно, пользуясь ПОИСКОМ, определить, что в этой теме есть ответ на «можно ли в этом окне найти Конструктор запросов»? |
Dunno why MS has made this so complicated, You will have to use Microsoft Query.
Click on Data -> From External Sources -> From Microsoft Query. CHoose Data source comes up. Select SQL Server, enter the Auth details, and select the table
Click on Next, don’t select any filtering criteria, choose sort by criteria, click on next.
Now, click on View/Edit in MS Query instead of selecting Return to Excel
Click on Finish. Now in MS Query, Click on Criteria -> Add Criteria, choose the operator and let the value be []
Click on File -> return data to Excel. Now Excel should prompt you for the parameter, select the relevant cell
To edit the parameters, click on Data -> Properties -> Finger icon -> Definition -> parameters
You can also use the SQL query editor and type in the query with the joins and put a ?
against the field where the parameter has to be fetched.