Глава 6
Автоматизация стандартных документов

6.1. Встроенные диалоговые окна

Диалоговые окна

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

Функция InputBox выводит на экран диалоговое окно, содержащее сообщение и поле ввода, устанавливает режим ожидания ввода текста пользователем или нажатия кнопки, а затем возвращает значение типа String, содержащее текст, введенный в поле.

Процедура MsgBox выводит на экран диалоговое окно, содержащее сообщение, устанавливает режим ожидания нажатия кнопки пользователем, а затем возвращает значение типа Integer, указывающее, какая кнопка была нажата. Диалоговое окно MsgBox, в отличие от InputBox, имеет несколько вариантов, отличающихся числом и наименованием кнопок, а также дизайном.


Синтаксис: InputBox(сообщение [,заголовок] [,default] [,Xpos] [,Ypos])

Аргументы:
текст сообщения – строковое выражение, отображаемое как сообщение в диалоговом окне. Может содержать несколько строк. Для разделения строк допускается использование символа возврата каретки (chr(13)), символа перевода строки (chr(10)) или комбинации этих клавиш (chr(13) & chr(10));
заголовок – строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку помещается имя приложения;
default – строковое выражение, отображаемое в поле ввода как используемое по умолчанию, если пользователь не введет другую строку. Если этот аргумент опущен, поле ввода отображается пустым;
Xpos – числовое выражение, задающее расстояние по горизонтали между левой границей диалогового окна и левым краем экрана;
Ypos – числовое выражение, задающее расстояние по вертикали между верхней границей диалогового окна и верхним краем экрана.

Чтобы передать эту информацию (введенное значение в поле ввода) программе, присвойте возвращенное функцией InputBox значение строковой переменной, например:

strA=InputBox(«Какие места предпочитаете?»,"РЖД","У окна").
Здесь «Какие места предпочитаете?» -сообщение, "РЖД"-заголовок диалового окна, "У окна" - значение по умолчанию.


Синтаксис: MsgBox(текст сообщения [, кнопки] [,заголовок] [,файл_справки, раздел])

Аргументы:
текст сообщения – строковое выражение, отображаемое как сообщение в диалоговом окне;
константа сообщения – числовое выражение или имя константы, указываютщее число и тип отображаемых кнопок, тип используемого значка, основную кнопку и модальность окна сообщения. Значение по умолчанию равно 0. Все значения данного аргумента см. в табл. 17 и табл.18 .
заголовок – строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку помещается имя приложения;
файл справки – строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, необходимо наличие также аргумента context;
раздел – числовое выражение, определяющее номер соответствующего раздела справочной системы. Если в окне сообщения всего две кнопки, для выяснения, на какой из кнопок был щелчок, прекрасно подходит оператор If … then. Например:

If MsgBox («Начинать?», vbYesNo)= vbYes then
Операторы на действие этой кнопки
Else
Операторы на действие другой кнопки
End if

Пример 35. Создать программу таким образом, чтобы при запуске формы, вводе имени в текстовое поле и нажатии на кнопку «Вывод текста» появлялось диалоговое окно, запрашивающее разрешение вывести текст
(рис. 76)Форма примера 35 в режиме конструктораФорма примера 35 в рабочем режиме

В результате запуска приложения (рис. 77 ) в документе Word появится предложение:
Изучение работы с текстом в документе Word является важной составной частью умения программировать в VBA, Света, и отвечает запросам всех программистов!

Листинг работы формы
Private Sub CommandButton1_Click()
If MsgBox(«Вывести текст?», vbYesNo) = vbYes Then
If Documents.Count = 0 Then Documents.Add Selection.Text = "Изучение работы с текстом 
в документе Word является важной составной частью умения программировать в VBA," 
+ TextBox1.Text + ", и отвечает запросам всех программистов!"
Selection.Font.Color = wdColorBlue
Selection.Font.Bold = wdToggle
Selection.Font.Italic = wdToggle
Else
Unload Me
End If
End Sub

Задачи на закрепление материала


