Встроенные диалоговые окна
Диалоговые окна предназначены для информирования пользователя, а также для получения данных от пользователя. В большинстве случаев диалоговые окна являются модальными (т. е. блокирующими все окна приложения или только родительское окно) и отображаются на непродолжительный промежуток времени. Язык VBA позволяет использовать как встроенные диалоговые окна, так и окна, создаваемые программистом. В этом разделе мы рассмотрим встроенные диалоговые окна, которые позволят выводить сообщения и получать данные от пользователя. Создание пользовательских диалоговых окон мы рассмотрим в отдельной главе.
Диалоговое окно для вывода сообщения
Для вывода сообщений предназначена функция MsgBox() . Форматы функции:
В параметре <Сообщение> указывается текст сообщения. Если необходимо вывести сообщение на нескольких строках, то следует дополнительно указать последовательность символов \r\n (перевод каретки и перевод строки). Вставить эту последовательность символов позволяет функция Chr(<Код символа>) . Символ \r имеет код 13, а символ \n — код 10. Используя символ конкатенации строк & можно объединить эти символы в последовательность. Пример вывода сообщений:
Вместо функции Chr() можно использовать специальные константы:
- vbCr — вставляет символ \r ; эквивалентно Chr(13) ;
- vbLf — вставляет символ \n ; эквивалентно Chr(10) ;
- vbCrLf — вставляет последовательность символов \r\n ; эквивалентно Chr(13) & Chr(10) ;
- vbNewLine — эквивалентно Chr(13) & Chr(10) или в Macintosh Chr(13) ;
- vbTab — вставляет символ табуляции; эквивалентно Chr(9) .
Пример вывода сообщений на двух строках:
Необязательный параметр <Кнопки> указывает какие кнопки должны отображаться в диалоговом окне, задает стиль иконки и др. свойства окна. В качестве значения можно указать следующие константы (или их комбинацию):
- vbOKOnly — 0 — отображается только кнопка OK (значение по умолчанию);
- vbOKCancel — 1 — отбражаются кнопки OK и Отмена;
- vbAbortRetryIgnore — 2 — отображаются кнопки Прервать, Повтор и Пропустить;
- vbYesNoCancel — 3 — отображаются кнопки Да, Нет и Отмена;
- vbYesNo — 4 — отображаются кнопки Да и Нет;
- vbRetryCancel — 5 — отображаются кнопки Повтор и Отмена;
- vbCritical — 16 — задает вывод иконки критического сообщения (белый крест внутри красного круга). Пример вывода иконки:
- vbQuestion — 32 — задает вывод иконки для запроса подтверждения каких-либо действий (синий вопросительный знак внутри белого круга). Пример вывода иконки:
- vbExclamation — 48 — задает вывод иконки для предупреждающего сообщения (черный вослицательный знак внутри желтого треугольника). Пример вывода иконки:
- vbInformation — 64 — задает вывод иконки для информирующего сообщения (синяя буква i внутри белого круга). Пример вывода иконки:
- vbDefaultButton1 — 0 — первая кнопка выбрана по умолчанию (значение по умолчанию). Пример:
- vbDefaultButton2 — 256 — вторая кнопка выбрана по умолчанию. Пример:
- vbDefaultButton3 — 512 — третья кнопка выбрана по умолчанию. Пример:
- vbDefaultButton4 — 768 — четвертая кнопка выбрана по умолчанию;
- vbApplicationModal — 0 — окно будет модальным в пределах приложения (значение по умолчанию). Прежде чем продолжить работу с приложением окно необходимо закрыть нажатием на одну из кнопок. Пример:
- vbSystemModal — 4096 — окно будет отображаться поверх всех других окон в системе. Прежде чем продолжить работу с приложением окно необходимо закрыть нажатием на одну из кнопок. Пример:
- vbMsgBoxHelpButton — 16384 — добавляет в окно кнопку Справка. Пример:
- vbMsgBoxRight — 524288 — текст выравнивается заголовка и сообщения по правому краю. Пример:
Как видно из примеров, все константы делятся на несколько групп. Первая группа указывает какие кнопки отображаются в окне, вторая группа задает вид иконки, третья группа устанавливает кнопку по умолчанию, четвертая группа управляет модальностью окна. Константы из разных групп можно комбинировать между собой, указывая их через оператор + . Для примера выведем модальное окно с критическим сообщением, которое имеет содержит кнопки Да, Нет, Отмена и Справка, причем по умолчанию будет выбрана кнопка Отмена:
Параметр <Заголовок> в функции MsgBox() задает текст, который будет отображен в заголовке окна. Если параметр не указан, то выводится имя приложения. Пример:
Необязательный параметр <Файл справки> задает имя справочного файла, а параметр <Контекст> — номер раздела в справочном файле. Эти параметры должны указываться одновременно.
После вывода окна пользователь должен нажать одну из кнопок. Благодаря тому, что функция MsgBox() возвращает значение, внутри программы можно определить какую именно кнопку нажал пользователь. Функция возвращает одно из следующих значений:
- vbOK — 1 — нажата кнопка OK;
- vbCancel — 2 — нажата кнопка Отмена или кнопка Закрыть в заголовке окна;
- vbAbort — 3 — нажата кнопка Прервать;
- vbRetry — 4 — нажата кнопка Повтор;
- vbIgnore — 5 — нажата кнопка Пропустить;
- vbYes — 6 — нажата кнопка Да;
- vbNo — 7 — нажата кнопка Нет.
Для примера выполним проверку двумя способами. Первый способ заключается в использовании оператора ветвления If (листинг 1.6), а второй способ — в использовании оператора выбора Select (листинг 1.7).
Листинг 1.6. Проверка нажатой кнопки с помощью оператора If
Листинг 1.7. Проверка нажатой кнопки с помощью оператора Select
Диалоговое окно для ввода данных
Окно для ввода данных реализуется с помощью функции InputBox() . Формат функции:
В параметре <Сообщение> указывается текст сообщения. Если необходимо вывести сообщение на нескольких строках, то следует дополнительно указать последовательность символов \r\n (перевод каретки и перевод строки) или только символ \r . Вставить эту последовательность символов позволяет функция Chr(<Код символа>) . Можно также воспользоваться одной из констант, которые мы уже рассматривали при изучении функции MsgBox() в предыдущем разделе. Пример вывода сообщения на нескольких строках:
Необязательный параметр <Заголовок> задает текст, который будет отображен в заголовке окна. Если параметр не указан, то выводится имя приложения. В необязательном параметре <Значение по умолчанию> можно указать значение, которое отобразится в текстовом поле. Пример:
В необязательных параметрах <X> и <Y> можно указать координаты вывода окна на экране относительно левого верхнего угла. Положительная ось X направлена вправо, а положительная ось Y — вниз. Если параметры не указаны, то окно выводится по центру.
Необязательный параметр <Файл справки> задает имя справочного файла, а параметр <Контекст> — номер раздела в справочном файле. Эти параметры должны указываться одновременно.
Функция возвращает текст, введенный пользователем в текстовое поле. Если пользователь нажал кнопку Отмена или кнопку Закрыть в заголовке окна, то функция вернет пустую строку.
Переделаем нашу первую программу так, чтобы она здоровалась не со всем миром, а только с нами (листинг 1.8).
Листинг 1.8. Пример использования функции InputBox()
Статьи по Visual Basic for Applications (VBA)
Помощь сайту
Yandex-деньги: 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов
Построение диалогов
Диалоги являются абсолютно необходимым средством для повышения управляемости и гибкости макропрограмм.
Они представлены двумя командами: MsgBox (диалог с кнопками) и InputBox (для ввода значений).
Для начинающих программистов этого вполне достаточно.
Синтаксис команд:
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
Можно заметить, что отдельные элементы весьма схожи и повторяются:
prompt — единственный обязательный элемент (он задает текст сообщения, выводимого внутри окна диалога);
title — заголовок окна, обобщающий вопрос диалога;
helpfile. — ваша подсказка, обсуждение (и создание) которой выходит за рамки изучаемого материала.
InputBox
Диалог предназначен для ввода единичного символьного (строкового) значения. Как видно из основного синтаксиса:
InputBox(prompt[, title] [, default] [, xpos] [, ypos]),
обязательным является только поясняющий текст (prompt).
Появляется возможность указать значение по умолчанию (default), пренебрегать которым не стоит. Ведь во многих случаях оно может быть предсказано и пользователю не придется заниматься утомительным вводом.
Также можно указать в твипсах (1/20 часть пикселя, а не пункта, как принято в полиграфии) координаты окна (xpos, ypos). Если соответствующие координаты опущены, то диалог центрируется относительно горизонтали и опускается примерно на треть экрана по вертикали.
Использовать команду следует в виде функции, так как введенное значение обязано быть присвоено переменной.
Результат будет выглядеть так:

