Использование форм для ввода данных в документ

Источник: wordexpert
Антон Конкин

Продолжаем серию заметок по теме автоматизации документов. Сегодня я расскажу, как добавить к вашим документам специальную форму, с помощью которой можно легко и просто вводить данные в документ. Введенные в форму данные адресата по нажатию кнопки на форме будут автоматически внесены в документ.
Предполагается, что у вас есть готовый шаблон документа, например, письма. В качестве образца можно использовать подготовленный мною шаблон официального письма вымышленной организации (скачать).
Использование шаблона необходимо, ведь на его основе вы в дальнейшем будете создавать свои документы.
Распакуйте файл из архива и поместите его в папку с шаблонами редактора Word. Как правило, эта папка находится по адресу: C:\Documents and Settings\ ИМЯ_ПОЛЬЗОВАТЕЛЯ \Application Data\Microsoft\Шаблоны.

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

  • name
  • company
  • address
  • date
  • salutation

Обратите внимание, реквизитов адресата, которые должно содержать письмо, на самом деле может быть много, а закладок мы определили всего пять. Это логично, так как в дальнейшем мы будем подставлять несколько реквизитов к одной закладке (например, адрес, который будет состоять из индекса, названия города, области, улицы).
После добавления закладок (и если у вас включен режим отображения меток закладок), наш документ будет выглядеть примерно как на рисунке ниже (щелкните по картинке для ее увеличения):

Эти метки закладок после нажатия кнопки "Внести данные" будут заменены на конкретные тексты.
Не забывайте сохранять сделанные вами изменения в шаблоне на всякий "пожарный" случай.

На втором шаге мы создадим специальную форму с текстовыми полями, которая будет открываться при создании каждого нового документа на основе вашего шаблона письма. Кратко расскажу, как добавить в шаблон форму.

  • Откройте редактор Visual Basic с помощью сочетания клавиш «Alt»+«F11». Убедитесь, что в окне проектов выделен ваш шаблон:
  • В меню Insert выберите команду UserForm. В окне проектов будет создан новый объект Forms с пустой формой или просто добавлен в проект модуль userForm.
  • Разместите на форме необходимые элементы. Например, как на рисунке ниже:

Текстовые поля (со стандартными именами TextBox1) были мною переименованы с учетом их назначения. Обратите внимание в нижеприведенном коде, как они теперь называются.

Третий шаг - написание кода для элементов нашей формы.

  1. В меню Insert выберите команду Module. В окне проектов будет создан новый модуль Module1. Дважды щелкните по модулю и перейдите в окно редактирования кода. Вставьте следующий код:
    Sub AutoNew()
    Dim oF As MyForm
    Set oF = New MyForm
    oF.Show
    Set oF = Nothing
    End Sub

    Этот код запускает форму каждый раз при создании нового документа на основе вашего шаблона.

  2. Перейдите на модуль UserForm1. Переименуйте его в MyForm.
  3. Нажмите клавишу «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
  4. Ниже этого кода вставьте следующий код:
    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
  5. Сохраните проект и попробуйте создать на основе вашего шаблона новый документ. Введите необходимые данные в поля формы и нажмите кнопку "Внести данные".

Вы можете скачать уже готовый шаблон письма - Шаблон письма и подредактировать его под свои нужды.
В этом шаблоне есть небольшой недостаток: в текстовые поля нужно вводить информацию в правильном формате и регистре, иначе в итоговом письме придется вручную править недочеты.

Образцом для шапки шаблона послужила картинка из шаблона городского письма редактора Word 2007.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=9991