Источник: wordexpert
Антон Конкин
Продолжаем серию заметок по теме автоматизации документов. Сегодня я расскажу, как добавить к вашим документам специальную форму, с помощью которой можно легко и просто вводить данные в документ. Введенные в форму данные адресата по нажатию кнопки на форме будут автоматически внесены в документ.
Предполагается, что у вас есть готовый шаблон документа, например, письма. В качестве образца можно использовать подготовленный мною шаблон официального письма вымышленной организации (скачать).
Использование шаблона необходимо, ведь на его основе вы в дальнейшем будете создавать свои документы.
Распакуйте файл из архива и поместите его в папку с шаблонами редактора Word. Как правило, эта папка находится по адресу: C:\Documents and Settings\ ИМЯ_ПОЛЬЗОВАТЕЛЯ \Application Data\Microsoft\Шаблоны.
Итак, шаблон документа у нас есть, открыт и готов к изменению. В первую очередь нам необходимо добавить закладки в те позиции в документе, куда вы собираетесь вставлять данные из формы. Как правило, письмо должно содержать фамилию, имя и отчество адресата, наименование организации адресата, полный почтовый адрес и приветствие. Исходя из этого мы добавим в документ следующие закладки:
- name
- company
- address
- date
- salutation
Обратите внимание, реквизитов адресата, которые должно содержать письмо, на самом деле может быть много, а закладок мы определили всего пять. Это логично, так как в дальнейшем мы будем подставлять несколько реквизитов к одной закладке (например, адрес, который будет состоять из индекса, названия города, области, улицы).
После добавления закладок (и если у вас включен режим отображения меток закладок), наш документ будет выглядеть примерно как на рисунке ниже (щелкните по картинке для ее увеличения):
Эти метки закладок после нажатия кнопки "Внести данные" будут заменены на конкретные тексты.
Не забывайте сохранять сделанные вами изменения в шаблоне на всякий "пожарный" случай.
На втором шаге мы создадим специальную форму с текстовыми полями, которая будет открываться при создании каждого нового документа на основе вашего шаблона письма. Кратко расскажу, как добавить в шаблон форму.
- Откройте редактор Visual Basic с помощью сочетания клавиш «Alt»+«F11». Убедитесь, что в окне проектов выделен ваш шаблон:
- В меню Insert выберите команду UserForm. В окне проектов будет создан новый объект Forms с пустой формой или просто добавлен в проект модуль userForm.
- Разместите на форме необходимые элементы. Например, как на рисунке ниже:
Текстовые поля (со стандартными именами TextBox1) были мною переименованы с учетом их назначения. Обратите внимание в нижеприведенном коде, как они теперь называются.
Третий шаг - написание кода для элементов нашей формы.
- В меню Insert выберите команду Module. В окне проектов будет создан новый модуль Module1. Дважды щелкните по модулю и перейдите в окно редактирования кода. Вставьте следующий код:
Sub AutoNew()
Dim oF As MyForm
Set oF = New MyForm
oF.Show
Set oF = Nothing
End Sub
Этот код запускает форму каждый раз при создании нового документа на основе вашего шаблона.
- Перейдите на модуль UserForm1. Переименуйте его в MyForm.
- Нажмите клавишу «F7» и в окне редактора кода вставьте следующий код (содержит процедуры для действий с элементами формы):
Private Sub CommandButton1_Click()
'Действия формы по нажатию кнопки "Ввести данные"
Dim bm As Bookmarks
Dim rng As Word.Range
Dim addr As String
Dim sText As String
Dim sResult1 As String
Dim sResult2 As String
Dim arName() As String
Set bm = ActiveDocument.Bookmarks
sText = Me.tbName.Text 'присваиваем переменной текст из текстового поля "Имя адресата"
arName = Split(sText) 'создаем массив из отдельных слов, вместе составляющих ФИО адресата
'Действия с полем "Дата"
With Me.tbDate
If Not IsDate(.Text) Then 'если данные введены не в формате даты, то
MsgBox "В поле ""Дата"" неверно введены данные." 'выводим сообщение
.Text = Format(Now, "dd MMMM yyyy") 'автоматически заполняем поле текущей датой
.SetFocus 'фокус на поле "Дата"
.SelStart = 0 '
.SelLength = Len(.Text) 'выделяем весь текст в поле, начиная с левого края
Exit Sub
Else
Set rng = bm("date").Range 'присваиваем переменной rng ссылку на закладку "date"
rng.Text = .Text & " г." 'определяем новый текст закладки
bm.Add "date", rng 'заменяем закладку
End If
End With
Set rng = bm("name").Range 'присваиваем переменной rng ссылку на закладку "name"
sResult1 = arName(0) & " " 'присваиваем переменной значение первого слова из поля "Имя адресата" и добавляем пробел
sResult1 = sResult1 & Left(arName(1), 1) & ". " 'добавляем к первому слову первую букву Имени и точку
sResult1 = sResult1 & Left(arName(2), 1) & "." 'добавляем первую букву Отчества и точку
rng.Text = sResult1 'определяем новый текст закладки
bm.Add "name", rng 'заменяем закладку
Set rng = bm("company").Range 'присваиваем переменной rng ссылку на закладку "company"
rng.Text = Me.tbCompany 'определяем новый текст закладки
bm.Add "company", rng 'заменяем закладку
If Len(sText) > 0 Then 'если в поле "Имя адресата" есть какие-то символы, то
sText = sResult1 & vbCr 'присваиваем переменной текст закладки "name" и переводим строку
End If
If Len(Me.tbCompany.Text) > 0 Then 'если в поле "Организация" есть какие-то символы, то
Me.tbCompany.Text = Me.tbCompany.Text & vbCr 'присваиваем переменной текст из поля и переводим строку
End If
If Len(Me.tbAddress.Text) > 0 Then 'если в поле "Адрес" есть какие-то символы, то
Me.tbAddress.Text = Me.tbAddress.Text 'присваиваем переменной текст из поля
End If
If Len(Me.tbIndex.Text) > 0 Then 'если в поле "Индекс" есть какие-то символы, то
Me.tbIndex.Text = Me.tbIndex.Text & "," 'присваиваем переменной текст из поля и добавляем запятую
End If
If Len(Me.tbCity.Text) > 0 Then 'если в поле "Город" есть какие-то символы, то
Me.tbCity.Text = Me.tbCity.Text & "," 'присваиваем переменной текст из поля и добавляем запятую
End If
If Len(Me.tbOblast.Text) > 0 Then 'если в поле "Область" есть какие-то символы, то
Me.tbOblast.Text = Me.tbOblast.Text & "," 'присваиваем переменной текст из поля и добавляем запятую
End If
'присваиваем переменной фрагментов текста из полей "Индекс", "Город", "Область" и "Адрес"
addr = Me.tbIndex.Text & " " & Me.tbCity.Text & " " & Me.tbOblast.Text & " " & Me.tbAddress.Text
Set rng = bm("address").Range 'присваиваем переменной rng ссылку на закладку "address"
rng.Text = addr 'определяем новый текст закладки из переменной addr
bm.Add "address", rng 'заменяем закладку
Set rng = bm("salutation").Range 'присваиваем переменной rng ссылку на закладку "salutation"
rng.Text = Me.tbSalutation.Text 'определяем новый текст закладки
bm.Add "salutation", rng 'заменяем закладку
Unload Me 'Закрываем форму
ActiveDocument.Range.Fields.Update 'Обновляем все поля в документе
End Sub
- Ниже этого кода вставьте следующий код:
Private Sub CommandButton2_Click()
'Выход из формы и закрытие окна документа при нажатии кнопки "Отменить"
On Error GoTo ErrLabel
Unload Me 'Закрываем форму
ActiveDocument.Close 'Закрываем текущий документ
ErrLabel:
End Sub
Private Sub tbIndex_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Устанавливаем правила заполнения поля "Индекс"
With Me.tbIndex
If Not IsNumeric(.Text) Or Len(.Text) <> 6 Then 'если в поле "Индекс" данные не цифры и меньше 6, то
MsgBox "Ошибка!" & " " & "Введите 6 цифр индекса города или района." 'выводим сообщение
Cancel = True 'возвращаемся к полю
.Text = "" 'очищаем поле
.SetFocus
End If
End With
End Sub
Private Sub tbName_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'При выходе из поля "Имя адресата" его имя подставляется в поле "Приветствие"
sText = Me.tbName.Text
arName = Split(sText)
sResult2 = arName(1) & " "
sResult2 = sResult2 & arName(2)
Me.tbSalutation = "Уважаемый " & sResult2 & "!"
End Sub
Private Sub UserForm_Initialize()
Me.tbDate = Format(Now, "dd MMMM yyyy")
With Me.tbName
.Text = "Фамилия Имя Отчество"
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub
- Сохраните проект и попробуйте создать на основе вашего шаблона новый документ. Введите необходимые данные в поля формы и нажмите кнопку "Внести данные".
Вы можете скачать уже готовый шаблон письма - Шаблон письма и подредактировать его под свои нужды.
В этом шаблоне есть небольшой недостаток: в текстовые поля нужно вводить информацию в правильном формате и регистре, иначе в итоговом письме придется вручную править недочеты.
Образцом для шапки шаблона послужила картинка из шаблона городского письма редактора Word 2007.