Если внимательно посмотреть на текст программы, то закономерным будет вопрос: переменной x (числового типа Single) будет передаваться строковое значение, что является ошибочным?
Однако в VBA это будет обработано правильно, если пользователь введет любое число: преобразование пройдет само собой. Если же он введет буквы или нажмёт кнопку отмены (Cancel), то переменной будет присваиваться строковое значение, что породит ошибку:

Избежать подобной ситуации можно двумя способами, предоставляющими различные возможности.
- преобразованы в 0,
- если в начале строки введены числа («125xyz»), то строка преобразуется в число (125).
При нажатии на кнопку Cancel будет возвращена пустая строка («»), преобразуемая в 0.
Если такой ввод допустим в принципе, то нет возможности прекратить выполнение программы без дополнительного запроса пользователю.
- В строке, выделенной красным, проведен анализ результата ввода и выход из программы при пустой строке. Такой подход вполне приемлем и для случая, когда пользователь забыл задать значение. Здесь ему может быть задан вопрос о необходимости прерывания программы.
- Значение, сохраненное в xVal, можно использовать и в дальнейшем. В том числе для детальной разборки или анализа, в том числе на предмет правильности ввода.
- Появляется возможность ввести несколько значений, например, через запятую, которые потом можно анализировать и использовать в соответствии с замыслом программиста.
- Занята дополнительная память, что является платой за функциональность.
InputBox в Excel VBA
К сожалению, объектная модель Word и Excel не совпадают, в связи с чем приходится говорить, что в Excel можно воспользоваться ещё одним способом:
-
Перечень типов:
- 0 = formulas
- 1 = numbers
- 2 = strings
- 4 = logical values
- 8 = cell references
- 16 = error values
- 64 = arrays
MsgBox
Вспомним синтаксис команды:
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
Атрибут buttons представляет собой сумму трех (реже — более) целых чисел, означающих: набор кнопок, картинку, кнопку по умолчанию. Последняя довольно важна, так как многие пользователи невнимательно относятся к надписям в диалоге, и гораздо разумнее активизировать для него ту кнопку, нажатие на которую требуется чаще. Вместо чисел можно использовать системные переменные памяти. Подробная информация приведена в таблице.
| Переменная Word | Значение | Описание |
| vbOKOnly | 0 | Вывести только кнопку OK |
| vbOKCancel | 1 | Вывести кнопки OK и Cancel |
| vbAbortRetryIgnore | 2 | Вывести кнопки Abort, Retry и Ignore |
| vbYesNoCancel | 3 | Вывести кнопки Yes, No и Cancel |
| vbYesNo | 4 | Вывести кнопки Yes и No |
| vbRetryCancel | 5 | Вывести кнопки Retry и Cancel |
| vbCritical | 16 | Вывести картинку Critical Message |
| vbQuestion | 32 | Вывести картинку Warning Query |
| vbExclamation | 48 | Вывести картинку Warning Message |
| vbInformation | 64 | Вывести картинку Information Message |
| vbDefaultButton1 | 0 | По умолчанию активна 1‑я кнопка |
| vbDefaultButton2 | 256 | По умолчанию активна 2‑я кнопка |
| vbDefaultButton3 | 512 | По умолчанию активна 3‑я кнопка |
| vbDefaultButton4 | 768 | По умолчанию активна 4‑я кнопка |
| vbApplicationModal | 0 | Диалог модален для Word: для продолжения работы в приложении и самого макроса нужно нажать на одну из кнопок |
| vbSystemModal | 4096 | Диалог модален для Windows: все приложения прекращают работу до тех пор, пока пользователь не нажмет на одну из кнопок |
| vbMsgBoxHelpButton | 16384 | Добавляет в диалог кнопку Help (Справка) |
| VbMsgBoxSetForeground | 65536 | Переводит окно диалога на передний план (практическое применение неизвестно) |
| vbMsgBoxRight | 524288 | Надписи выравниваются вправо |
| vbMsgBoxRtlReading | 1048576 | Для языков, читаемых справа налево |
Как видно, если не задавать для кнопок ничего, то получится диалог с кнопкой ОК и без пиктограммы. Кстати, он является одним из наиболее часто используемых вариантов для вывода информации о результатах работы программы как в процессе её отладки, так и при обычном режиме работы.
Пример: MsgBox «Значение х достигло » & x
Диалог будет выглядеть так:
Следует отметить, что кнопка ОК обладает интересным свойством: её можно нажать как мышкой, так и клавишами Enter, Space и Esc.
Так как можно вывести диалог с большим разнообразием кнопок, требуется помочь программе разобраться, какая из них была нажата. В этом случае команда запускается в виде функции, возвращающей значение (целое число) переменной в памяти. Далее можно проанализировать его и принять решение о дальнейших действиях
Ниже приведен список значений, возвращаемых функцией MsgBox() в зависимости от нажатой в диалоге кнопки.
| Значение | Константа Word | Надпись на кнопке |
| 1 | vbOK | OK |
| 2 | vbCancel | Cancel |
| 3 | vbAbort | Abort |
| 4 | vbRetry | Retry |
| 5 | vbIgnore | Ignore |
| 6 | vbYes | Yes |
| 7 | vbNo | No |
Диалог будет выглядеть так:
Можно сказать, что в нем допущена интерфейсная ошибка, так как нажатие клавиши Esc не позволит закрыть диалог. Для комфортности лучше использовать одновременно кнопки Yes, No и Cancel. Для доработки понадобится только заменить в тексте программы 4 на 3: ведь нажатие на Cancel обработается также, как и No (выход из программы).
Обратите внимание! Вместо 4+48, можно было бы записать сразу результат сложения (52). Программа выполнилась бы чуточку быстрее, но редактирование человеком стало бы сложнее. Также можно заменить эту форму сложением программных констант: vbYesNo+vbExclamation, что легче понять при чтении.
Идеальным(?) решением было бы добавление кнопки Cancel, как показано ниже.
Copyright © 1993–2022 Мацкявичюс Д.А. Все права защищены.
Никакая часть сайта не может быть воспроизведена никаким способом без письменного разрешения правообладателя и явной ссылки на данный ресурс.

Функция MsgBox
Выводит сообщение в диалоговом окне, ожидает нажатия кнопки пользователем и возвращает значение типа Integer, которое указывает, какая кнопка была нажата.
Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.
Синтаксис
MsgBox (сообщение, [ кнопки, ] [ заголовок, ] [ файл_справки, контекст ])
Синтаксис функции MsgBox включает следующие именованные аргументы:
| Часть | Описание |
|---|---|
| сообщение | Обязательный аргумент. Строковое выражение, отображающееся в диалоговом окне. Максимальная длина строки аргумента сообщение составляет приблизительно 1024 знака и зависит от их ширины. Если аргумент сообщение содержит несколько строк, их можно разделить с помощью знака возврата каретки (Chr(13)), знака перевода строки (Chr(10)) или сочетания этих знаков (Chr(13) & Chr(10)). |
| кнопки | Необязательный аргумент. Числовое выражение, являющееся комбинацией значений, указывающих количество и тип отображаемых кнопок, стиля значков, выбранной по умолчанию кнопки и модальности окна сообщения. Если аргумент кнопки пропущен, по умолчанию используется значение 0. |
| заголовок | Необязательный аргумент. Строковое выражение, отображаемое в заголовке диалогового окна. Если аргумент заголовок пропущен, в заголовке выводится имя приложения. |
| файл_справки | Необязательный аргумент. Строковое выражение, определяющее файл, в котором содержится контекстная справка для данного диалогового окна. Если задан аргумент файл_справки, необходимо также указать аргумент контекст. |
| контекст | Необязательный аргумент. Числовое выражение, представляющее собой номер контекста, присвоенный автором справки соответствующему разделу. Если задан аргумент контекст, необходимо также указать аргумент файл_справки. |
Параметры
Аргумент кнопки может принимать следующие значения:
| Константа | Значение | Описание |
|---|---|---|
| vbOKOnly | 0 | Отображается только кнопка ОК. |
| vbOKCancel | 1 | Отображаются кнопки ОК и Отмена. |
| vbAbortRetryIgnore | 2 | Отображаются кнопки Прервать, Повторить и Пропустить. |
| vbYesNoCancel | 3 | Отображаются кнопки Да, Нет и Отмена. |
| vbYesNo | 4 | Отображаются кнопки Да и Нет. |
| vbRetryCancel | 5 | Отображаются кнопки Повторить и Отмена. |
| vbCritical | 16 | Отображается значок важного сообщения. |
| vbQuestion | 32 | Отображение значка Warning Query (Запрос с предупреждением). |
| vbExclamation | 48 | Отображение значка Warning Message (Сообщение с предупреждением). |
| vbInformation | 64 | Отображается значок информационного сообщения. |
| vbDefaultButton1 | 0 | По умолчанию активна первая кнопка. |
| vbDefaultButton2 | 256 | По умолчанию активна вторая кнопка. |
| vbDefaultButton3 | 512 | По умолчанию активна третья кнопка. |
| vbDefaultButton4 | 768 | По умолчанию активна четвертая кнопка. |
| vbApplicationModal | 0 | Модальность на уровне приложения. Пользователь должен ответить на сообщение, чтобы продолжить работу в текущем приложении. |
| vbSystemModal | 4096 | Модальность на уровне системы. При ожидании ответа пользователя на сообщение приостанавливается работа всех приложений. |
| vbMsgBoxHelpButton | 16384 | Добавляет кнопку Справка в окно сообщения. |
| vbMsgBoxSetForeground | 65536 | Расположение окна сообщения на переднем плане. |
| vbMsgBoxRight | 524288 | Текст выравнивается по правому краю. |
| vbMsgBoxRtlReading | 1048576 | Система чтения справа налево для иврита и арабского языка. |
Первая группа значений (0–5) отражает число и тип кнопок в диалоговом окне. Вторая группа (16, 32, 48, 64) описывает стиль значка сообщения. Третья группа (0, 256, 512) определяет активную по умолчанию кнопку. Наконец, четвертая группа (0, 4096) устанавливает модальность сообщения. При объединении чисел в итоговое значение аргумента buttons следует использовать только один аргумент из каждой группы.
Приведенные здесь константы определены в Visual Basic для приложений, что позволяет заменять ими числовые значения в любом месте программы.
Возвращаемые значения
| Константа | Значение | Описание |
|---|---|---|
| vbOK | 1 | OK |
| vbCancel | 2 | Отмена |
| vbAbort | 3 | Прервать |
| vbRetry | 4 | Повторить |
| vbIgnore | 5 | Пропустить |
| vbYes | 6 | Да |
| vbNo | 7 | Нет |
Примечания
Если одновременно указаны аргументы файл_справки и контекст, пользователь может нажать клавишу F1 (Windows) или HELP (Macintosh) для просмотра раздела справки, соответствующего аргументу контекст. Некоторые ведущие приложения, например Microsoft Excel, автоматически добавляют кнопку Справка в диалоговое окно.
Если в диалоговом окне есть кнопка Отмена, ее нажатие равносильно нажатию клавиши ESC. Если в диалоговом окне есть кнопка Справка, для него доступна контекстная справка. Однако до нажатия какой-либо другой кнопки никакое значение не возвращается.
Для указания более одного именованного аргумента необходимо использовать функцию MsgBox в выражении. Чтобы пропустить некоторые из позиционных аргументов, нужно вставить соответствующие запятые.
Пример
В приведенном ниже примере функция MsgBox используется для вывода сообщения о критической ошибке в диалоговом окне с кнопками Да и Нет. Кнопка Нет выбрана по умолчанию. Значение, возвращаемое функцией MsgBox, зависит от нажатой пользователем кнопки. Предполагается, что DEMO.HLP является файлом справки и содержит раздел под номером контекста 1000 .
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.