Заполнение шаблона word из access

Обновлено: 06.07.2024

On Error GoTo Err_КнопкаДоверенность_Click

Dim appWD As Word.Application
Err.Number = 0
On Error GoTo notloaded
Set appWD = GetObject(, "Word.Application.8")
notloaded:
If Err.Number = 429 Then
Set appWD = CreateObject("Word.Application.8")
theError = Err.Number
End If
appWD.Visible = True

Set myDoc = .Documents.Add("y:\Номер.rtf")

Set MyRange = myDoc.Content
MyRange.Find.Execute FindText:="__Номер__", ReplaceWith:=Format([Реестр.Номер]), Replace:=wdReplaceAll
MyRange.Find.Execute FindText:="__Дата__", ReplaceWith:=Format([Дата]), Replace:=wdReplaceAll
MyRange.Find.Execute FindText:="__Срок действия__", ReplaceWith:=Format([Срок действия]), Replace:=wdReplaceAll
MyRange.Find.Execute FindText:="__Сотрудник__", ReplaceWith:=Format([Сотрудники.Номер]), Replace:=wdReplaceAll
MyRange.Find.Execute FindText:="__Дирекция__", ReplaceWith:=Format([Сотрудники.Дирекция]), Replace:=wdReplaceAll
MyRange.Find.Execute FindText:="__Срок действия__", ReplaceWith:=Format([Реестр.Срок действия]), Replace:=wdReplaceAll
MyRange.Find.Execute FindText:="__Номер и дата документа__", ReplaceWith:=Format([Реестр.Номер и дата документа]), Replace:=wdReplaceAll
MyRange.Find.Execute FindText:="__Паспорт__", ReplaceWith:=Format([Сотрудники.Документ]), Replace:=wdReplaceAll
End With

Exit_КнопкаДоверенность_Click:
Exit Sub

Err_КнопкаДоверенность_Click:
MsgBox Err.Description
Resume Exit_КнопкаДоверенность_Click

Option Compare Database

Private Sub Кнопка41_Click()
On Error GoTo Err_Кнопка41_Click

Dim appWD As Word.Application
Err.Number = 0
On Error GoTo notloaded
Set appWD = GetObject(, "Word.Application")
notloaded:
If Err.Number = 429 Then
Set appWD = CreateObject("Word.Application")
theError = Err.Number
End If
appWD.Visible = True

Set myDoc = .Documents.Add("D:\Dogovor.rtf")

Set MyRange = myDoc.Content
MyRange.Find.Execute FindText:="__№ договора__", ReplaceWith:=Format([№ договора]), Replace:=wdReplaceAll
MyRange.Find.Execute FindText:="__Дата__", ReplaceWith:=Format([Дата]), Replace:=wdReplaceAll
MyRange.Find.Execute FindText:="__Клиент__", ReplaceWith:=Format([Клиент]), Replace:=wdReplaceAll

Exit_Кнопка41_Click:
Exit Sub

Err_Кнопка41_Click:
MsgBox Err.Description
Resume Exit_Кнопка41_Click

текста запроса нет, запрос сделан просто в БД там где таблицы и формы)
в том и загвозка что не могу дальше .

Данные клиента заносятся в форму за каждым клиентом закреплен код по счетчику. так вот в Ворд переводиться только код клиента а не ФИО

Сейчас мы с Вами рассмотрим пример реализации того, как можно выполнить слияние данных Word с данными Microsoft SQL Server, при этом данный процесс будет автоматизирован средствами VBA Access 2003.

Слияние Word с SQL Server

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

Однажды у меня встала задача автоматизировать слияние некого шаблона Word с данными расположенными на SQL сервере, при этом все это необходимо было внедрить в программу, разработанную в Access 2003 (ADP проект). И сегодня я покажу пример решения данной задачи.

Исходные данные

И для начала давайте разберем исходные данные, т.е. что мы имеем.

Итак, в качестве клиента, как я уже сказал, у нас будет выступать ADP проект Access 2003. В качестве источника данных для примера будет выступать SQL Server 2012 Express. На компьютере установлен Microsoft Office 2013 (и Access 2003).

Создадим на сервере тестовую таблицу и заполним ее данными (допустим в базе данных Test). Для этого Вы можете запустить следующую SQL инструкцию.

Заметка! Начинающим программистам рекомендую почитать книгу «SQL код», с помощью которой Вы научитесь работать с языком SQL во всех популярных системах управления базами данных.

Скриншот 1