Пример 36. Создать форму, имитирующую простейшую игру в орла и решку.
Игрок c помощью радиокнопки загадывает результат бросания, а компьютер после нажатия кнопки "Бросание монеты" генерирует случайным образом число 0 или 1, соответствующие орлу или решке. При совпадении выигрывает компьютер, при несовпадении – игрок. Все действия сопровождаются всплывающими диалоговыми окнами.

Технология выполнения
1. Создайте форму для игры.
2. Опишите процедуры бросания монеты и выхода из игры.

Кнопка Бросание монеты
Private Sub CommandButton1_Click()
Randomize
монета = Int(2 * Rnd)
If OptionButton1.Value = True Then
If монета = 0 Then MsgBox «не везет. Займись-ка лучше изучением VBA»
If монета = 1 Then MsgBox «везунчик. Поздравляю, ты выиграл»
End If
If OptionButton2.Value = True Then
If монета = 1 Then MsgBox «не везет. Займись-ка лучше изучением VBA»
If монета = 0 Then MsgBox «везунчик. Поздравляю, ты выиграл»
End If End Sub


Кнопка Выход из игры Private Sub CommandButton2_Click() Dim ima As String intA = MsgBox(« Нажмите кнопку!», vbYesNoCancel + vbExclamation + vbDefaultButton3, «VBA для чайников!») If MsgBox(«начинать?», vbYesNoCancel) = vbYes Then ima = InputBox(«введите Ваше имя», «Пример окна ввода») If ima <> "" Then MsgBox «Привет,» & ima, vbInformation, «Пример окна сообщения» Else MsgBox «невежа, ты забыл ввести свое имя» & ima, vbExclamation, «еще один пример окна сообщения» End If Else If MsgBox(«ты точно подумал?», vbYesNoCancel) = vbNo Then MsgBox («ха-ха») Else: MsgBox « Ну наконец-таки!» Unload Me End If End If End Sub

Пример 37. В разработанном игровом приложении предусмотреть создание окна «Банк», в котором будет выводиться результат очков игрока при остановке игры.
Правила игры: при выигрыше игрока добавляется единица к сумме, лежащей в банке, при проигрыше –
добавляется компьютеру (отнимается из суммы, лежащей в банке).
Предусмотреть все необходимые диалоговые окна.


Пример 38.[4]

Смоделировать полную игру в орел и решку. Игрок вносит в банк определенную сумму денег. Во время игры нельзя добавлять деньги в банк. Игра состоит из последовательности шагов, априори конечных. На очередном шаге игрок загадывает либо орел, либо решку. Компьютер «бросает» монету. Если «монета падает той же стороной», которую задал игрок, то банк увеличивается на единицу, в противном случае – уменьшается на единицу. Игра заканчивается либо по желанию игрока, либо когда величина банка становится нулем или больше 10 000 руб. (определенная сумма). Игрок забирает себе содержимое банка. Можно предусмотреть максимальные и минимальные суммы, которые были в банке в течение всей игры.

Примечание. Можно смоделировать бросание игральной кости, используя функцию Int(6* Rnd)+1. Правила меняются: выиграл тот, кто больше бросил.

Технология выполнения
Рассмотрим один из вариантов решения данной задачи. Усложним эту задачу тем, что каждое последующее окно вызывается соответствующим действием.

1.Пусть при запуске приложения появляется первое диалоговое окно

2.При нажатии на кнопку "Начать игру" появляются диалоговые окна,
запрашивающие имя игрока и подтверждение начать игру

3.После чего появляется форма ввода ставок. Данная форма производит начальный выбор ставки и запускает главную форму примера 38.

.
Private Sub CommandButton1_Click()
imya = InputBox(«введите ваше имя», «Регистрация», «????»)
If MsgBox(«Начинать?», vbYesNo, «Вы не передумали?») =
vbYes Then
UserForm2.Show
Else
UserForm4.Show
End If
End Sub

Кнопка Бросок имитирует подбрасывание монеты игроком, производит расчет выигрыша и проигрыша игрока, выводя соответствующие значения в текстовые окна с сообщением счета игры

