Вивантаження даних з Access в шаблон Word і Excel
- Експорт даних з Access в шаблон Word
- Код VBA для вивантаження даних в шаблон Word
- Експорт даних з Access в шаблон Excel
- Код VBA для вивантаження даних в шаблон Excel
Всім привіт, сьогодні ми поговоримо про те, як можна вивантажити дані з Access в такі додатки як Word і Excel. Але не про стандартному способі, який є в Access (зв'язок з Office), а про спосіб, який дозволяє вивантажувати дані в заданий шаблон як в Word, так і в Excel.
Іншими словами, це потрібно тоді, коли створити звіт в Access за шаблоном, який вже існує, наприклад, в Word, неможливо або дуже складно. Як Ви знаєте, звіт в Access може виводитися просто кострубато або, найпоширеніший варіант, це коли багато тексту, який в звіті Access не так добре форматується як в Word, а даних не так багато, але звіт необхідно автоматизувати, наприклад це якісь договору, заяви і так далі.
Використання злиття з самого Word-а не дуже зручно, тому сьогодні я розповім, як можна заповнювати такі шаблони безпосередньо з Access, шляхом натискання на одну кнопку.
Крім вивантаження в шаблон Word, іноді виникає і необхідність вивантаження в шаблон Excel, і цей спосіб ми теж сьогодні розглянемо.
Експорт даних з Access в шаблон Word
Вся розробка ділиться на дві частини, це:
- Налаштування шаблону Word;
- Налаштування вивантаження даних в шаблон.
Суть настройки шаблону полягає в тому, щоб проставити необхідні поля в тих місцях шаблону, де потрібно виводити ті чи інші дані. Це робиться за допомогою полів форми.
Примітка! Я використовую Microsoft Word 2003.
Відкриваємо шаблон Word, для початку додамо необхідну панель інструментів, для цього натискаємо «Вид -> Панель інструментів» і ставимо галочку «Форми». Тепер у Вас відобразилася панель інструментом «Форми». Все, що залишилося зробити - це вставити в місцях, в яких необхідно виводити дані, елементи «Текстове поле», які доступні на щойно доданої панелі інструментів.
Після додавання поля, у Вас з'явиться сіра область, яка свідчить про те, що поле додано. Тепер необхідно задати ім'я цього поля, для того щоб потім з access вставляти в нього значення (стандартне назви не дуже зручне). Для цього клацніть правою кнопкою миші по полю і натисніть «Властивості». В поле закладка напишіть бажане ім'я цього поля, я в прикладі назвав його MyTestPole.
Створіть стільки полів, скільки Вам потрібно.
На цьому настройка шаблону закінчена, рекомендую зробити цей шаблон тільки для читання, а то користувач візьме, сформує документ і збереже його, і шаблон тим самим загубиться, а якщо зробити його тільки для читання, то у нього такої можливості не буде, тільки зберігати через «Зберегти як».
Переходимо до більш цікавою завдання, це до реалізації самої вивантаження з Access в цей шаблон на VBA.
Примітка! Я використовую Access в зв'язці з MS SQL 2008 , Тому і дані буду брати від туди.
Код VBA для вивантаження даних в шаблон Word
Припустимо, у Вас є форма, зробіть на ній кнопку (я назвав її testbutton) і в подія натискання кнопки вставте наступний код VBA:
Private Sub testbutton_Click () 'Оголошуємо змінні Dim FileDialog As FileDialog Dim rsd As ADODB.Recordset Dim strSQL As String Dim WordApOb As Object Dim WordOb As Object Dim path As String Set rsd = New ADODB.Recordset' запит до бази даних для отримання необхідних даних strSQL = "select * from dbo.table where KOD =" & Me.kod & "" rsd.open strSQL, CurrentProject.Connection 'Вибираємо шаблон Set FileDialog = Application.FileDialog (msoFileDialogOpen)' прибираємо множинний вибір, він нам не потрібен FileDialog .AllowMultiSelect = False 'очистимо і встановимо фільтри FileDialog.Filters.Clear FileDialog.Filters.add "Word", "* .doc"' встановимо фільтр за замовчуванням FileDialog.FilterIndex = 1 'перевіряємо, що зробив user, якщо вибрав шаблон, то починаємо роботу If FileDialog.Show = Fal se Then 'Якщо немає, то виходимо Set dlgFile = Nothing Exit Sub End If' отримуємо шлях до файлу path = Trim (FileDialog.SelectedItems (1)) 'Очистимо змінну Set FileDialog = Nothing If path <> "" Then' Відстежуватимемо помилки On Error GoTo Err_testbutton_Click 'Створюємо об'єкт Word Set WordOb = CreateObject ( "Word.document")' Задаємо нашому документу значення з шаблону Set WordOb = GetObject (path) 'Задаємо значення об'єкту word.Application Set WordApOb = WordOb.Parent' робимо додаток word видимим WordApOb.Visible = True 'шукаємо наше поле в шаблоні WordOb.Bookmarks ( "mytestpole"). Select' задаємо йому нового значення з нашого Recordset WordApOb.Selection.TypeText Text: = Nz (rsd.Fields ( "field"). Value , "") 'і так далі по всім полям' в кінці перейдемо а початок нашого документа WordApOb.Selection.Goto wdGoToFirst 'і активуємо його WordApOb.Activate' Очистимо змінні Set WordOb = Nothing Set WordApOb = Nothing Exit_testbutton_Click: Exit Sub Err_testbutton_Click: MsgBox Err.Description 'в разі помилки будемо робити наступні' закриємо word без збереження WordOb.Close (wddonotsavechanges) WordApOb.Quit 'і також очистимо змінні Set WordOb = Nothing Set WordApOb = Nothing Resume Exit_testbutton_Click End If End SubКод прокоментований, тому складнощів виникнути не повинно. Тут весь сенс зводиться до створення об'єкта word.document і word.application. А після ми вже працюємо з нашими об'єктами, тобто заповнюємо їх.
Експорт даних з Access в шаблон Excel
У шаблоні Excel вже не потрібно створювати поля як в Word, так як тут ми вже будемо орієнтуватися за адресами осередків.
Існує кілька способів, як заповнювати Excel шаблон, я опишу два, перший - це тоді, коли Вам просто необхідно проставити кілька полів, тобто в джерелі даних буде всього один рядок з декількома стовпцями. Другий - це коли рядків буде вже кілька, причому Ви не знаєте, скільки саме (в залежності від якихось умов). У шаблоні за замовчуванням відведено для цього все пару рядків, тому ми будемо потрібні нам рядки додавати, для того щоб наші дані не накладалася на рядки нижче (припустимо там примітка, підпис керівника і т.д.). І рада, я тут, для прикладу, використовую всього одне джерело даних, а Ви, якщо Вам необхідно заповнити шапку, примітка і деяку кількість рядків (тобто область даних), можете використовувати кілька джерел (Recordset).
Код VBA для вивантаження даних в шаблон Excel
Спочатку додайте кнопку на форму (я її назвав testexcel) і вставте наступний код в подія «Натискання кнопки».
Private Sub testexcel_Click () 'Оголошуємо змінні Dim XL As Object Dim XLT As Object Dim newrow As Object Dim rsd As ADODB.Recordset Dim strSQL As String Set rsd = New ADODB.Recordset' Запит до бази даних strSQL = "select * from dbo. table where kod = "& Me.kod &" "rsd.open strSQL, CurrentProject.Connection 'Створюємо необхідні об'єкти Set XL = CreateObject (" Excel.Application ")' для прикладу показую, як можна відразу завантажувати шаблон без вибору Set XLT = XL.Workbooks.open ( "C: \ testfile.xls") '1 спосіб - якщо в джерелі даних всього один рядок With XLT.Worksheets ( "Лист1"). [a1] = rsd.Fields ( "field1"). [ b1] = rsd.Fields ( "field2"). [c1] = rsd.Fields ( "field3"). [d1] = rsd.Fields ( "field4") End With '2 спосіб - якщо рядків в джерелі кілька' причому ми врахуємо те, що у на є шапка і примітка в Excel 'і ми не знаємо, скільки рядків у нас буде вставлено' і тому рядки будемо додавати в разі потреби 'задамо, з якого рядка будемо починати вставляти дані Rowss = 10' для нумерації numrow = 1 'запускаємо цикл, він буде працювати до тих пір, поки не закінчаться строки в нашому джерелі While Not (rsd.EOF) 'дивимося, якщо рядків більше ніж ми задали в шаблоні If Rowss> = 12 Then' то додаємо рядок XLT.Worksheets ( "Лист1"). Rows (Rowss) .Insert 'Запам'ятаємо нашу рядок Set newrow = XLT.Worksheets ( "Лист1"). Rows (Rowss)' і вставити туди копію попереднього рядка 'для того якщо раптом у вас там ес ть об'єднані осередки або якісь потрібні дані 'так як новий рядок створиться без всяких об'єднань і значень XLT.Worksheets ( "Лист1"). Rows (Rowss - 1) .Copy newrow' це просто для прикладу як можна очистити якийсь діапазон всередині документа 'XLT.Worksheets ( "Лист1"). Range ( "A10: F10"). ClearContents' динамічно формуємо адресу потрібної комірки cell = "a" & Rowss 'і задаємо їй значення XLT.Worksheets ( "Лист1"). Range (cell ) = numrow cell = "b" & Rowss XLT.Worksheets ( "Лист1"). Range (cell) = rsd.Fields ( "field5"). Value 'переходимо на наступний рядок Rowss = Rowss + 1' переходимо на наступний рядок в джерелі даних rsd.MoveNext Else 'а це виконується до тих пір, поки не за ончатся задані рядки в шаблоні 'тобто якщо рядків в джерелі всього 1, то в код, який перед цим ми навіть не потрапимо cell = "a" & Rowss XLT.Worksheets ( "Лист1"). Range (cell) = numrow cell = "b" & Rowss XLT.Worksheets ( "Лист1"). Range (cell) = rsd.Fields ( "field5"). Value Rowss = Rowss + 1 rsd.MoveNext End If 'для нумерації numrow = numrow + 1' кінець циклу Wend 'це просто приклад як можна видалити рядок цілком 'XLT.Worksheets ( "Лист1"). Rows (20) .Delete' робимо Excel видимим XL.Visible = True 'Очищаємо змінні Set XL = Nothing Set XLT = Nothing Set newrow = Nothing End SubТут я також все докладно прокоментував, але якщо є питання, то задавайте їх у коментарях до даної статті.
До відома, я тут при створенні об'єкта і Word.Application і Excel.Application використовував пізніше зв'язування, для того щоб не додавати необхідні бібліотеки і забезпечити сумісність.
Сподіваюся, мої приклади Вам допоможуть!