Excel запрос к текущей книге

Создание, загрузка и изменение запроса в Excel (Power Query)

Excel для Microsoft 365 Excel 2021 Excel 2019 Excel 2016 Excel 2013 Excel 2010 Еще…Меньше

Power Query предлагает несколько способов создания и загрузки power querys в книгу. Вы также можете настроить параметры загрузки запроса по умолчанию в окне Параметры запроса.    

Совет      Чтобы упросить, сформированы ли данные на этом плане с помощью Power Query, выберите ячейку с данными, а если появится вкладка Лента контекстного запроса, данные загружаются из Power Query. 

Выбор ячейки в запросе для вкладки "Запрос"

Знать, в какой среде вы сейчас? Power Query хорошо интегрирован с пользовательским интерфейсом Excel, особенно при импорте данных, работе с подключениями и редактировании таблиц, таблиц с Excel и именовых диапазонов. Чтобы избежать путаницы, важно в любой момент времени знать, в какой среде вы находитесь, в какой Excel или Power Query.

Знакомые Excel, лента и сетка

Лента редактора Power Query и предварительный просмотр данных 

Стандартный Excel Обычное представление редактора Power Query

Например, работа с данными на Excel значительно отличается от Power Query. Кроме того, подключенные данные, которые вы видите на Excel, могут не работать с Power Query для их обработки. Это происходит только при загрузке данных на таблицу или в модель данных из Power Query.

Переименование я вкладок на таблицах    Ямы лучше переименовывать по своему смыслу, особенно если их много. Особенно важно пояснить разницу между данными и данными, загруженными из редактора Power Query. Даже если у вас всего два листа: с таблицей Excel «Лист1»и запросом, созданным путем импорта таблицы Excel Таблица1,ее легко запутать. Всегда имеет смысл изменить названия ярлыков по умолчанию на более понятное. Например, переименуйте Лист1 в Таблицу данных и Таблицу1 в Таблицу запросов. Теперь понятно, какая вкладка с данными, а какая вкладка с запросом.

Вы можете создать запрос из импортируемых данных или пустой запрос.

Создание запроса из импортируемых данных

Это самый распространенный способ создания запроса.

  1. Импорт некоторых данных. Дополнительные сведения см. в том, как импортировать данные из внешних источников.

  2. Выберем ячейку в данных и выберите запрос> изменить.

Создание пустого запроса

Вы можете начать с нуля. Это можно сделать двумя способами.

  • Выберите Данные> Получить данные >из других источников > пустой запрос.

  • Выберите Данные> получить данные >запуск редактора Power Query.

На этом этапе вы можете вручную добавлять шаги и формулы, если хорошо знаете язык формул Power Query M.

Кроме того, можно выбрать команду На главная в группе Новый запрос. Выполните одно из указанных ниже действий.

  • Выберите Новый источник, чтобы добавить источник данных. Эта команда выглядит так же, как> «Получить данные» на Excel ленте.

  • Выберите Последние источники, чтобы выбрать источник данных, с помощью который вы работали. Эта команда выглядит так же, как> последние источники на Excel ленте.

  • Чтобы ввести данные вручную, выберите Ввести данные. Вы можете выбрать эту команду, чтобы попробовать редактор Power Query независимо от внешнего источника данных.

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

Загрузка запроса из редактора Power Query

В редакторе Power Query сделайте следующее:

  • Чтобы загрузить на таблицу, выберите Главная> Закрыть & Загрузить > Закрыть & Загрузить.

  • Чтобы загрузить данные в модель данных, выберите Главная> Закрыть & Загрузить > Закрыть & Загрузка.

    В диалоговом окне Импорт данных выберите добавить эти данные в модельданных.

Совет   Иногда команда «Загрузить в» неатривна или отключена. Это может произойти при первом создании запроса в книге. В этом случае нажмите кнопку Закрыть & Загрузить, на новом > запросы данных & Connections > Запросы, щелкните запрос правой кнопкой мыши и выберите загрузить в . Кроме того, на ленте редактора Power Query выберите запрос> Загрузить в.

Загрузка запроса из области «Запросы и подключения» 

В Excel может потребоваться загрузить запрос на другой таблицу или в модель данных.

  1. В Excel выберите Запросы> запросы & Connections, а затем выберите вкладку Запросы.

  2. В списке запросов найдите запрос, щелкните его правой кнопкой мыши и выберите загрузить в. Появится диалоговое окно Импорт данных.

  3. Выберите, как вы хотите импортировать данные, а затем выберите ОК. Чтобы получить дополнительные сведения об использовании этого диалогового окна, выберите знак вопроса (?).

Существует несколько способов изменить запрос, загруженный на таблицу.

Изменение запроса на Excel данных

  • Чтобы изменить запрос, найдите ранее загруженную из редактора Power Query, выйдите ячейку в данных и выберите запрос > Изменить.

Изменение запроса в области «Запросы & подключения»

Возможно, вы & области Запросы и подключения удобнее использовать, если в одной книге много запросов и вы хотите быстро найти его.

  1. В Excel выберите Запросы> запросы & Connections, а затем выберите вкладку Запросы.

  2. В списке запросов найдите запрос, щелкните его правой кнопкой мыши и выберите изменить.

Изменение запроса в диалоговом окне «Свойства запроса»

  • В Excel выберите Data> Data & Connections > Запросы, щелкните запрос правой кнопкой мыши и выберите Свойства ,выберите вкладку Определение в диалоговом окне Свойства и нажмите кнопку Изменить запрос.