Кнопка Бросок
Private Sub CommandButton1_Click()
TextBox1.Value = TextBox1.Value + 1
If b = Fix(Rnd * 2 + 1) Then
TextBox4.Value = TextBox4.Value + 1
TextBox5.Value = TextBox5.Value + 1
Else
TextBox4.Value = TextBox4.Value – 1
TextBox6.Value = TextBox6.Value + 1
If TextBox4.Value < 1 Then
MsgBox («Вы проиграли!!!»)
UserForm4.Show
End If
End If
If Val(TextBox2.Text) < Val(TextBox4.Text) Then
TextBox2.Value = Val(TextBox4.Text)
Else
If Val(TextBox3.Text) > Val(TextBox4.Text) Then
TextBox3.Value = Val(TextBox4.Text)
End If
End If
OptionButton1.Value = False
OptionButton2.Value = False
CommandButton1.Enabled = False
End Sub

Кнопка Выход завершает игру, выдает итоговые сообщения

Private Sub CommandButton2_Click()
MsgBox ("Партий" + TextBox1.Value + (Chr(13)) 
+ "в банке " + TextBox4.Value + (Chr(13))
 + "ваш максимум" + TextBox2.Value + (Chr(13)) 
 + "ваш минимум" + TextBox3.Value + (Chr(13)) 
 + "счет" + TextBox5.Value +":"+ TextBox6.Value)
UserForm4.Show
End Sub
Private Sub UserForm Initialize()
Unload UserForm2
OptionButton1.Value = True
TextBox4.Value = a
Label6.Caption = imya
TextBox2.Value = TextBox4.Value
TextBox3.Value = TextBox4.Value
End Sub
.

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


6.2. Создание и автоматическое заполнение бланков стандартных документов Создание VBA-программ

Пример 39. При оплате за обучение студент вносит деньги в кассу, где бухгалтер заполняет от руки квиток об оплате. Автоматизировать ручную работу бухгалтера, создав форму, заполняющую карточку оплаты, которую можно при необходимости отправить на печать.
Технология выполнения
Интерфейс шаблона и приложения
В качестве интерфейса сначала рассмотрим самую простую форму приложения, отвечающего условиям задачи и включающего в себя соответствующие текстовые поля ввода и рабочие кнопки (рис. 85).
Далее рассмотрим, как автоматизировать печать квитанции об оплате за обучение.
Начнем с разработки бланка стандартного документа (печатной формы).

Эту форму можно сделать на базе шаблона с текстовыми полями, в которые будут заноситься
изменяющиеся сведения. Для этого выполните следующие команды: Файл + Создать.
В правой части окна нового документа выберите раздел Шаблоны и гиперссылку На моем компьютере После чего появится диалоговое окно Шаблоны, в котором на вкладке Общие необходимо выделить пиктограмму Новый документ и поставить переключатель Шаблон в рамке Создать.
Включите панель Формы (Вид + Панели инструментов + Формы). Для дальнейшей работы понадобится только один элемент этой панели – Текстовое поле которое позволяет создать на форме изменяющееся поле (либо посредством кода, либо самим пользователем). Выбирая курсором место в документе Word для расположения соответствующего поля и расположив на нем элемент Поле, можно получить необходимую форму. Для того чтобы расширить поле, надо поставить в него курсор и несколько раз нажать Tab. Для того чтобы подчеркнуть поле, выделите его как текст и примените к нему подчеркивание.
Офисное программирование Рис. 87. Диалоговое окно Шаблоны Создайте шаблон документа, придерживаясь рис. 88.

В некоторых полях (поля выделены серым фоном) можно ввести значения по умолчанию. Значение по умолчанию устанавливается при помощи диалогового окна Свойства, которое можно вывести на экран следующим образом: • щелкнуть правой клавишей мыши по необходимому текстовому полю; • в появляющемся контекстном меню выбрать Свойства; • указать значение по умолчанию (рис. 89). Значения по умолчанию позволяют менять только те данные, которые должны изменяться нечасто. Например, оплата за обучение в основном одна и та же – 1500 руб., поэтому значение этого поля будет меняться не очень часто. Офисное программирование Рассмотрим и другие необходимые элементы рабочего окна «Параметры текстового поля». В поле Тип указывается тип значения, которое можно помещать в поле. Можно заполнить поле Максимальная длина, хотя наиболее важным для дальнейшего использования кодом VBA является поле Закладка. Значение этого поля будет служить меткой, в которую должен устанавливаться курсор, перед помещением в документ очередной порции информации. Поэтому, как только все необходимые поля определены, нужно указать для каждого из них осмысленные метки. Для бланка документа Word, приведенного на рис. 86, зададим (последовательно) такие метки: Фамилия – фамилия студента; Имя – имя студента; Отчество – отчество студента; Группа – наименование группы; Месяц_опл – название месяца, за который вносится оплата; Сумма_опл – внесенная сумма; ФИО_бух – фамилия принявшего бухгалтера; Дата_опл – дата оплаты. После окончания разработки формы документа сохраним его под именем Оплата за учебу в каталоге Шаблоны. На рис. 88 представлен шаблон созданного документа с изменяющимися полями.

