MyTetra Share
Делитесь знаниями!
Выгрузка данных из Access в шаблон Word
Время создания: 16.03.2019 23:43
Текстовые метки: Импорт из текста, access, word
Раздел: Разные закладки - VBA - Access - Импорт из текста
Запись: xintrea/mytetra_db_adgaver_new/master/base/1484021382gwqew1xj9s/text.html на raw.githubusercontent.com

Всем привет, сегодня поговорим о выгрузки данных из Access в такие приложения как Word и Excel. Но не о стандартном способе, который есть в  Access (связь с Office), а о способе, который позволяет выгружать данные в заданный шаблон как в Word, так и в Excel.

Другими словами это нужно тогда когда создать отчеты в Access по шаблону, который уже существует, например, в Word, невозможно или слишком трудоемко или как Вы знаете, может получаться просто коряво или самый распространенный вариант это когда много текста, который в отчете Access не так хорошо форматируется как в Word, а данных не так много, но необходимо автоматизировать, например это какие-то договора, заявления и так далее. Использование слияния из самого Word-а не очень удобно, поэтому я расскажу сегодня, как можно заполнять такие шаблоны напрямую из Access, путем нажатия на одну кнопку. Также как и необходимость выгрузки в шаблон Word, существует и необходимость выгрузки в шаблон Excel, и этот способ мы тоже сегодня рассмотрим.

Начнем с Word.

Вся разработка делится на две части это:

• Настройка шаблона Word;

• Настройка выгрузки данных в шаблон.

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

Открываем шаблон Word, для начала добавим необходимую панель инструментов, для этого нажимаем вид->панель инструментов и ставим галочку «формы». Теперь у вас отобразилась панель инструментом «Формы» все, что осталось сделать это встать на то место где необходимо добавить нужное поле и на панели выбрать «Текстовое поле». После в том месте у Вас появится серая область, которая свидетельствует о том, что поле добавлено. Теперь  необходимо задать имя этого поля, для того чтобы потом из access вставлять в него значения (стандартное названия не очень удобное). Для этого щелкните правой кнопкой мы по полю и нажмите «Свойства». В поле закладка напишите желаемое имя этого поля, я в примере назвал его MyTestPole

Создайте столько полей, сколько Вам нужно.

Ну и настройка шаблона закончена, только единственное сделайте этот шаблон только для чтения, а то пользователь возьмет, сформирует документ и сохранит его, и шаблон тем самым потеряется, а если сделать только для чтения, то у него такой возможности не будет только сохранять через «Сохранить как».

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

Примечание! Я использую Access в связке с MS Sql 2008 поэтому и данные буду брать от туда.

Допустим у Вас есть форма, сделайте на ней кнопку (я назвал ее testbutton) и в событие нажатие кнопки вставьте следующий код:

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 = False 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, конечно же. А после мы уже работаем с нашими объектами, т.е. заполняем их.

Теперь перейдем к Excel.

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

Существует несколько способов, как заполнять Excel шаблон, я опишу два, первый это тогда когда Вам просто необходимо проставить несколько полей, т.е. в источнике данных будет всего одна строка с несколькими полями и второй это когда строк будет уже несколько, причем Вы не знаете, сколько именно (в зависимости от каких то условий), но в шаблоне по умолчанию отведено для этого все пару строк, поэтому мы будем нужные нам строки добавлять, для того чтобы наши данные не накладывалась на строки ниже (допустим там примечание, подпись руководителя и т.д.). И совет, я здесь для примера использую всего один источник данных, а вы, если Вам необходимо заполнить шапку,  примечание и некое количество строк (т.е. область данных) то для этих задач используйте несколько источников (Recordset).

 
MyTetra Share v.0.65
Яндекс индекс цитирования