Совет    Если вы работаете с запросом на > данных, в диалоговом окнеСвойства выберите вкладку Определение, а затем — Изменить запрос. 

Модель данных обычно содержит несколько таблиц, расположенных в связи. Запрос загружается в модель данных с помощью команды Загрузить, чтобы отобразить диалоговое окно Импорт данных, а затем в поле Добавить эти данные в режим данныхl. Дополнительные сведения о моделях данных см. в дополнительных сведениях о том, какие источники данных используются в модели данных книги,Создание модели данных в Excelи Создание таблиц с помощью нескольких таблиц.

  1. Чтобы открыть модель данных, выберите Power Pivot > Управление.

  2. В нижней части окна Power Pivot выберите вкладку нужной таблицы.

    Подтвердим, что отображается правильная таблица. Модель данных может иметь много таблиц.

  3. Обратите внимание на имя таблицы.

  4. Чтобы закрыть окно Power Pivot, выберите файл> Закрыть. Чтобы освободить память, может потребоваться несколько секунд.

  5. Выберите > подключения & свойства >Запросы, щелкните запрос правой кнопкой мыши и выберите изменить.

  6. Завершив внесение изменений в редакторе Power Query, выберите файл > Закрыть & загрузить.

Результат

Запрос на этом и в таблице в модели данных обновляются.

Если вы заметили, что загрузка запроса в модель данных занимает намного больше времени, чем загрузка на лист, проверьте действия Power Query, чтобы узнать, фильтруется ли текстовый столбец или структурированный столбец списка с помощью оператора Contains. Это действие приводит Excel повторно прогонять весь набор данных для каждой строки. Более того, Excel не могут эффективно использовать многопрочитанные выполнения. В качестве обходного решения попробуйте использовать другой оператор, например Равно или Начинает с.

Корпорация Майкрософт знает об этой проблеме и находится в стадии исследования.

Вы можете загрузить Power Query:

  • На один из них. В редакторе Power Query выберите Home> Close & Load > Close & Load.

  • В модель данных. В редакторе Power Query выберите Home> Close & Load > Close & Load To.

    По умолчанию Power Query загружает запросы на новый таблицу при загрузке одного запроса и одновременно загружает несколько запросов в модель данных.  Вы можете изменить поведение по умолчанию для всех книг или только для текущей книги. При настройке этих параметров Power Query не меняет результаты запроса на месте или в данных модели данных и примечаниях.

    Кроме того, динамически переопределять стандартные параметры запроса можно в диалоговом окне Импорт, которое отображается после выбора параметра & Загрузитьв.

Глобальные параметры, которые применяются во всех книгах

  1. В редакторе Power Query выберите Файл > параметры и параметры >параметры запроса.

  2. В диалоговом окне Параметры запроса в левой части в разделе GLOBAL  выберите Загрузка данных.

  3. В разделе Загрузка Параметры запроса по умолчанию сделайте следующее:

    • Выберите Использовать стандартные параметры загрузки

    • Выберите Указать настраиваемые параметры загрузкипо умолчанию, а затем выберите или отобирать параметр Загрузить на таблицу   или Загрузить в модель данных.

Совет    В нижней части диалогового окна можно выбрать восстановить параметры по умолчанию, чтобы вернуться к настройкам по умолчанию.

Параметры книги, которые применяются только к текущей книге

  1. В диалоговом окне Параметры запроса в левой части в разделе ТЕКУЩАЯ КНИГА выберите Загрузка данных.

  2. Выполните одно или несколько из указанных ниже действий.

    • В области Обнаружение типоввыберите или сберем для обнаружения типов столбцов и их заглавных колонок для неструктурированных источников.

      По умолчанию они обнаруживаются. Если вы предпочитаете формировать данные самостоятельно, отоставьте этот параметр.

    • В области Связивыберите или отоберем создать связи между таблицами при первом добавлении в модель данных.

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

    • В области Связивыберите или отоберете update relationships when refreshing queries loaded to the Data Model (Связи) при обновлении запросов, загруженных в модель данных.

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

    • В области Фоновыеданные выберите или отпустите разрешение предварительного просмотра данных для скачивания в фоновом режиме.

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

См. также

Справка по Power Query для Excel

Управление запросами в Excel

Нужна дополнительная помощь?

 

Добрый день!

Никак не могу найти на просторах интернета как же сделать так, чтобы запрос был к текущей книге без уточнения её адреса? То есть, чтобы я мог спокойно переименовать, перенести эту книгу и запрос оставался рабочим?

 

Михаил Л

Пользователь

Сообщений: 2639
Регистрация: 19.02.2020

Кирилл Беляев, было уже много раз. Передаем путь и имя файла формулой

 

Спасибо.

Вот только я не понял что мне это дает? Я открыл ваш документ, там как был прописан ваш путь к C:UsersАдминистраторDesktopЛист Microsoft Excel (2).xlsx так и остался при открытии его с совершенно другого места.

Или вы имели в виду просто использование параметризации пути с помощью умной таблицыименованного диапозона? Если так, то какая разница где мне прописывать новый путь в теле запроса или в теле ячейки? Мне ведь нужно чтобы запрос сработал с любого места и с любого имени книги без использования умных таблиц

Изменено: Кирилл Беляев05.03.2021 07:09:16

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#4

05.03.2021 07:25:28

Доброе время суток.