Создание модуля Печать для шаблона документа Далее необходимо перейти в редактор VBA и создать форму приложения, отвечающего условиям задачи (рис. 85). В листинге представлен код процедуры печати бланка квитанции об оплате, сопутствующие и отладочные процедуры. Листинг (занести в Модуль1 проекта Оплата за учебу)

Option Explicit
Option Base 1
' переменные формы приложения
Public фам1 As String
Public имя1 As String
Public отчество1 As String
Public групп1 As String
Public месяц As String
Public сумма As String
Public бух As String
Public дата As String
' переменные формы шаблона документа
Public фамилия As String
Public имя As String
Public отчество As String
Public группа As String
Public месяц_опл As String
Public сумма_опл As String
Public фио_бух As String
Public дата_опл As String
Dim book(8) As String
Dim dataMas(8) As String
Dim i As Integer
Sub Печать() 'процедура печати бланка
'Заносим информацию в массивы bookmarmas, datamas
book(1) = «фамилия»: dataMas(1) = фамилия
book(2) = «имя»: dataMas(2) = имя
book(3) = «отчество»: dataMas(3) = отчество
book(4) = «группа»: dataMas(4) = группа
book(5) = «месяц_опл»: dataMas(5) = месяц_опл
book(6) = «сумма_опл»: dataMas(6) = сумма_опл
book(7) = «фио_бух»: dataMas(7) = фио_бух
book(8) = «дата_опл»: dataMas(8) = дата
'заполнение полей квитанции:
For i = 1 To 8
ActiveDocument.FormFields(ActiveDocument.Bookmarks(book(i)).Name).Result = dataMas(i)
Next
ActiveDocument.PrintPreview Выполняется предварительный просмотр печати.
'Для того чтобы реально распечатать документ, применяется метод PrintOut объекта Application (см. Help)
UserForm1.Hide
End Sub
В связи с различием переменных, принимаемых и передаваемых на печать, объявим как Public переменные двух видов: получаемые интерфейсной частью приложения и печатаемые в форме шаблона. Обратите внимание на то, что здесь все данные имеют тип String. Такие однотипные данные позволяют записывать их в поля формы в цикле, содержащем всего два оператора (см. описание листинга).

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

Option Explicit
Private Sub CommandButton1_Click()
фамилия = фам1
имя = имя1
отчество = отчество1
группа = групп1
месяц_опл = месяц
сумма_опл = сумма
фио_бух = бух
дата_опл = дата
Call Печать
End Sub

Процедуры присваивания переменным формы приложения 
введенных значений в текстовые поля формы.
Private Sub textBox1_change()
фам1 = TextBox1.Value
End Sub
Private Sub textBox2_change()
имя1 = TextBox2.Value
End Sub
Private Sub textBox3_change()
отчество1 = TextBox3.Value
End Sub
Private Sub textBox4_change()
групп1 = TextBox4.Value
End Sub
Private Sub textBox5_change()
месяц = TextBox5.Value
End Sub
Private Sub textBox6_change()
сумма = TextBox6.Value
End Sub
Private Sub textBox7_change()
бух = TextBox7.Value
End Sub
Private Sub textBox8_change()
дата = TextBox8.Value
End Sub
Откомпилируйте программу и запустите на проверку.

Задача на закрепление материала


Пример 40. [5] Разработать форму бланка почтового перевода для облегчения труда сотрудников, связанных с частым оформлением денежных переводов.

Готовый шаблон документа и форма даются на рис. 90 и 91.