Виконати запит з Access через Excel запит на VBA. Формування рядка SQL-запиту у VBA Виконання команд SQL через VBA

За допомогою макрокоманди Відкрити Запиту базі даних Access можна відкривати запити на вибірку та перехресні запити в режимі таблиці, в Конструкторі або в режимі попереднього перегляду. Ця дія запускає запит на зміну. Ви також можете вибрати режим введення даних для запиту.

Примітка:Ця макрокоманда доступна лише серед бази даних Access (MDB або ACCDB). Якщо ви використовуєте середовище проекту Access (ADP), див. ВідкритиПодання, Відкрити Збережену Процедуруі ВідкритиФункцію. Макрокоманда Відкрити Запитнедоступна у програмах Access.

Налаштування

Макрокоманда Відкрити Запитмає такі аргументи:

Аргумент макрокоманди

Опис

Ім'я запиту

Ім'я запиту, що відкривається. Виберіть ім'я в списку. Це є обов'язковим аргументом.

При виконанні в базі даних бібліотеки макросу, що містить макрокоманду Відкрити Запит, Access спочатку шукає запит із цим ім'ям у базі даних бібліотеки, а потім у поточній базі даних.

Подання, у якому буде відкриватися запит. Виберіть поле Видзначення Таблиця, Конструктор, Попередній перегляд , Зведена таблицяабо Зведена діаграма. За замовчуванням використовується Таблиця.

Примітка:Подання "Зведена таблиця" та "Зведена діаграма" недоступні у версіях Access, починаючи з Access 2013.

Режим даних

Режим введення даних для запиту. Цей параметр стосується лише запитів, відкритих у режимі таблиці. Виберіть Додати(користувачі зможуть додавати нові записи, але не змінювати існуючі), Змінити(користувачі зможуть змінювати існуючі записи, а також додавати нові) або Тільки для читання(Користувачі зможуть лише переглядати записи). За замовчуванням використовується значення Змінити.

Примітки

Якщо для аргументу Видзадане значення Таблиця, Access відображає результат, якщо використовується запит на вибірку, перехресний запит, запит на об'єднання або запит до сервера, властивість ReturnsRecordsякого має значення Так. Якщо це запит на зміну, запит на визначення даних або запит на сервер, для властивості ReturnsRecordsякого встановлено значення Ні, запит виконується.

Макрокоманда Відкрити Запитаналогічна подвійному клацаннюзапиту в області навігації або його клацання правою кнопкою миші в області навігації та вибору уявлення. Використовуючи макрокоманду, можна вибрати додаткові параметри.

Поради

    Ви можете перетягнути запит із області навігації у вікно конструктора макросів. При цьому буде автоматично створено макрокоманда Відкрити Запит, що відкриває запит у режимі таблиці.

    Якщо перейти в Конструктор, коли відкритий запит, значення аргументу Режим данихвидаляється. Цей параметр не діятиме, навіть якщо користувач повернеться до таблиці.

    Якщо ви не хочете відображати системні повідомлення, які зазвичай з'являються при виконанні запитів на зміну (у них йдеться про те, що це запит на зміну, та вказано кількість записів, на які він впливає), ви можете відключити їх за допомогою макрокоманди. Задати Попередження.

Щоб виконати макрокоманду Відкрити Запиту модулі Visual Basic для програм (VBA), використовуйте метод Відкрити Запитоб'єкта DoCmd.

Цей урок присвячений SQL запитамдо бази даних на VBA Access. Ми розглянемо як на VBA здійснюється запити INSERT, UPDATE, DELETE до бази даних, а також навчимося отримувати конкретне значення із запиту SELECT.

Ті, хто програмують на VBA Accessта працюючи при цьому з базою даних SQLсервера, дуже часто стикаються з таким простим і потрібним завданням як посил SQL запиту до бази даних, будь то INSERT, UPDATE або простий SQL запит SELECT . А оскільки ми програмісти-початківці ми теж повинні вміти це робити, тому сьогодні займемося саме цим.

Ми вже торкалися теми отримання даних із SQL сервера, де якраз на VBA писали код для отримання цих даних, наприклад у статті про Вивантаження даних у текстовий файл з MSSql 2008 або також трохи торкалися у матеріалі Вивантаження даних із Access у шаблон Word та Excel. але так чи інакше там ми розглядали це поверхово, а сьогодні пропоную поговорити про це трохи докладніше.