Цитата
Кирилл Беляев написал:
Или вы имели в виду

Полагаю, Михаил полагал, что вы сами можете докрутить, используя функцию ЯЧЕЙКА

Относительный путь к данным PowerQuery

 

Тогда понятно) Я просто думал что неужели нет варианта без таких костылей..
Еще можно вот так полный путь получить, может кому пригодится.
=ИНФОРМ(«КАТАЛОГ»)&ПСТР(ЯЧЕЙКА(«filename»;A1);ПОИСК(«[«;ЯЧЕЙКА(«filename»))+1;ПОИСК(«.xls»;ЯЧЕЙКА(«filename»))-ПОИСК(«[«;ЯЧЕЙКА(«filename»))-1)&».xlsm»

Изменено: Кирилл Беляев05.03.2021 07:32:45

 

buchlotnik

Пользователь

Сообщений: 3863
Регистрация: 31.10.2014

Excel 365 Бета-канал

#6

05.03.2021 07:34:20

Цитата
Андрей VG написал:
сами можете докрутить

не, Михаил сам докрутил — лист1, А1 — просто немножко спрятал, но диспетчер имен все видит )))

Соблюдение правил форума не освобождает от модераторского произвола
<#0>

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#7

05.03.2021 07:47:59

Цитата
buchlotnik написал:
не, Михаил сам докрутил — лист1, А1 — просто немножко спрятал, но диспетчер имен все видит

Привет, Михаил.
Ну, да, спасибо. Спросонья не разглядел. Хотя можно было и диспетчере имён спрятать :)  Странно только как можно было не найти статью Дмитрия. Это как надо было поисковый запрос формулировать?!

 

Кирилл Беляев

Пользователь

Сообщений: 63
Регистрация: 21.09.2020

#8

05.03.2021 08:13:05

Цитата
Андрей VG написал:
Это как надо было поисковый запрос формулировать?!

«power query запрос к текущему файлу» и производные.
Я же пояснил, я про параметризацию пути знал, но думал есть красивый способ с указанием в запросе универсального значение какого-то, как это в VBA, а не окольными путями  

Изменено: Кирилл Беляев05.03.2021 08:13:35

 

Дмитрий(The_Prist) Щербаков

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#9

05.03.2021 09:19:47

Цитата
Кирилл Беляев написал:
запрос был к текущей книге без уточнения её адреса?

тут больше вопрос в том, что именно этим запросом требуется получить из книги :) Ведь изначально, при обращении к таблице в текущей книге, имя книги не используется, а используется CurrentWorkbook(), что как бы само по себе уже ответ на вопрос. Другой вопрос в том, что может нужны вовсе не имена и умные таблицы, а весь контент. Тут уже без граблей(описанных выше в теме) не обойтись.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Кирилл Беляев

Пользователь

Сообщений: 63
Регистрация: 21.09.2020

#10

05.03.2021 10:39:18

Цитата
Дмитрий(The_Prist) Щербаков написал:
Другой вопрос в том, что может нужны вовсе не имена и умные таблицы

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

 

Михаил Л

Пользователь

Сообщений: 2639
Регистрация: 19.02.2020

#11

05.03.2021 11:24:50

Цитата
Кирилл Беляев написал:
так и остался при открытии его с совершенно другого места

А теперь нажмите Ctrl + Alt + F5
Кирилл Беляев написал:
какраз нужен был весь контент который таким образом непоказывается

Так же можно получить все значения листа

Изменено: Михаил Л05.03.2021 11:27:56

НА МЯСО В ПРОФИЛЕ

 

Кирилл Беляев

Пользователь

Сообщений: 63
Регистрация: 21.09.2020

#12

05.03.2021 11:29:52

Уже разобрались спасибо) не совсем очевидно было что белым шрифтом на белом фоне что-то написано было)

ADO — класс для работы с данными Excel при помощи SQL

nerv

Дата: Понедельник, 08.04.2013, 12:54 |
Сообщение № 1

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Всем привет!

Не то, чтобы готовое решение, но тем не менее…
Цель — простота и удобство работы с SQL из Excel.
Текущая версия 0.3

Методы:

  • Create — создает объект подключения. Автоматически вызывается при инициализации.
  • Connect — открывает соединение. Автоматически вызывается при запросе.
  • Destroy — уничтожает объект подключения и объект записей. Вызывается автоматически при выходе из программы.
  • Disconnect — закрывает открытые записи и подключения. Вызывается автоматически при выходе из программы.
  • Query — выполняет SQL запрос. Результат запроса помещается в объект Recordset. Возвращает время, когда был выполнен запрос.

Свойства:

  • Connection — объект соединения
  • Recordset — результат выполнения запроса
  • DataSoure — источник данных. Полное имя книги эксель.
  • Header — учитывать заголовки (да/нет). По умолчанию нет. В этом случае имена полей назначаются автоматически F1 … Fn. Если да, первая строка диапазона считается заголовком поля.

Пример работы
[vba]

Код

Sub Example()
      Dim ADO As New ADO  ‘ Создаем экземпляр класса

              ADO.Query («SELECT F1 FROM [Лист1$];»)
      Range(«E1»).CopyFromRecordset ADO.Recordset

              ADO.Query («SELECT F2 FROM [Лист1$];»)
      Range(«F1»).CopyFromRecordset ADO.Recordset

              ‘ Закрываем соединение, чтобы не висело : )
      ADO.Disconnect

              ADO.Query («SELECT F1 FROM [Лист1$] UNION SELECT F2 FROM [Лист1$];»)
      Range(«G1»).CopyFromRecordset ADO.Recordset

              ‘ Тут автоматически закроется соединение
      ‘ и уничтожиться объекты Recordset и Connection