Заметка! Если Вы не знаете, что делает вышеуказанная инструкция, рекомендую посмотреть мой видеокурс «T-SQL. Путь программиста от новичка к профессионалу. Уровень 1 – Новичок», который предназначен для начинающих. В нем подробно рассмотрены все базовые конструкции языка SQL, включая все вышеперечисленные.

Создаем файл подключения к источнику данных MS SQL Server

Теперь давайте создадим файл подключения (ODC) к нашему источнику данных. Данный файл будет выступать своего рода «шаблоном файла подключения», так как впоследствии мы можем, и будем переопределять и базу данных и сам SQL запрос.

Переходим на вкладку рассылки и в меню «Выбрать получателей» выбираем «Использовать существующий список».

Скриншот 2

Затем в окне выбора источника данных нажимаем кнопку «Создать».

Скриншот 3

Далее выбираем тип источника данных, т.е. Microsoft SQL Server. Жмем «Далее».

Скриншот 4

Потом вводим адрес сервера и нажимаем «Далее».

Скриншот 5

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

Скриншот 6

И в заключение вводим понятное название файла подключения, а также мы можем сразу его сохранить в нужный нам каталог путем кнопки «Обзор», по умолчанию он сохраняется в «C:\Users\Имя_Пользователя\Documents\Мои источники данных». Нажимаем «Готово».

Скриншот 7

Все, файл создан, Word можем закрыть без сохранения.

Создаем шаблон Word для слияния

Теперь давайте подготовим шаблон Word, т.е. это тот документ, в который мы будем подставлять данные из базы данных SQL сервера.

Вся подготовка сводится к тому, что нам необходимо вставить поля слияния там, где это нам нужно. Это делается следующим образом. Вкладка «Вставка -> Экспресс-блоки -> Поле».

Скриншот 8

Ищем поле MERGEFIELD и вводим название поля, которое будет соответствовать полю в источнике данных (в моем случае это ProductName и Price). Жмем «ОК».

Скриншот 9

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

Скриншот 10

Код VBA Access 2003 для слияния документа Word с источником данных MS SQL Server

Осталось написать код VBA, который будет осуществлять слияние. Для примера давайте добавим на форму кнопку StartMerge и поле Price для фильтрации данных. Затем в редакторе Visual Basic напишем процедуру для слияния, допустим с названием MergeWord, и в обработчик события кнопки StartMerge (нажатие кнопки) вставляем код вызова этой процедуры. Весь код будет выглядеть следующим образом (я его прокомментировал). Сразу поясню, что шаблон Word и файл ODC у меня лежат в каталоге D:\Test\.

Сохраняем и проверяем работу.

После нажатия на кнопку (StartMerge) запустится Word, в котором уже все данные заполнены и документов будет столько, сколько строк в источнике.

Скриншот 11

Как видим, все работает. На этом у меня все, надеюсь, материал был полезен. Пока!

Очень часто бывает такое, что нужно сформировать документы по определенному шаблону, на основе каких-то данных, например, по каждому сотруднику или по каждому лицевому счету. И делать это вручную бывает достаточно долго, когда этих самых сотрудников или лицевых счетов много, поэтому сегодня мы рассмотрим примеры реализации таких задач в Excel с помощью макроса написанного на VBA Excel.

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

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

Напомню, что на данном сайте тема VBA Excel уже затрагивалась, например, в материале – Запрет доступа к листу Excel с помощью пароля

И так приступим!

Пишем макрос на VBA Excel по формированию документов

Реализовывать нашу задачу будем на примере «Электронной карточке сотрудника» (я это просто придумал:), хотя может такие и на самом деле есть), т.е. документ в котором хранится личные данные сотрудника вашего предприятия, в определенном виде, именно в Excel.

Примечание! Программировать будем в Excel 2010.

И для начала приведем исходные данные, т.е. сами данные и шаблон

Данные.

Скриншот 1

Лист, на котором расположены эти данные так и назовем «Данные»

Шаблон.

Скриншот 2

Лист, на котором расположен шаблон, тоже так и назовем «Шаблон»

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

Это делается очень просто, выделяете необходимую ячейку или диапазон, и жмете правой кнопкой мыши и выбираете «Присвоить имя», пишите имя ячейки и жмете «ОК»

Скриншот 3

Свои поля я назвал следующим образом:

Код макроса на VBA Excel

Для того чтобы написать код макроса, открывайте на ленте вкладку «Разработчик», далее макросы.

Примечание! По умолчанию данной вкладке в Excel 2010 может и не быть, чтобы ее отобразить нажмите правой кнопкой по ленте пункт меню «Настройка ленты»