Примітка! Всі приклади нижче розглянуті з використанням ADP проекту Access 2003 та бази даних MSSql 2008. Якщо Ви не знаєте що взагалі таке ADP проект, то це ми розглядали в матеріалі Як створити і налаштувати ADP проект Access

Вихідні дані для прикладів

Припустимо, у нас є таблиця test_table, яка міститиме номери та назви місяців на рік (запити виконані з використанням Management Studio)

CREATE TABLE .( NOT NULL, (50) NULL) ON GO

Як я вже сказав, ми будемо використовувати ADP проект, налаштований на роботу з MS SQL 2008, в якому я створив тестову форму та додав кнопку start із підписом «Виконати», яка знадобиться для тестування нашого коду, тобто. весь код ми писатимемо в обробнику події « Натискання кнопки».

Запити до бази INSERT, UPDATE, DELETE на VBA

Щоб довго не тягнути відразу приступимо, припустимо, нам потрібно додати рядок до нашого тестову таблицю (код прокоментовано)/

Private Sub start_Click() "Оголошуємо змінну для зберігання рядка запиту Dim sql_query As String "Записуємо в неї потрібний нам запит sql_query = "INSERT INTO test_table (id, name_mon) VALUES ("6", "Червень")" "Виконуємо його DoCmd. RunSQL sql_query End Sub

У цьому випадку запит виконується за допомогою поточних параметрів підключення до бази даних. Можемо перевірити, чи додалися дані, чи ні.

Як бачимо, дані вставили.

Для того, щоб видалити один рядок, пишемо ось такий код.

Private Sub start_Click() "Оголошуємо змінну для зберігання рядка запиту Dim sql_query As String "Записуємо в неї запит на видалення sql_query = "DELETE test_table WHERE id = 6" "Виконуємо його DoCmd.RunSQL sql_query End Sub

Якщо ми перевіримо, то побачимо, що потрібний рядок вийшов.

Для оновлення даних записуємо в змінну sql_query запит update, сподіваюся, сенс зрозумілий.

Запит SELECT до бази на VBA

Тут справи трохи цікавіше, ніж з іншими конструкціями SQL.

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

Private Sub start_Click() "Оголошуємо змінні "Для набору записів з бази Dim RS As ADODB.Recordset "Рядок запиту Dim sql_query As String "Рядок для виведення підсумкових даних у повідомленні Dim str As String "Створюємо новий об'єкт для записів set RS = New ADODB .Recordset "Рядок запиту sql_query = "SELECT id, name_mon FROM test_table" "Виконуємо запит з використанням поточних налаштуваньпідключення проекту RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Циклом перебираємо записи While Not (RS.EOF) "Заповнюємо змінну для виведення повідомлення str = str & RS.Fields("id") & "-" & RS. Fields("name_mon") & vbnewline "перехід до наступного запису RS.MoveNext Wend "Виведення повідомлення msgbox str End Sub

Тут ми вже використовуємо цикли VBA Access, щоб перебрати всі значення в нашому наборі записів.

Але досить часто буває необхідно отримати не всі значення з набору записів, а лише одне, наприклад, назва місяця за його кодом. І для цього використовувати цикл якось накладно, тому ми можемо просто написати запит, який поверне всього одне значення і звертатися саме до нього, наприклад, отримаємо назву місяця за кодом 5

Private Sub start_Click() "Оголошуємо змінні "Для набору записів з бази Dim RS As ADODB.Recordset "Рядок запиту Dim sql_query As String "Рядок для виведення підсумкового значення Dim str As String "Створюємо новий об'єкт для записів set RS = New ADODB.Recordset "Рядок запиту sql_query = "SELECT name_mon FROM test_table WHERE id = 5" "Виконуємо запит з використанням поточних налаштувань підключення проекту RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Отримуємо наше значення str = RS. End Sub

Для універсальності ми вже звернулися за ім'ям осередку, а, по її індексу, тобто. 0, а це найперше значення в Recordset, в результаті ми отримали значення "Травень".

Як бачите, все досить просто. Якщо Вам досить часто потрібно отримувати конкретне значення з бази ( як в останньому прикладі), то рекомендую вивести весь код в окрему функцію (Як написати функцію на VBA Access 2003) з одним параметром, що входить, наприклад, код місяця ( якщо розглядати наш приклад) і просто де необхідно вивести це значення, викликати потрібну нам функцію з потрібним параметром і все, цим ми значно зменшимо код VBA і покращимо сприйняття нашої програми.