End Sub

[/vba]

К сообщению приложен файл:

ADO.zip
(17.0 Kb)


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

Сообщение отредактировал nervПонедельник, 08.04.2013, 14:36

 

Ответить

Gustav

Дата: Понедельник, 08.04.2013, 13:50 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

985

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

Цитата (nerv)

Цель — простота и удобство работы с SQL из Excel.

не «с SQL из Excel», а «с данными Excel при помощи SQL» — именно в этом, мне кажется, офигенная фишка подобного подхода!

Есть и ограничение у этого подхода в принципе, которое иногда бывает критичным — можно работать только с заранее СОХРАНЕННЫМИ на диске рабочими книгами.


МОИ: Ник, Tip box: 41001663842605

 

Ответить

nerv

Дата: Понедельник, 08.04.2013, 14:38 |
Сообщение № 3

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Цитата (Gustav)

не «с SQL из Excel», а «с данными Excel при помощи SQL»

спасибо, исправил

Цитата (Gustav)

Есть и ограничение у этого подхода в принципе, которое иногда бывает критичным — можно работать только с заранее СОХРАНЕННЫМИ на диске рабочими книгами.

будем иметь ввиду


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

ikki

Дата: Понедельник, 08.04.2013, 14:39 |
Сообщение № 4

Группа: Друзья

Ранг: Старожил

Сообщений: 1906


Репутация:

504

±

Замечаний:
0% ±


Excel 2003, 2010

еще одно ограничение: полная невозможность использовать DELETE для таблиц Excel.
я совсем недавно споткнулся об эти грабли и моё огорчение ещё не развеялось.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki

 

Ответить

nerv

Дата: Понедельник, 08.04.2013, 14:43 |
Сообщение № 5

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Цитата (ikki)

еще одно ограничение: полная невозможность использовать DELETE для таблиц Excel

ну а что мешает перезаписать их?


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

ikki

Дата: Понедельник, 08.04.2013, 14:51 |
Сообщение № 6

Группа: Друзья

Ранг: Старожил

Сообщений: 1906


Репутация:

504

±

Замечаний:
0% ±


Excel 2003, 2010

то самое желание решать задачу одной командой без головной боли.
кроме того, это будет цикл и это будет долго.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki

 

Ответить

nerv

Дата: Понедельник, 08.04.2013, 15:50 |
Сообщение № 7

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Цитата (ikki)

то самое желание решать задачу одной командой

я согласен, что получиться конструкция сложнее, но можно и без циклов. Например (данные только в столбце А):
[vba]

Код

Sub Example()
     Dim ADO As New ADO

           ‘ ADO.Query («DELETE FROM [A:A] WHERE F1 = 2;»)

           ADO.Query («SELECT * FROM [A:A] WHERE F1 <> 2;»)
     Columns(«A»).Insert
     Range(«A1»).CopyFromRecordset ADO.Recordset
     Columns(«B»).Delete
End Sub

[/vba]


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

Сообщение отредактировал nervПонедельник, 08.04.2013, 16:01

 

Ответить

LightZ

Дата: Понедельник, 08.04.2013, 15:53 |
Сообщение № 8

Группа: Авторы

Ранг: Форумчанин

Сообщений: 120


Репутация:

48

±

Замечаний:
0% ±


Недавно заметил неприятный нюанс: после Execute запроса (например из Экселя в Аксесс), в некоторых ситуациях результат запроса выходит отсортирован.
Это неприятно в тех случаях, когда необходим запрос по типу ВПРа, пример:

[vba]

Код

      sConn = «Provider=Microsoft.ACE.OLEDB.12.0;Data Source=» & ThisWorkbook.Path & «price.accdb;»

              Set pConn = CreateObject(«ADODB.Connection»): pConn.Open sConn
      sSql = «SELECT t2.Pr » & _
            «FROM [Excel 12.0;Database=» & ThisWorkbook.FullName & «;HDR=Yes].[Расчет$A3:BS» & finalRow & «] AS t1 » & _
            «LEFT JOIN [data] As t2 » & _
                  «ON (t1.Filid = t2.Filid AND t1.Lid = t2.Lid);»

      shRasch.Range(«bs4»).CopyFromRecordset pConn.Execute(sSql)

[/vba]
На данный момент страхуюсь дополнительной сортировкой данных в Экселе


E-mail: overseerpower@gmail.com
Skype: Bogdan_Rud
WMR: R166238237296

Сообщение отредактировал LightZПонедельник, 08.04.2013, 15:54

 

Ответить

nerv

Дата: Понедельник, 08.04.2013, 16:07 |
Сообщение № 9

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Цитата (Gustav)

«с данными Excel при помощи SQL»

и все-таки, наверное, это не совсем так. Например, запрос Богдана к аксу с моим классом можно переписать так
[vba]

Код

Sub Example2()
       Dim ADO As New ADO

                 ADO.DataSource = ThisWorkbook.Path & «price.accdb»

                 ADO.Query («SELECT t2.Pr » & _
                   «FROM [Excel 12.0;Database=» & ThisWorkbook.FullName & «;HDR=Yes].[Расчет$A3:BS» & finalRow & «] AS t1 » & _
                   «LEFT JOIN [data] As t2 » & _
                       «ON (t1.Filid = t2.Filid AND t1.Lid = t2.Lid);»)

                  shRasch.Range(«bs4»).CopyFromRecordset ADO.Recordset