Скриншот 4

затем, в правой области поставьте галочку напротив пункта «Разработчик»

Скриншот 5

После вкладка разработчик станет отображаться на ленте.

Далее, когда Вы откроете вкладку разработчик и нажмете кнопку «Макросы» у Вас отобразится окно создания макроса, Вы пишите название макросы и жмете «создать».

Скриншот 6

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

Теперь осталось выполнить этот макрос, для этого откройте вкладку разработчик->макросы->выполнить наш макрос:

Скриншот 7

и после выполнения у Вас в той же папке появится вот такие файлы

Скриншот 8

Вот с таким содержимым:

Скриншот 9

Для удобства можете на листе с данными создать кнопку и задать ей событие выполнить наш только что созданный макрос, и после чего простым нажатием выполнять этот макрос. Вот и все! Удачи!

Private Sub Кнопка16_Click()
Dim app As Word.Application
Dim strPathDot As String, strPathWord As String

'Если нет, открывается старый документ
If DlgUser = vbNo Then
Set app = CreateObject("Word.Application")
With app
.Visible = True
.Documents.Open strPathWord
End With
Set app = Nothing
Else
GoTo nn
End If
Else

'Если такого документа нет или, если человек выбрал "да", то создается новый документ взамен старого на основе шаблона
nn:
Set app = New Word.Application
app.Visible = True
app.Documents.Add strPathDot
With app.ActiveDocument

'Вставка данных
.Bookmarks("Фамилия").Range.Text = Forms![Word]![Фамилия]
.Bookmarks("Имя_о").Range.Text = Forms![Word]![имя_о]
.Bookmarks("dnn").Range.Text = Forms![Word]![dnn]
.Bookmarks("ndo").Range.Text = Forms![Word]![ndo]
.Bookmarks("fn").Range.Text = Forms![Word]![fn]
.Bookmarks("bak").Range.Text = Forms![Word]![bak]
.Bookmarks("Специализация").Range.Text = Forms![Word]![Специализация]
.Bookmarks("sp").Range.Text = Forms![Word]![sp]
.Bookmarks("tip_dok").Range.Text = Forms![Word]![tip_dok]
.Bookmarks("bak1").Range.Text = Forms![Word]![bak1]
.Bookmarks("s").Range.Text = Forms![Word]![s]
.Bookmarks("kv").Range.Text = Forms![Word]![kv]
If Forms![Word]![fn] = "денна" Then

.Bookmarks("www").Range.Text = Forms![Word]![www]
.Bookmarks("www1").Range.Text = Forms![Word]![www1]
.Bookmarks("www2").Range.Text = Forms![Word]![www2]
.Bookmarks("www3").Range.Text = Forms![Word]![www3]
.Bookmarks("www4").Range.Text = Forms![Word]![www4]
Else
.Bookmarks("www").Range.Text = Forms![Word]![zwww]
.Bookmarks("www1").Range.Text = Forms![Word]![zwww1]
.Bookmarks("www2").Range.Text = Forms![Word]![zwww2]
.Bookmarks("www3").Range.Text = Forms![Word]![zwww3]
.Bookmarks("www4").Range.Text = Forms![Word]![zwww4]

Dim MyTable As DAO.Recordset
Set MyTable = CurrentDb.OpenRecordset("SELECT [Для Word].[КодСтудента], [Для Word].[Назва],[Для Word].[Ба],[Для Word].[Години],[Для Word].[fn],[Для Word].[navk],[Для Word].[navg] FROM [Для Word] WHERE ((([Для Word].[КодСтудента])=" & Forms![Word]![КодСтудента] & "))")
Dim i As Variant
Dim j As Variant

Dim Назв As Variant
Dim Бал As Variant
Dim Год As Variant

i = 1
Do While Not MyTable.EOF
If (MyTable.Fields("fn")) = "денна" Then
j = CStr(Round(((MyTable.Fields("години")) * (MyTable.Fields("navk")) / (MyTable.Fields("navg"))), 1))

If i >= 1 Then .Bookmarks(Назв).Range.Text = CStr(MyTable.Fields("Назва"))
.Bookmarks(Бал).Range.Text = CStr(MyTable.Fields("Ба"))

.Bookmarks(Год).Range.Text = CStr(MyTable.Fields("Години")) & "/" & j
i = i + 1
MyTable.MoveNext
Loop

.SaveAs strPathWord
End With
Set app = Nothing
End If
funOutputWord = True
Exit_:

Читайте также: