Напоминаем, что существуют так называемые монопольные окна диалога. Монопольное окно блокирует выполнение программного кода до тех пор пока не будет получен ответ с помощью нажатия на выбранную кнопку, ввода данных или в результате закрытия окна.
Примером может служить окно сохранения файла. Заметим, что обработка событий в зависимости от выбранной кнопки разная. Отсюда следует вывод о том, что само окно диалога возвращает разные значения, которые затем обрабатываются соответствующими кодами программ.
Различают два типа окон диалога: MsgBox и InputBox.
Первое – окно сообщений. Оно может иметь разные наборы кнопок, задаваемых с помощью одной из набора констант. Например, «Да» и «Нет» (vbYesNo) или «Прервать» «Повторить» «Игнорировать» (vbAbortRetryIgnore). Константу можно не задавать, тогда окно диалога при вызове будет выведено с кнопкой ОК.
VBA помогает пользователю определиться с порядком настроек окна сразу после набора инструкции MsgBox(комментарий, константа набора кнопок, наименование окна…).
Значения, возвращаемые диалоговым окном при нажатии соответствующей кнопки:
OK 1
Cancel 2
Abort 3
Retry 4
Ignore 5
Yes 6
No 7
Таким образом мы можем присвоить переменной значение возвращаемое окном диалога, например:
Otv=MsgBox(“Коррекция – да, Новый груз – нет”,vbYesNo,”Ответьте!”), где vbYesNo – константа из окна списка, предлагаемого при заполнении MsgBox. При нажатии на «Да» otv=6, «Нет» otv=7. Далее через оператор условия можно выполнить ветвление программы.
Второй тип окна – окно ввода значений.
Предназначено для присвоения переменной конкретного значения по ходу выполнения программы. Синтаксис применения:
переменная=InputBox(“коментарий или вопрос”[,”заголовок”][,значение по умолчанию])
Содержимое в квадратных скобках общепринято считать как необязательные параметры.
В программе переменной Razmer будет присвоено значение 7 по умолчанию или измененное пользователем при нажатии на «Да» или пустое при нажатии на “Cancel”.
Пример. Вызвать функцию площади круга или функцию длина окружности в диалоге.
В данном примере используется вложенный цикл по переменной j, который необходим для заполнения значений в колонках. Причем его предел зависит он от текущего номера строки.
Пример. Начиная с активной ячейки, по запрашиваемой размерности, построить пирамидальную матрицу, причем грани пирамиды равны 1, а центральное значение – номер слоя пирамиды вида:
MsgBox “Размерность будет изменена до” + Str(Nk)+” строк”
End If
for i=1 to Razm
for j=1 to i
Cells(i+Ns-1, Nk+j -1) = i - j + 1
Cells(i+Ns-1,Nk-j+1) = i - j + 1
Next j
Next i
End Sub
Не пугайтесь кажущейся сложности выражений в индексах строк и колонок. Программный код не ваза, которую не соберешь после падения. Смелее экспериментируйте, но делайте это не беспорядочно, а на основе продуманной логики действий.