End Sub

[/vba]
Не проверял, но должно работать smile

Спасибо за примеры. Вижу, что надо доработать smile


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

Сообщение отредактировал nervПонедельник, 08.04.2013, 16:10

 

Ответить

nerv

Дата: Среда, 01.05.2013, 14:16 |
Сообщение № 10

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Решил выложить обновленную версию класса.
На данный момент актуальная версия 0.5.

Зачем вообще он нужен?
Позволяет писать меньше кода, удобно работать (на мой взгляд).

Что из себя представляет?
Объект — ADO, свойства — «стандартные» Connection и Recordset. Т.е. объект ADO своего рода обертка.

Как начать работу?
Для того, чтобы начать работу с объектом ADO, надо его создать:
[vba]

[/vba]

Как сделать запрос к данным текущей книги?
В данном запросе будут выбраны все данные из столбцов A:B с Листа1 текущей книги.
[vba]

Код

Sub Example()
     Dim ADO As New ADO

               ADO.Query («SELECT * FROM [Лист1$A:B]»)
End Sub

[/vba]
При этом используются настройки по умолчанию: Header = No, DataSource = ThisWorkbook.FullName

Как сделать запрос к данным текущей книги используя имена полей / заголовки столбцов?
[vba]

Код

Sub Example()
     Dim ADO As New ADO

               ADO.Header = True
     ADO.Query («SELECT FieldName FROM [Лист1$A:B]»)
End Sub

[/vba]

Как сделать запрос к данным другой книги?
[vba]

Код

Sub Example()
     Dim ADO As New ADO

               ADO.DataSource = Workbook.FullName   ‘ полный путь к книге
     ADO.Query («SELECT * FROM [Лист1$A:B]»)
End Sub

[/vba]

Как сделать запрос к «произвольным» данным (базе данных, текстовым файлам и т.п.).
[vba]

Код

Sub Example()
     Dim ADO As New ADO

               ADO.Connect («Your connection string»)
     ADO.Query («SELECT * FROM …»)
End Sub

[/vba]
Т.е. в данном случае формирование строки подключения ложится целиком на плечи программиста.

Я сделал запрос. Где результат?
Результат выполнения запроса зхранится в объекте Recordset. Достучаться до него можно так:
[vba]

[/vba]

Как поместить результат выполнения запроса на лист?
[vba]

Код

Sub Example()
     Dim ADO As New ADO

               ADO.Query («SELECT * FROM [Лист1$A:B]»)

               Range(«D1»).CopyFromRecordset ADO.Recordset    ‘ поместить результат запроса на лист начиная с ячейки A1
End Sub

[/vba]

Как записать результат выполнения запроса в массив?
например, используя стандартный метод getRows() объекта Recordset
[vba]

Код

Sub Example()
     Dim ADO As New ADO
     Dim Arr As Variant

               ADO.Query («SELECT * FROM [Лист1$A:B]»)

               Arr = ADO.Recordset.getRows()    ‘ записать результат выполнения запроса в массив
End Sub

[/vba]
Но в этом случае массив будет иметь немного нестандартный вид.
Еще один способ, кот. позволяет получить «стандартный» двумерный массив:
[vba]

Код

Sub Example()
     Dim ADO As New ADO
     Dim Arr As Variant

               ADO.Query («SELECT * FROM [Лист1$A:B]»)

               Arr = ADO.ToArray()
End Sub

[/vba]

Сахар
Метод Query принимает ParamArray, что позволяет писать запросы наглядно и достаточно лаконично (без лишней конкатенации строк)
[vba]

Код

Sub Example()
     Dim ADO As New ADO

               ADO.Query «SELECT F1», _
           «FROM [Sheet1$A:B]», _
           «WHERE F2 > 0»
End Sub

[/vba]

Файл с новой версией класса во вложении. К сожалению, форум не позволяет редактировать первый пост темы, поэтому обновления доки не будет (на форуме).

К сообщению приложен файл:

5242752.zip
(14.9 Kb)


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

Сообщение отредактировал nervСреда, 01.05.2013, 14:21

 

Ответить

LightZ

Дата: Четверг, 02.05.2013, 11:28 |
Сообщение № 11

Группа: Авторы

Ранг: Форумчанин

Сообщений: 120


Репутация:

48

±

Замечаний:
0% ±


nerv, +


E-mail: overseerpower@gmail.com
Skype: Bogdan_Rud
WMR: R166238237296

 

Ответить

nerv

Дата: Суббота, 01.06.2013, 13:12 |
Сообщение № 12

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

актуальные версии и дока здесь


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

AndreTM

Дата: Вторник, 04.06.2013, 02:24 |
Сообщение № 13

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

Цитата (nerv)

актуальные версии и дока здесь

Поскольку ты в последнне время увлёкся UTF-8, позволю себе выложить прямо сюда актуальный модуль класса в ANSI-кодировке. А то юзеры обычно не настолько продвинуты, чтобы ещё и декодированием заниматься…

К сообщению приложен файл:

ADO.cls
(5.3 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010

 

Ответить

nerv

Дата: Среда, 05.06.2013, 23:31 |
Сообщение № 14

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Цитата (AndreTM)

Поскольку ты в последнне время увлёкся UTF-8

github не понимает ansi. В любом случае анси версию можно было из файла забрать. Не каждый, конечно, догадается, но тем не менее…

спасибо )


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

maradona

Дата: Понедельник, 07.10.2013, 17:26 |
Сообщение № 15

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Столкнулся с проблемой связанной с переносом файла на другой компьютер, не осуществляется запрос в макросе. Видимо несоответствие библиотек ? Помогите? В модуле ничего не менял, эксель 2007 на XP

 

Ответить

nerv

Дата: Понедельник, 07.10.2013, 19:34 |
Сообщение № 16

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Я по фотографии порчу не снимаю :)

В личку писать не надо, лучше создайте тему на форуме.

А личку платно и дорого )


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

Сообщение отредактировал nervПонедельник, 07.10.2013, 19:37

 

Ответить

Watcher_1

Дата: Суббота, 02.11.2013, 14:49 |
Сообщение № 17

Приветствую!
А как ваш класс будет реагировать на колличество записейц больше 65536 строк. Аналогичная функция RDmitry просто не видит такое кол-во строк.
Возможно ли обойти это ограничение?

 

Ответить

AndreTM

Дата: Суббота, 02.11.2013, 16:16 |
Сообщение № 18

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

Watcher_1, достаточно исходный проект (содержащий класс ADO) запустить в Excel выше 2003-го.


Skype: andre.tm.007
Donate: Qiwi: 9517375010

 

Ответить

Watcher_1

Дата: Воскресенье, 03.11.2013, 20:39 |
Сообщение № 19

Уважаемый AndreTM
Прочитав ваш ответ может сложиться впечатление что 2003 позволяет занести больше 65536 строк…. ^_^
Задав этот вопарос я априори предполагаю офис выше 2003.

 

Ответить

Gustav

Дата: Четверг, 07.11.2013, 10:54 |
Сообщение № 20

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

985

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

актуальные версии и дока здесь

При просмотре кода класса вдруг увидел «4.0» в том месте, где обычно вижу «8.0». Подозреваю, что опечатка. Возможно, даже невольно ограничивающая функционал по тому же количеству строк — ведь в Excel 4.0 их было всего 16K. Или это сознательный шаг?

Private Function GetExcelConnectionString() As String
     Dim Params As String
     Params = IIf(Val(Application.Version) < 12, _
         «Provider=’Microsoft.Jet.OLEDB.4.0′;Data Source=’:1′;Extended Properties=’Excel 4.0;HDR=:2;IMEX=1′;», _
         «Provider=’Microsoft.ACE.OLEDB.12.0′;Data Source=’:1′;Extended Properties=’Excel 12.0;HDR=:2;IMEX=1′;»)


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал GustavЧетверг, 07.11.2013, 10:55

 

Ответить

1 Power Query. Знакомство с Power Query В этом уроке мы познакомимся в Power Query.
Зачем нужен Power Query
Как установить Power Query
Как его Настроить
Как изменить запрос 2 Power Query. Подключение XML В этом уроке мы научимся подключаться к файлам в формате XML и импортировать эти данные в Excel. 3 Power Query. Уникальные значения двух столбцов В этом уроке мы получим уникальные значения из двух столбцов таблицы. 4 Power Query. Импорт таблиц PDF Импорт таблиц из файла PDF, импорт таблиц из множества PDF файлов с объединением в один датасет. 5 Power Query. Собрать разбитую строку В этом практическом уроке мы научимся соединять разбитую строку. Этот пример взят из реальной практики одного из спонсоров канала. 6 Power Query. Пивот со счетом В этом уроке мы создадим пивот, в котором будут пронумерованы столбцы. 7 Power Query. Минимальное значение в диапазоне В этом уроке мы найдем минимальное значение в диапазоне строк. 8 Power Query. Нарастающий итог 2 В этом уроке мы изучим еще один способ сделать нарастающий итог в Power Query. 9 Power Query. Нарастающий итог 3 В этом уроке мы разберем еще один способ выполнить нарастающий итог в Power Query. 10 Power Query. Прирост населения Китая В этом уроке мы сравним прирост населения Китая с приростом населения мира в целом за последние 200 лет. 11 Power Query. Повторяющиеся значения в строке В этом уроке разберем как определить есть ли в строке повторения. 12 Power Query. Таблица навигации по функциям М В этом уроке вы узнаете как создать таблицу навигации по всем функциям языка Power Query. 13 Power Query. Удалить запросы и модель данных из книги Разберем как быстро удалить все запросы и модель данных из текущей книги. 14 Power Query. Открыть еще 1 Excel и еще 3 трюка В этом видео я покажу как открыть еще 1 файл Excel, если у вас уже запущен Power Query. 15 Power Query. Подключиться к ZIP архиву Пользовательская функция для подключения к zip файлу. Подключимся к txt файлу, который находится в zip архиве. 16 Power Query. Импорт Word Импортируем таблицу из документа Word. Для спонсоров разберем импорт таблицы с объединенными ячейками. 17 Power Query. Фильтрация списком В этом уроке мы хотим отфильтровать таблицу при помощи списка, например, хотим получить продажи определенных товаров. 18 Power Query. Пользовательская функция Switch В этом уроке мы создадим пользовательскую функцию Switch. 19 Power Query. Информация о формате, Чтение zip В этом уроке мы узнаем как получить информацию о формате ячеек при помощи Power Query. 20 Power Query. Импорт данных из gz В этом уроке мы разберем как импортировать файл в формате gz. 21 Power Query. Удалить лишние пробелы, Text.Split В этом уроке мы научимся удалять лишние пробелы в текстовом столбце таблицы. 22 Power Query. Параметры в SQL-запросе Вы хотите, чтобы в ваш SQL-запрос подставлялось значение из параметра, источником которого является ячейка с листа Excel. 23 Power Query. Параметры в SQL-запросе 2 Ваш запрос очень большой и количество параметров в нем большое. Как организовать все так, чтобы было удобно работать. 24 Power Query. Добавить столбец в каждую таблицу табличного столбца В этом уроке вы узнаете как трансформировать табличный столбец, например, вы сможете добавить столбец индекса внутрь каждой таблицы табличного столбца. 25 Power Query. Интервальный просмотр 1 (ВПР 1) Объединить 2 таблицы с интервальным просмотром = 1. 26 Power Query. Относительный путь к файлу и папке Если ваш источник находится в той же папке, что и отчет, то вы можете указать относительный путь. В таком случае подключение не будет ломаться, если вы запустите файл на другом компьютере. 27 Power Query. Нарастающий итог в каждой категории Применим функцию нарастающего итога не ко всей таблице, а к определенному окну. 28 Power Query. ВПР без Merge или Join Вам нужно подставить данные из столбца другой таблицы. Как это сделать без объединения таблиц.

