Статьи из блога
Использование форм для ввода данных в документ
Продолжаем серию заметок по теме автоматизации документов.
Сегодня я расскажу, как добавить к вашим документам специальную форму, с помощью которой можно легко и просто вводить данные в документ. Введенные в форму данные адресата по нажатию кнопки на форме будут автоматически внесены в документ.
Предполагается, что у вас есть готовый шаблон документа, например, письма. В качестве образца можно использовать подготовленный мною шаблон официального письма вымышленной организации.
Использование шаблона необходимо, ведь на его основе вы в дальнейшем будете создавать свои документы.
Распакуйте файл из архива и поместите его в папку с шаблонами редактора 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. Дважды щелкните по модулю и перейдите в окно редактирования кода. Вставьте следующий код:
- Перейдите на модуль UserForm1. Переименуйте его в MyForm.
- Нажмите клавишу «F7» и в окне редактора кода вставьте следующий код (содержит процедуры для действий с элементами формы):
- Ниже этого кода вставьте следующий код:
- Сохраните проект и попробуйте создать на основе вашего шаблона новый документ. Введите необходимые данные в поля формы и нажмите кнопку "Внести данные".
Sub AutoNew() Dim oF As MyForm Set oF = New MyForm oF.Show Set oF = Nothing End Sub
Этот код запускает форму каждый раз при создании нового документа на основе вашего шаблона.
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.
Образцом кода для данного макроса и формы послужила заметка Gregory Maxey Address a Letter Using as UserForm.
Метки: автоматизация | закладки | макросы | формы | шаблоны
Просмотров: 71409
Подписаться на комментарии по RSS
Версия для печати
Еще записи по вопросам использования Microsoft Word:
- 250 бесплатных шаблонов для MS Office
- 3 способа очистки списка недавно открытых документов
- Word 2007: добавляем свою вкладку и свои команды
- Абзац с цветным фоном
- Автоматическая запись макроса
- Автоматическая расстановка переносов
- Автоматическое обновление полей при открытии документа
- Автоматическое сохранение документа при его закрытии
- Быстрая смена ориентации страниц документа
- Быстрое перемещение между открытыми документами Word
- Быстрое создание нового документа на основе шаблона
- Быстрый ввод текста с помощью команды =rand()
- Быстрый доступ к папке с шаблонами Word
- Ввод часто повторяющихся фрагментов текста
- Вставка будущей даты
- Вставка документа с книжной ориентацией в документ с альбомной ориентацией
- Вставка завтрашней даты
- Вставка изображений из указанной папки для Word 2007
- Вставка неформатированного текста
- Вставка скопированного текста в предопределенном формате
- Вставка текста с полями в нижний колонтитул
- Вставка текста с помощью кнопки
- Выделение видимой части экрана
- Двойная нумерация страниц в документе
- Задать обтекание текстом для всех рисунков в документе
Комментариев: 52
Интересное описание. Но стоит усложнить немного задачу, как перестаёт работать. Вот у меня, например, задача стояла следующим образом. Есть типовой контракт, в котором меняются только поля "Наименование организации", "Наименование должности руководителя", "ФИО руководителя" и т.п.. Но есть одна особенность. Некоторые значения повторяются по тексту раз по 5. Если попытаться вставлять закладки, то они получаются уникальными. То есть продублировать содержимое закладки по тексту не получается. Может, я как-то не так закладки добавляю? У меня Word 2003. Выбираю "Вставка - Закладка". Ввожу указатель закладки и выбираю "Добавить". Далее набираю неизменяемый текст. Потом мне нужно снова вставить содержимое той же закладки. Повторяю операцию. Но маркер закладки исчезает из прежней позиции и устанавливается в новое место. Без вариантов. Может, кто подскажет, как содержимое закладки продублировать?
Это мое упущение в объяснении.
Михаил, добавляя новую закладку с тем же именем, вы тем самым удаляете предыдущую - заменяете ее. Зачем?
Вам нужно в документе вставлять ссылочное поле REF, а не добавлять новую закладку. Почитайте пожалуйста вот эту заметку: Ввод часто повторяющихся фрагментов текста.
Кроме того, в шаблоне образца письма содержаться именно эти поля. Скачайте эти шаблоны и просмотрите их структуру.
Ссылочное поле REF это ничто иное как перекрестная ссылка. При ее вставке просто нужно выбрать тип объекта, на который ссылаетесь (абзац, закладка, таблица, рисунок и т.п.)
Затем обновление производится через F9
Какой надо код написать, что бы при нажатии кнопки "ввести данные" вводился просто текст из закладок в документ? (( Закладок штук 20..
Денис, конкретнее можете сформулировать задание?
Вопрос по теме.. У меня есть документ с неизменяемым текстом и полями для ввода. Как делать так, что бы можно было редактировать весь текст? Как убрать это свойство "неизменяемости".. Спасибо..
Снимите защиту с документа (Сервис - Снять защиту).
Добрый день! Подскажите, можно ли в документе Word вставить поле календарь? Примерно такого плана как в обработках 1С при выборе периода.
Заранее спасибо.
Вот заметка на эту тему: Календарь Word
Антон, по-моему будет удобнее использовать стандартный компонент Microsoft Date and Time Picker Control 6.0
Добрый день! Спасибо за статью, лично мне она очень пригодилась. Единственная проблема: не могу найти, где включается отображение МЕТОК закладок, чтобы в документе рядом с символом закладки отображалось ее название. Подскажите, пожалуйста, где включается сия опция в Word 2003? Заранее благодарю за ответ.
Слава, меню Сервис - Параметры - опция Показывать Закладки (установите флажок). Это будут показаны метки. Но имена закладок вы так отобразить не сможете и это не предусмотрено. Но...
Завтра я опубликую заметку с описанием шаблона для работы с закладками. И благодаря этому шаблону можно будет легко видеть имеющиеся в документе имена закладок и быстро переходить к ним.
Поставил в шаблоне документа цвет закладок с подказочным словом {дата}, (номер)... серым цветом (чтобы меньше бросались в глаза). Какой код прописать чтобы после ввода значения из формы цвет шрифта текста в закладке становился черным?
Вот примерный макрос для всех закладок в документе:
Иногда нужно обратить внимание пользователя на то, какую дату он ставит - текущую или нетекущую - например путем MsgBox. Я использую для вставки даты в поле закладки элемент формы DTPicker (там по моему не всегда стоит текущая дата по умолчанию). Когда дата текущая/нетекущая должна быть форма с вопросом "Вы уверены что ставите текущую/нетекущую дату", две копки если кнопка "Да" продолжется выполнение макроса, если кнопка "Нет" - возврат в форму.
Тип даты указывается в настройках контрола.
Компонент для выбора даты (смотреть скриншот).
вот именно, она там установлена любая и не меняется сама на текущую. А как проверить присвоение переменной(закладке) текущей/не текущей даты?
Антон подскажите пожалуйста как связать шаблон с базой данных
1 - можно вместо закладок использовать поля слияния или поле-списки
2 - как из базы данных передать все значения в поля-списки
Пропустил знак = ;)
А у меня проблема со ссылками. WORD почему-то считает необходимым, подставив в ссылку соответствующее ей значение, перебросить всё, что было непосредственно за ссылкой, на следующую строку! Как избавиться от этой самодеятельности?
Так может быть у вас после поля (или в конце поля) стоит знак абзаца? Проверьте.
В том-то и дело! Знак абзаца удаляю, а после обновления документа он снова появляется.
Я думал это болезнь Word 2007. Скачал Word 2003 - абсолютно то же самое вытворяет.
Конечно, можно написать VBA-код, ввести переменную, которой будет присваиваться массив из значений двух закладок, чтобы два значения, вводимые в ссылку, не разлетались по разным строкам. Но я ищу более простое решение.
Прошу прощения! Я только сейчас понял. Знак абзаца стоял в конце поля закладки. А я удалял его в конце ссылки. Ступор! Спасибо!
Хорошая статья, только в форму надо вносить данные не только текстовые а еще графические, но таких полей в форме ненашел.
Подскажите как в форму вставлять рисунки?
Есть компонент Image, ImageComboBox и много других для работы с изображениями. Вызовите контекстное меню на панели с компонентами и выберите «Additional Controls»
Антон, а как вывести форму рядом с выделенным текстом? Как это, например, делается при поиске: если что-то найдено, то окно поиска располагается так, чтобы не заслонять найденный текст.
Александр, честно скажу: не знаю. Можно попробовать установить свойство окна открываться либо по центру, либо по краям экрана. А вот около выделенного текста - затрудняюсь подсказать. Наверное, надо задавать условия для выделенного текста. А где в этом шаблоне выделенный текст?
Антон, есть решение. Подсказал MVP с Google Groups.
Есть оказывается метод ActiveWindow.GetPoint, который возвращает положение в пикселах выделенного диапазона или фигуры на экране. А также его высоту и ширину.
Отлично! Я было хотел задать ваш вопрос в этот форум, но вы написали, что сами задали (ваш комментарий я удалил, так как он был нечитаем - вопросики вместо букв).
вылезла ошибка..не получается..
желтым выделяет первую строчку
и ещё,не подскажете?где у вас на сайте можно ознакомится с 2007 вордом,точнее его интерфейсом...после 2003 сложно ориентироваться,ничего не могу найти
Наталья, какую именно ошибку выдает?
Что касается интерфейса новой версии редактора, то он же у вас установлен? Почитайте тогда вот эту заметку: http://wordexpert.ru/page/raspolozhenie-komand-word-2003-v-word-2007 и вот эту заметку: http://wordexpert.ru/page/interaktivnyiy-putevoditel-po-komandam-word-2007.
Очень приятно, что так быстро отвечаете!Спасибо за ссылки...
А теперь наверное точно не по теме будет вопрос...
С ошибкой позже разберусь ...
У меня есть четыре шаблона.сделанные с полями форм,т.е. шаблон защищен,а данные вводятся только в поля форм.
Можно ли связать эти 4 шаблона,чтобы одинаковые поля форм заполнялись сразу при открытии только одного шаблона,т.е. при создании сначало одного документа...
надеюсь доходчиво объяснила...
отправте меня пожалуйста,если есть статьи по моему вопросу..
Можно попытаться добавлять данные в другие документы, но если они открыты. В закрытые документы данные не добавить.
Как создавать форму ввода данных понятно. Там есть вставка поля со списком. Вот как наполнить сам список нужными элементами не разобралась.
А можно провернуть нечто подобное, но с элементами управления содержимым? Т.е. чтобы этот вводимый текст в конечном документе был не просто текстом.
А как при запуске макроса, прочитать содержимое закладок и занести их значения в поля формы? Грубо говоря редактировать введенные данные например при ошибке.
Ну как всегда, сам вопрос задашь и сам отвечай).
вот код занесения в форму содержимого поля при открытии формы, переменные нужно заменить на свои:
здравствуйте!у меня такая ситуация - есть несколько документов(образцов), для которых нужны разные формы. Созданные на основе этих документов(образцов) документы мне могут в будущем сами понадобится как образцы, так как вводимый в поля текст будет повторятся(где-то весь,где-то частями). как сделать, чтобы при открытии нужного мне документа из определённой папки, вылезала нужная мне форма.
Андрей, мне представляется что вам нужно создать шаблоны документов с нужными вам формами (не документы-образцы, а именно шаблоны), с помощью которых вы и будете создавать ваши документы.
Тогда при создании документа на основе подходящего в данный момент шаблона у вас будет открываться нужная вам форма.
P.S. Эта форма заранее создается в шаблоне.
Собственно говоря, статья выше как раз и предназначена для вашей задачи.
спасибо за ответ!у меня ещё вопрос! в моём шаблоне есть вводимая дата, она не текущая, и ещё несколько закладок с датами, которые зависят от неё, то есть одна на два дня больше, вторая на десять,как сделать, чтобы они устанавливались автоматически после ввода первой даты.
В принципе, если не боитесь залезть в дебри работы с полями, это возможно. Посмотрите пример DateCalc на этой странице
Посмотрите как там всё сделано и попробуйте реализовать сами. У меня получалось.
вроде получилось,работает!
появился ещё вопрос. не могу никак найти макрос для вставки экспресс-блоков.надо, чтобы при создании документов,вставлялись разные экспресс-блоки в разные места текста.на основе щаблона будут создаваться шаблоны, которые надо будет редактировать,однако экспресс-блоки могут быть уже изменены.
!Спасибо очень помогло, только есть еще вопрос,
что если нужно выбрать один из двух пунктов и в зависимости от выбора добовлять (или удалять) разные варианты текста (в данном случае пункты договора)?
как мне написать код в кнопке "Отмена" для vb.net 2008
Тоесть я выбераю Поиск,и мне нужно выйти потом с него.
Подскажите пожалуйста, как мне связать мою форму с вставленной в документ таблицей Excell? В форме вводится задаток, в таблице просчитывается итоговая сумма, мне нужно чтобы закладке присваивался остаток - итоговая сумма минус задаток. Спасибо.
Слишком сложно было мне помочь?
Если отбросить тот факт, что сам бланк документа вместе с реквизитами оформлен абсолютно неправильно, то... Ну да, все остальное м.б полезным. )))
Здравствуйте!
Подскажите, пожалуйста, что можно сделать? :у меня есть документ в котором, данные из закладки попадают в разные части документа, с помощью ссылочного поля ref, и все бы хорошо, но для некоторых полей применяется корректировка (например удаляю последнее слово). При редактировании уже готового файла на основе шаблона все хорошо редактируется, но стоит выдать на печать, как эти данные "преображаются" в первоначальный вид, и на бумаге выходит "не так как надо".
Не могу понять, как сделать:
Есть очень много документов WORD, для одного документа сделана форма для ввода данных в ссылки документа. Скопировать и вставить эту форму в другие документы и сделать ссылки в документе не проблема. Но при изменении или данных или вида форм надо будет править предположим 100 форм. Как сделать одну форму, чтобы она открывалась только из этих 100 документов. Спасибо!