На сьогодні це все. Успіхів!

Access зберіг запит, який був розроблений за допомогою постачальника запитів myQuery. База даних підключена до системи через з'єднання ODBC. Макроси всі включені.

Excel Has встановлює з'єднання ADODB для підключення до бази даних через

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "MyDatabase.accdb" End With

Зазвичай ви просто пишете свій SQL, який чудово працює, а потім просто робите щось на зразок

Dim sqlQuery As String sqlQuery = "SELECT * FROM myTable" Set rs = New ADODB.Recordset rs.Open sqlQuery, con, ...

Але я хочу отримати доступ до запиту, який я зберіг у базі даних. Отже, як мені викликати збережений запит у базі даних, яку я щойно підключив.

Пробував уже

  1. con.Execute ("EXEC myQuery"), але той сказав мені, що не може бути знайти myQuery.
  2. rs.Відкрийте "myQuery", але він недійсний і вимагає від нього операторів SELECT/etc

5 відповідей

Я думаю, що ви можете розглядати це як процедуру, що зберігається.

Якщо ми почнемо прямо перед Dim sqlQuery As String

Dim cmd as new ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()

Потім заберіть роботу з набором записів після цього.

Ви були майже там

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "z:\docs\MyDatabase.accdb" End With con.Execute "MyQuery"

Просто залиш Exec.

Ви також можете додати параметри, це трохи застаріло, але має допомогти: оновити 2 поля в базі даних Access даними Excel і, можливо, макросом

Мені вдалося запустити запит на оновлення, який вже було збережено в Access, використовуючи:

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

Це давало мені помилки до тих пір, поки я не замінив прогалини в імені запиту підкресленням як бази даних Access, так і в операторі execute.

Це свого роду хакерська робота, але ви можете запросити запит. Тобто замініть рядок SQL наступним:

SqlQuery = "SELECT * FROM QueryName;"

Перед запуском необхідно переконатися, що Access була збережена, тобто. натисніть Ctrl + S (недостатньо, щоб запит було виконано в Access).

Давно з моменту створення цієї теми. Якщо я вірно розумію, я міг би додати щось корисне. Я дав ім'я тому, що описує OP: це процес використання SQL із запиту, збереженого в ACCDB, для запуску VBA через DAO або ADOBD. Я назвав його «Провайдер властивості об'єкта», навіть з акронімом OPP у моїх нотатках та для префіксу/суфіксу імені об'єкта.

Ідея полягає в тому, що існуючий об'єкт в ACCDB (зазвичай запит) надає властивість (зазвичай SQL), яку необхідно використовувати у VBA. Я зібрав воєдино функцію, просто щоб висмоктувати SQL із запитів для цього; Дивись нижче. Попередження: вибачте, але це все в DAO, я не дуже користуюся ADODB. Сподіваюся, ви все ще знайдете корисні ідеї.

Я навіть зайшов так далеко, що розробив метод використання/вставки замінних параметрів SQL, який приходить з цих запитів OPP. Потім я використовую VBA.Replace() для заміни перед використанням SQL в VBA.

Шлях об'єкта DAO до SQL-запиту в ACCDB виглядає так:

MySqlStatement = Access.Application.CurrentDb.QueryDefs("myQueryName").SQL

Я використовую параметри, що замінюються, оцінюючи те, що потрібно замінити, і вибираючи незвичайне ім'я для параметра, яке не може існувати в реальній базі даних. Здебільшого єдиними замінами, які я зробив, є імена полів або таблиць або висловлювання пропозицій WHERE та HAVING. Тому я називаю їх такими як "(ReplaceMe00000001)", а потім використовую функцію Replace() для виконання роботи...

SqlText = VBA.Replace(sqlText, "(ReplaceMe00000001)", "SomeActualParameter")

А потім використовуйте sqlText у VBA. Ось робочий приклад:

Public Function MySqlThing() Dim sqlText як String Dim myParamater як String Dim myExpression as String "Set everything up. sqlText = getSqlTextFromQuery("myQuery") myParameter = "(ReplaceMe00000001)" . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "The use the SQL. As DAO.QueryDefs Dim qdef As DAO.QueryDef Dim sqlText As String Set app = Access.Application Set db = app.CurrentDb Set qdefs = db.QueryDefs Set qdef = qdefs(oppName) oppGetSqlText = qdef

Відновлення даних