Хитрости »

30 Ноябрь 2016              47164 просмотров


В большинстве случаев создание запросов PowerQuery создается на основании файлов Excel, отличных от того файла, в котором сам запрос. Как пример — одна из статей на этом сайте: План-фактный анализ в Excel при помощи Power Query. Там идет обращение к некоторым вспомогательным файлам с данными и запрос ко всем файлам определенной папки. Т.е. мы можем знать только папку относительно файла с самим запросом и имена некоторых вспомогательных таблиц. И здесь как раз возникает нюанс: если впоследствии переместить или переслать файл с запросом (или даже полностью всю модель данных со всеми файлами) — то придется для каждого запроса к отдельному файлу менять источник. Это можно сделать либо через Параметры источника данных самого запроса:

  • Для пользователей Excel 2010-2013:
    Перейти на вкладку Power Query -группа Настройки(Options)Параметры источника данных(Data Source Settings)
  • для пользователей 2016 и выше:
    Перейти на вкладку Данные(Data)Создать запрос(New Query)Параметры источника данных(Data Source Settings)

либо изменив текст каждого запроса в редакторе запросов, изменив там строку источника:
Смена источника в редакторе
И в том и в другом случае после смены каждого источника придется ждать обновления запросов. Как ни странно, но стандартно, без танцев с бубном, сделать некий относительный путь(указав лишь часть пути, как это делается в web-программировании) к источнику данных нельзя.


Как же вообще сделать возможность обновления источника данных при смене расположения файлов?
Есть два варианта:
Вариант 1
Не совсем автоматический, но способный чуть облегчить жизнь — использовать возможность создания параметров для запросов. Параметр — это некая именованная константа, которая может быть как одним значением(число, текст, дата и т.д.), так и целой таблицей(возможно впоследствии добавят возможность создания вычисляемых параметров, но на момент написания статьи это не поддерживалось). В нашем случае это будет одно значение — путь к основной папке. Чтобы создать новый параметр необходимо перейти в редактор запросов(выбрать любой запрос в книге -Правая кнопка мыши -Изменить) и на вкладке Главная выбрать Управление параметрамиСоздать параметр.
Создание параметра
В появившемся окне задаем необходимые значения:

  • Обязательно — читать как Обязательный, если флажок установлен и Необязательный, если флажок снят. Отвечает за необходимость указывать значение. Если флажок установлен — то параметр не будет создан/изменен, пока мы не укажем Текущее значение. Если флажок снят — то значение параметра допускается оставить пустым.
  • Имя параметра — Без комментариев, я указал здесь sPath
  • по желанию добавляем описание к параметру, ровным счетом это ни на что не влияет
  • Тип данных параметра — в нашем случае это Текст. Здесь лучше не рисковать, указывая Любой(Any), т.к. в этом случае можем получить ошибку запроса.
  • Предлагаемые значения — выбираем Любое значение(логичнее было бы назвать этот пункт «Одно значение». Т.к. это больше подходит на мой взгляд).
  • Текущее значение — это как раз то значение, которое и будет хранить наш параметр. Здесь я указываю путь к основной папке: G:Готовая модель ПланФактного анализа. Указываю со слешем на конце пути, чтобы не добавлять его в каждый источник после.

Теперь останется для каждого запроса добавить ссылку на этот параметр вместо жестко прописанного пути. Для этого в расширенном редакторе запросов(Главная -Расширенный редактор) для каждого запроса необходимо изменить переменную часть пути к файлам на наш параметр sPath:
Путь через параметр
Обращаю внимание, что после имени параметра(sPath) идет амперсанд(&). Он необходим для объединения двух текстовых строк в одну.
А теперь пара ложек дегтя для этого способа:

  1. Самый очевидный недостаток: при переносе файлов в любом случае необходимо будет заходить в редактор запросов (ГлавнаяУправление параметрамиИзменить параметры) и изменять путь, указанный в параметре на новый. Так же это можно сделать напрямую из редактора запросов, раскрыв в левой части область запросов, выбрав параметр и вписав новое значение:
    Изменить значение параметра
  2. И не очевидный недостаток: частенько такой подход приводит к ошибке получения данных при слиянии связанных запросов. Что делает этот способ не жизнеспособным в полной мере для большинства распространенных задач

