Макрос выполнение запроса в excel

Skip to content

На чтение 3 мин. Просмотров 3.2k.

Что делает макрос: Вот отличный макрос для тех из вас, кто часто копирует и вставляет результаты запросов Microsoft Access в Excel. В этом макросе вы используете DAO (Data Access Object), чтобы открыть и запустить запрос Access в фоновом режиме и вывода результатов в Excel.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как этот код работает
  4. Как использовать

Как макрос работает

В этом макросе вы указываете Excel базу данных Access и извлекаете данные из существующего запроса доступа. Затем вы сохраняете этот запрос в Recordset объекта, который вы можете использовать для заполнения таблиц Excel.
Необходимо установить ссылку на библиотеку объектов Microsoft Access.
В дополнение к библиотеке объектов доступа, необходимо установить ссылку на Microsoft DAO XX библиотеки объектов, где XX это номер версии. Обратите внимание, что вы можете увидеть несколько версий этой библиотеки в диалоговом окне Reference. Как правило, нужно выбрать последнюю версию Microsoft DAO. Установите флажок рядом с записью.

Код макроса

Sub VipolnitZaprosAccessIzExcel()
'Шаг 1: Объявляем переменные
Dim MyDatabase As DAO.Database
Dim MyQueryDef As DAO.QueryDef
Dim MyRecordset As DAO.Recordset
Dim i As Integer
'Шаг 2: Определить базу данных и запрос
Set MyDatabase = DBEngine.OpenDatabase _
("C:TempYourAccessDatabse.accdb")
Set MyQueryDef = MyDatabase.QueryDefs("Ваше имя запроса")
'Шаг 3: Откройте запрос
Set MyRecordset = MyQueryDef.OpenRecordset
'Шаг 4: Очистить предыдущее содержимое
Sheets("Лист1").Select
ActiveSheet.Range("A6:K10000").ClearContents
'Шаг 5: Скопируйте набор записей в Excel
ActiveSheet.Range("A7").CopyFromRecordset MyRecordset
'Шаг 6: Добавить имена заголовков столбцов в электронную таблицу
For i = 1 To MyRecordset.Fields.Count
ActiveSheet.Cells(6, i).Value = MyRecordset.Fields(i - 1).Name
Next i
End Sub

Как этот код работает

  1. Шаг 1 объявляет необходимые переменные. Переменная объекта MyDatabase выставляет ваш Access к приложению базы данных через библиотеку объектов DAO. MyQueryDef также является объектной переменной, которая служит контейнером памяти для целевого запроса. MyRecordset является Объект набора записей, содержащий результаты извлечения данных. В дополнение к этим, i целочисленная переменная используется для добавления заголовков столбцов.
  2. Шаг 2 определяет базу данных, которая содержит ваш целевой запрос, а также какой запрос будет запущен. Присвоение запроса объекту QueryDef позволяет вам по существу открыть запрос.
  3. Шаг 3 буквально запускает запрос в памяти. Результаты запроса затем сохраняются в MyRecordset объекте. После того, как результаты находятся в наборе записей, вы можете вывести данные в Excel.
  4. Шаг 4 готовится к выводу набора записей путем очистки области вывода. Это гарантирует отсутствие остатка предыдущих данных.
  5. На этом шаге используется метод CopyFromRecordset в Excel, чтобы получить возвращенный набор данных в электронные таблицы. В этом примере макрос копирует данные из объекта MyRecordset в Лист1 в ячейке А7.
  6. Наконец, вы перечисляете все поля в наборе записей, чтобы автоматически получить имя каждого заголовка и вводите его в Excel.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

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

Выйти из подобной ситуации поможет Excel.

Уверен, что ни для кого не секрет, что MS Excel имеет встроенный модуль VBA и надстройки, позволяющие подключаться к внешним источникам данных, то есть по сути является мощным инструментом для аналитики, а значит идеально подходит для решения подобных задач.

Для того чтобы обойти проблему, нам потребуется таблица с целевой выборкой, в которой содержатся идентификаторы, по которым можно достаточно корректно получить недостающую информацию (это может быть уникальный идентификатор, назовем его ID, или набор из данных, находящихся в разных столбцах), ПК с установленным MS Excel, и доступом к БД с недостающей информацией и, конечно, желание получить ту самую информацию.

Создаем в MS Excel книгу, на листе которой размещаем таблицу с идентификаторами, по которым будем в дальнейшем формировать запрос (если у нас есть уникальный идентификатор, для обеспечения максимальной скорости обработки таблицу лучше представить в виде одного столбца), сохраняем книгу в формате *.xlsm, после чего приступаем к созданию макроса.

Через меню «Разработчик» открываем встроенный VBA редактор и начинаем творить.

Sub job_sql() — Пусть наш макрос называется job_sql.

Пропишем переменные для подключения к БД, записи данных и запроса:

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String

Опишем параметры подключения:

sql = «Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=Storoge.company.ru Storoge.»

Объявим процедуру свойства, для присвоения значения:

Set cn = New ADODB.Connection
cn.Provider = » SQLOLEDB.1″
cn.ConnectionString = sql
cn.ConnectionTimeout = 0
cn.Open

Вот теперь можно приступать непосредственно к делу.

Организуем цикл:

For i = 2 To 1000

Как вы уже поняли конечное значение i=1000 здесь только для примера, а в реальности конечное значение соответствует количеству строк в Вашей таблице. В целях унификации можно использовать автоматический способ подсчета количества строк, например, вот такую конструкцию:

Dim LastRow As Long
LastRow = ActiveSheet.UsedRange.Row — 1 + ActiveSheet.UsedRange.Rows.Count

Тогда открытие цикла будет выглядеть так:

For i = 2 To LastRow

Как я уже говорил выше MS Excel является мощным инструментом для аналитики, и возможности Excel VBA не заканчиваются на простом переборе значений или комбинаций значений. При наличии известных Вам закономерностей можно ограничить объем выгружаемой из БД информации путем добавления в макрос простых условий, например:

If Cells(i, 2) = «Ваше условие» Then

Итак, мы определились с объемом и условиями выборки, организовали подключение к БД и готовы формировать запрос. Предположим, что нам нужно получить информацию о размере ежемесячного платежа [Ежемесячный платеж] из таблицы [payments].[refinans_credit], но только по тем случаям, когда размер ежемесячного платежа больше 0

sql = «select [Ежемесячный платеж] from [PAYMENTS].[refinans_credit] » & _
«where [Ежемесячный платеж]>0 and [Номер заявки] ='» & Cells(i, 1) & «‘ «

Если значений для формирования запроса несколько, соответственно прописываем их в запросе:

«where [Ежемесячный платеж]>0 and [Номер заявки] = ‘» & Cells(i, 1) & «‘ » & _
» and [Дата платежа]='» & Cells(i, 2) & «‘»

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

Cells(i, 3) = sql

в третьем столбце записываются запросы.

Выполняем SQL запрос:

Set rs = cn.Execute(sql)

А чтобы хоть как-то наблюдать за выполнением макроса выведем изменение i в статус-бар

Application.StatusBar = «Execute script …» & i
Application.ScreenUpdating = False

Теперь нам нужно записать полученные результаты. Для этого будем использовать оператор Do While:

j = 0
Do While Not rs.EOF
For ii = 0 To rs.Fields.Count — 1
Cells(i, 4 + j + ii) = rs.Fields(0 + ii) ‘& «;»

Указываем ячейки для вставки полученных данных (4 в примере это номер столбца с которого начинаем запись результатов)

Next ii
j = j + rs.Fields.Count
s.MoveNext
Loop
rs.Close
End If

— закрываем цикл If, если вводили дополнительные условия

Next i
cn.Close
Application.StatusBar = «Готово»
End Sub

— закрываем макрос.

В дополнение хочу отметить, что данный макрос позволяет обращаться как к БД на MS SQL так и к БД Oracle, разница будет только в параметрах подключения и собственно в синтаксисе SQL запроса.

В приведенном примере для авторизации при подключении к БД используется доменная аутентификация.

А как быть если для аутентификации необходимо ввести логин и пароль? Ничего невозможного нет. Изменим часть макроса, которая отвечает за подключение к БД следующим образом:

sql = «Provider= SQLOLEDB.1;Password=********;User ID=********;Data Source= Storoge.company.ru Storoge;APP=SFM»

Но в этом случае при использовании макроса возникает риск компрометации Ваших учетных данных. Поэтому лучше программно удалять учетные данные после выполнения макроса. Разместим поля для ввода пароля и логина на листе и изменим макрос следующим образом:

sql = «Provider= SQLOLEDB.1;Password=» & Sheets(«Лист аутентификации»).TextBox1.Value & «;User ID=» & Sheets(«Лист аутентификации «).TextBox2.Value & «;Data Source= Storoge.company.ru Storoge;APP=SFM»

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

Sheets(«Выгрузка»).TextBox1.Value = «« Sheets(»Выгрузка«).TextBox2.Value = »»

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

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

  1. Что делает макрос
  2. Код макроса
  3. Как работает макрос
  4. Как использовать
  5. Скачать файл

Ссылка на это место страницы:
#zadacha

Если вы часто копируете и вставляете результаты запросов Microsoft Access в Excel вам пригодится этот макрос. В этом макросе используется DAO (Data Access Object), чтобы открыть и запустить запрос Access в фоновом режиме и вывести результаты в Excel.

В этом макросе вы указываете Excel базу данных Access и извлекаете данные из существующего запроса. Затем вы сохраняете этот запрос в Recordset объекта, который вы можете использовать для заполнения таблиц Excel. Необходимо установить ссылку на библиотеку объектов Microsoft Access. В дополнение к библиотеке объектов доступа, необходимо установить ссылку на Microsoft DAO XX библиотеки объектов, где XX это номер версии. Обратите внимание, что вы можете увидеть несколько версий этой библиотеки в диалоговом окне Reference. Как правило, нужно выбрать последнюю версию Microsoft DAO. Установите флажок рядом с записью. 

Ссылка на это место страницы:
#formula

  1. Sub VipolnitZaprosAccessIzExcel()
  2. Dim MyDatabase As DAO.Database
  3. Dim MyQueryDef As DAO.QueryDef
  4. Dim MyRecordset As DAO.Recordset
  5. Dim i As Integer
  6. Set MyDatabase = DBEngine.OpenDatabase _
  7. ("C:TempYourAccessDatabse.accdb")
  8. Set MyQueryDef = MyDatabase.QueryDefs("Ваше имя запроса")
  9. Set MyRecordset = MyQueryDef.OpenRecordset
  10. Sheets("Лист1").Select
  11. ActiveSheet.Range("A6:K10000").ClearContents
  12. ActiveSheet.Range("A7").CopyFromRecordset MyRecordset
  13. For i = 1 To MyRecordset.Fields.Count
  14. ActiveSheet.Cells(6, i).Value = MyRecordset.Fields(i - 1).Name
  15. Next i
  16. End Sub

Ссылка на это место страницы:
#kak

1. Шаг 1 объявляет необходимые переменные. Переменная объекта MyDatabase привязывает Access к приложению базы данных через библиотеку объектов DAO. MyQueryDef также является объектной переменной, которая служит контейнером памяти для целевого запроса. MyRecordset является объектом набора записей, содержащий результаты извлечения данных. В дополнение к этим переменным i целочисленная переменная используется для добавления заголовков столбцов. 

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

3. Шаг 3 буквально запускает запрос в памяти. Результаты запроса затем сохраняются в MyRecordset. После того как результаты помещены в переменную, вы можете вывести данные в Excel. 

4. Шаг 4 готовится к выводу набора записей путем очистки листа Excel. Это гарантирует отсутствие остатка предыдущих данных. 

5. На этом шаге используется метод CopyFromRecordset в Excel, чтобы получить набор данных в электронной таблице. В этом примере макрос копирует данные из объекта MyRecordset на Лист1 в ячейку А7. 

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

Ссылка на это место страницы:
#touse

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

1. Активируйте редактор Visual Basic, нажав ALT + F11
2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта. 
3. Выберите Insert➜Module
4. Введите или вставьте код во вновь созданном модуле. 

Ссылка на это место страницы:
#file

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

1. Введите свою почту

2. Нажмите Зарегистрироваться

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

Привет! Меня зовут Дмитрий. С 2014 года Microsoft Cretified Trainer. Вместе с командой управляем этим сайтом. Наша цель — помочь вам эффективнее работать в Excel. 

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

Подписывайтесь на нас в соц.сетях:

«Макрос выполнения запроса»
– т.е. формирование новой таблицы из базы данных (БД Excel).

Задание:

Написать VBA макросы для следующих запросов

  1. Список «клиент-стоимость покупки-дата покупки» для покупок совершенных в январе 2015 года стоимостью более 1500 руб.
  2. Список «клиент-суммарную стоимость его покупок» за все время ведения БД.

Условие:

Вывод новой таблицы (результатов запроса) должен осуществляться на том же листе, начиная с ячейки «L1».
Существует и ведется БД Excel учета покупок в супермаркете или интернет-магазине.
Данные располагаются по колонкам следующим образом

  • А – номер по порядку;
  • B – дата покупки;
  • С – наименование товара;
  • D – стоимость товара (покупки);
  • E – фамилия и инициалы клиента;

Решение:

Ответ на вопрос «Как получить новые (нужные) данные на листе Excel из исходных (уже имеющихся) данных – всего ЗА ОДИН КЛИК» — тривиально прост!
Макрос – это программа преобразования «исходных данных» в нужные «результирующие данные».
Фильтрация данных – это как процесс получения полезного продукта из руды…, то есть отсев всего не нужного и повышение, таким образом, полезности информации…

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

Так, например:
очистка области листа Excel под новую таблицу (от старых данных)


Private Sub myClear()
    Range(Range("L1"), Range("L1").Offset(1000, 10)).ClearContents
End Sub

Для хранения данных, относящихся к одной операции, удобно сделать «сверхпростой» класс «Операция»… без единого метода… с открытыми полями: идентифицирующий номер, дата, продукт, цена, клиент и одним логическим полем, показывающим, включен ли объект в коллекцию…

VBA Excel вспомогательный класс

Рис.1 — Пример класса «Operac» для ввода и хранения данных (без методов)

И написать функцию, которая, получая единственным параметром (аргументом) i-номер строки листа Excel, возвращает объект данного класса с инициализированными данными


Private Function NewOperac(i As Integer) As Operac
Dim A As New Operac
    A.ID = Cells(i, 1)
    A.Dat = Cells(i, 2)
    A.Product = Cells(i, 3)
    A.Price = Cells(i, 4)
    A.Client = Cells(i, 5)
    A.InCollection = False
    Set NewOperac = A
End Function

Список «клиент-стоимость покупки-дата покупки» для покупок совершенных в январе 2015 года стоимостью более 1500 руб.

VBA Excel результат запроса

Рис.2 — Пример выполнения первого запроса

Макрос, обеспечивающий выполнение данного запроса может выглядеть так:


Private Sub query10()
Dim A As Operac
Dim i As Integer
Dim j As Integer

myScan 'сканирование БД для определения последней строки

j = nRow
'вывод заголовков полей для данного запроса
Cells(j, nCol) = "Клиент"
Cells(j, nCol + 1) = "Стоимость покупки"
Cells(j, nCol + 2) = "Дата покупки"

For i = 2 To n + 1
    Set A = NewOperac(i)
    If Mid(A.Dat, 4, 7) = "01.2015" Then
        If A.Price >= 1500 Then
            j = j + 1
            Cells(j, nCol) = A.Client
            Cells(j, nCol + 1) = A.Price
            Cells(j, nCol + 2) = A.Dat
        End If
    End If
Next i
End Sub

Где nRow = 1, nCol = 12 — это константы, описанные в начале модуля…

Const nRow As Integer = 1, nCol As Integer = 12 'откуда начинать вывод новой таблицы

Список «клиент-суммарную стоимость его покупок» за все время ведения БД.

VBA Excel результат запроса

Рис.3 — Пример выполнения второго запроса

Макрос может выглядеть так:


Private Sub query20()
Dim elem As Operac, A As Operac
Dim C As New Collection
Dim i As Integer
Dim j As Integer

myScan 'сканирование БД для определения последней строки

j = nRow
'вывод заголовков полей для данного запроса
Cells(j, nCol) = "Клиент"
Cells(j, nCol + 1) = "Сумма всех покупок"

For i = 2 To n + 1
    Set A = NewOperac(i)
    For Each elem In C
       If elem.Client = A.Client Then 'покупатель не уникальный, он уже есть в коллекции
            elem.Price = elem.Price + A.Price
            A.InCollection = True
            Exit For
        End If
    Next
    If Not A.InCollection Then C.Add A 'добавляю в коллекцию уникального покупателя
Next i
'вывод результата
For Each elem In C
    j = j + 1
    Cells(j, nCol) = elem.Client
    Cells(j, nCol + 1) = elem.Price
Next
End Sub

Другие примеры на тему «Автоматизация документов Microsoft Office Excel, Word, Access»

Если на этой странице не нашлось того, что Вы так искали…

        
Не расстраивайтесь, не все потеряно… Смело щелкайте…

       телефон:

+7(919) 572-59-92
+7(987) 848-79-61

  • Веб-запрос
  • Гиперссылки
  • Интернет

Функция GetQueryRange предназначена для автоматизации загрузки данных с веб-страниц.

Например, нам надо из макроса Excel получить данные с нескольких однотипных страниц сайта.

Самый простой способ достичь этого — выполнять почти идентичные веб-запросы (где незначительно отличаться будет только URL страницы),
каждый раз анализируя данные, загруженные веб-запросом на лист Excel

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

Sub ПримерИспользования()
    Dim ra As Range: On Error Resume Next
 
    Set ra = GetQueryRange("http://ExcelVBA.ru/", 6)
    Debug.Print ra.Address    ' переменная ra содержит ссылку на диапазон ячеек $A$1:$C$15,
    ' содержащий данные 6-й таблицы главной страницы сайта ExcelVBA.ru

    Set ra = GetQueryRange("http://excelvba.ru/sitemap.xml")
    Debug.Print ra.Address    ' теперь переменная ra содержит ссылку на диапазон ячеек $A$1:$D$502,
    ' содержащий данные карты сайта ExcelVBA.ru

End Sub

При запуске функции, создаётся скрытый лист с именем «tmpWQ» (если такой лист уже есть — используется существующий), и на этом листе выполняется веб-запрос к указанному сайту.

  • 70601 просмотр

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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

Понравилась статья? Поделить с друзьями:
  • Макрос выпадающий список для excel
  • Макрос выпадающий список word
  • Макрос вызвать функцию для excel
  • Макрос выделяющий текст в word
  • Макрос выделить все таблицы word