Вариант 2
Создать еще один запрос в основной книге, на основании формул в Excel. Решение основано на возможностях встроенной функции Excel ЯЧЕЙКА(CELL). С её помощью можно получить полный путь к файлу, имя листа и книги. Чуть более подробно синтаксис этой функции и способы получения имени листа и книги я описывал в этой статье: Как получить имя листа формулой.
Итак, для начала нам необходимо на новом листе создать новую таблицу с двумя столбцами: значение и описание. В качестве значения в первой строке у нас и будет как раз формула с функцией ЯЧЕЙКА:
=ПСТР(ЯЧЕЙКА(«filename»;A1);1;ПОИСК(«[«;ЯЧЕЙКА(«filename»;A1))-1)
данная формула возвращает только путь к файлу, в котором записана. Что нам в общем-то от неё и надо.

При желании можно дописать подсказку к значению. Я это сделал для демонстрации и чтобы было понятно — что мы сможем потом дополнять эту таблицу другими переменными значениями при необходимости.

Теперь из этой таблицы необходимо сделать динамическую, или как их еще называют — умную: выделяем ячейки с данными(A1:B2) -вкладка Вставка(Insert) и выбрать Таблица(Table). Галочку «Мои данные содержат заголовки» оставляем включенной, даем понятное имя таблице — Parameters:
Создание умной таблицы

Далее выделяем любую ячейку внутри созданной таблицы и создаем новый запрос: вкладка ДанныеИз таблицы(для пользователей PowerQuery 2013 и 2010 — вкладка PowerQuery -Из таблицы). Имя запроса у нас будет совпадать с именем таблицы — Parameters и этот запрос будет содержать как раз все значения нашей умной таблицы.
И теперь нам надо из этого запроса получить значение только одной конкретной ячейки — первой ячейки столбца «Значение»(в которой у нас формулой возвращается путь к папке). Для этого придется чуть пошаманить. Нам необходимо получить ссылку на таблицу «Parameters» и уже из неё получить значение нужной ячейки. Все это придется проделать на языке M, но звучит страшнее, чем выглядит — это всего одна строка:
Excel.CurrentWorkbook(){[Name=»Parameters»]}[Content]{0}[Значение]
Теперь разберем по шагам:

    Excel.CurrentWorkbook() — непосредственно функция, которая получает данные обо всех умных таблицах(и именованных диапазонах) внутри книги Excel, в которой создан этот запрос (CurrentWorkbook — текущая книга).
    {[Name=»Parameters»]} — так мы даем понять функции Excel.CurrentWorkbook, что нам нужны данные исключительно из объекта с именем «Parameters»(это наша умная таблица). На всякий случай уточню: получить просто ссылки на ячейки листа не получится, т.к. функция Excel.CurrentWorkbook данных о листах не получает вообще. Только именованные диапазоны и умные таблицы.
    [Content] — все содержимое таблицы «Parameters»
    {0} — пожалуй, самая хитрая часть для «не программистов» :) Это номер строки в указанной таблице(«Parameters»). При этом номера строк в запросе начинают отсчет с 0 и заголовки при этом не учитываются. Т.е. наш параметр находится физически во второй ячейке столбца «Значение» таблицы «Parameters» на листе. Но в рамках самой таблицы это первая её строка, т.к. заголовок не учитываем. Но т.к. в таблице отсчет начинается с 1, а в запросах с 0 — то и нам надо указывать, учитывая эту особенность. Если бы мы обращались ко второй строке таблицы — указать необходимо было бы 1. И да — указывать обязательно в фигурных скобках.
    [Значение] — здесь в квадратных скобках указывается имя столбца(без всяких кавычек). Если бы столбец в таблице был всего один — то можно было бы его не указывать вовсе. Но т.к. у нас их больше — то указание обязательно, иначе запрос вернет всю строку — т.е. значения всех столбцов таблицы.

Т.е. строка Excel.CurrentWorkbook(){[Name=»Parameters»]}[Content]{0}[Значение] означает: из книги с запросом обратиться к таблице «Parameters»({[Name=»Parameters»]}), считать все данные([Content]) и отобрать оттуда значение первой строки({0}) столбца «Значение»([Значение])
И эта строка возвращает исключительно путь к папке — именно тот, который у нас получается в результате вычисления формулы с ЯЧЕЙКА.
Теперь, после того как разобрались что делает чудо-строка — осталось понять как это применить. Надо просто для каждого запроса перейти в редактор и в строке с источником:
Источник = Folder.Files(«C:Готовая модель ПланФактного анализаФакт»),
вместо части пути указать созданную строку запроса, добавив амперсанд(&) для объединения разных значений:
Источник = Folder.Files(Excel.CurrentWorkbook(){[Name=»Parameters»]}[Content]{0}[Значение] & «Факт»),
Изменить источник данных на динамический

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

Скачать готовую модель план-фактного анализа с динамически изменяющимся путем к данным:

  Готовая модель План-фактного анализа — относительный путь (491,0 KiB, 3 043 скачиваний)


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Excel запрос к таблице на листе
  • Excel запрос данных с сайта
  • Excel запрос в другой файл
  • Excel запрещенное действие политикой организации
  • Excel запретить удаление строки

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии