Использование метода Application.InputBox в VBA Excel, его синтаксис и параметры. Значения, возвращаемые диалогом Application.InputBox. Примеры использования.
Метод Application.InputBox предназначен в VBA Excel для вывода диалогового окна с более расширенными возможностями, чем диалоговое окно, отображаемое функцией InputBox. Главным преимуществом метода Application.InputBox является возможность автоматической записи в поле ввода диапазона ячеек (в том числе одной ячейки) путем его выделения на рабочем листе книги Excel и возвращения различных данных, связанных с ним, а также проверка соответствия возвращаемого значения заданному типу данных.
Синтаксис метода
Application.InputBox ( Prompt , Title , Default , Left , Top , HelpFile , HelpContextID , Type )
Обязательным параметром метода Application.InputBox является Prompt, если значения остальных параметров явно не указаны, используются их значения по умолчанию.
Обратите внимание на то, что
- оператор InputBox вызывает функцию InputBox, а
- оператор Application.InputBox вызывает метод InputBox.
Чтобы не было путаницы, метод InputBox пишут как метод Application.InputBox, в том числе и в справке разработчика.
Параметры метода
Параметр | Описание | Значение по умолчанию |
---|---|---|
Prompt | Обязательный параметр. Выражение типа String, отображаемое в диалоговом окне в виде сообщения, приглашающего ввести данные в поле. Разделить на строки сообщение можно с помощью константы vbNewLine. | Нет |
Title | Необязательный параметр. Выражение типа Variant, отображаемое в заголовке диалогового окна. | Слово «Ввод» |
Default | Необязательный параметр. Выражение типа Variant, отображаемое в поле ввода при открытии диалога. | Пустая строка |
Left | Необязательный параметр. Выражение типа Variant, определяющее в пунктах расстояние от левого края экрана до левого края диалогового окна (координата X).* | Горизонтальное выравнивание по центру** |
Top | Необязательный параметр. Выражение типа Variant, определяющее в пунктах расстояние от верхнего края экрана до верхнего края диалогового окна (координата Y).* | Приблизительно равно 1/3 высоты экрана*** |
HelpFile | Необязательный параметр. Выражение типа Variant, указывающее имя файла справки для этого поля ввода. | Нет**** |
HelpContextID | Необязательный параметр. Выражение типа Variant, указывающее идентификатор контекста в справочном разделе файла справки. | Нет**** |
Type | Необязательный параметр. Выражение типа Variant, указывающее тип возвращаемых данных. | 2 (текст) |
* Параметры Left и Top учитываются при отображении диалогового окна методом Application.InputBox в Excel 2003, а в последующих версиях Excel 2007-2016 уже не работают.
**При первом запуске горизонтальное выравнивание устанавливается по центру, при последующих — форма отобразиться в том месте, где ее последний раз закрыли.
***При первом запуске вертикальное расположение приблизительно равно 1/3 высоты экрана, при последующих — форма отобразиться в том месте, где ее последний раз закрыли.
**** Если будут указаны параметры HelpFile и HelpContextID, в диалоговом окне появится кнопка справки.
Возвращаемые значения
Диалоговое окно, созданное методом Application.InputBox, возвращает значение типа Variant и проверяет соответствие возвращаемого значения типу данных, заданному параметром Type. Напомню, что тип значений Variant является универсальным контейнером для значений других типов, а в нашем случае для возвращаемых в зависимости от значения параметра Type.
Аргументы параметра Type и соответствующие им типы возвращаемых значений:
Type | Возвращаемое значение |
---|---|
0 | Формула |
1 | Число |
2 | Текст (string) |
4 | Логическое значение (True или False) |
8 | Ссылки на ячейки в виде объекта Range |
16 | Значение ошибки (например, #н/д) |
64 | Массив значений |
Примеры
В отличие от других встроенных диалоговых окон VBA Excel, Application.InputBox при запуске процедуры непосредственно из редактора, открывается прямо в редакторе, и, чтобы выбрать диапазон ячеек на рабочем листе, нужно по вкладке браузера перейти в книгу Excel. Поэтому для тестирования диалога Application.InputBox удобнее создать кнопку, перетащив ее на вкладке «Разработчик» из «Элементов управления формы» (не из «Элементов ActiveX») и в окошке «Назначить макрос объекту» выбрать имя тестируемой процедуры. Чтобы можно было выбрать процедуру сразу при создании кнопки, она должна быть уже вставлена в стандартный программный модуль. Можно назначить процедуру кнопке позже, кликнув по ней правой кнопкой мыши и выбрав в контекстном меню «Назначить макрос…».
Пример 1 — параметры по умолчанию
Тестируем метод Application.InputBox с необязательными параметрами по умолчанию. Аргумент параметра Type по умолчанию равен 2.
Sub Test1() Dim a As Variant a = Application.InputBox(«Выберите ячейку:») MsgBox a End Sub |
Скопируйте код и вставьте в стандартный модуль, для удобства создайте на рабочем листе кнопку из панели «Элементы управления формы» и назначьте ей макрос «Test1». На рабочем листе заполните некоторые ячейки разными данными, нажимайте кнопку, выбирайте ячейки и смотрите возвращаемые значения.
Клик по кнопке «OK» диалога Application.InputBox в этом примере возвращает содержимое выбранной ячейки (или левой верхней ячейки выбранного диапазона), преобразованное в текстовый формат. У дат в текстовый формат преобразуется их числовое представление.
Клик по кнопке «Отмена» или по закрывающему крестику возвращает строку «False».
Пример 2 — возвращение объекта Range
В этом примере тестируем метод Application.InputBox с обязательным параметром Prompt, разделенным на две строки, параметром Title и значением параметра Type равным 8. Так как в данном случае диалог в качестве значения возвращает объект Range, он присваивается переменной с помощью оператора Set. Для этого примера создайте новую кнопку из панели «Элементы управления формы» и назначьте ей макрос «Test2».
Sub Test2() Dim a As Variant Set a = Application.InputBox(«Пожалуйста,» _ & vbNewLine & «выберите диапазон:», _ «Наш диалог», , , , , , 8) MsgBox a.Cells(1) MsgBox a.Address End Sub |
В первом информационном окне MsgBox выводится значение первой ячейки выбранного диапазона, во втором — адрес диапазона.
Напомню, что обращаться к ячейке в переменной диапазона «a» можно не только по порядковому номеру (индексу) самой ячейки, но и по индексу строки и столбца, на пересечении которых она находится. Например, оба выражения
указывают на первую ячейку диапазона. А в объектной переменной «a» с присвоенным диапазоном размерностью 3х3 оба выражения
указывают на центральную ячейку диапазона.
При использовании метода Application.InputBox происходит проверка введенных данных: попробуйте понажимать кнопку «OK» с пустым полем ввода и с любым введенным текстом (кроме абсолютного адреса). Реакция в этих случаях разная, но понятная.
Есть и отрицательные моменты: при использовании в диалоге Application.InputBox параметра Type со значением равным 8, нажатие кнопок «Отмена» и закрывающего крестика вызывают ошибку Type mismatch (Несоответствие типов). Попробуйте нажать кнопку «Отмена» или закрыть форму диалога.
Решить эту проблему можно, добавив обработчик ошибок. Скопируйте в стандартный модуль код следующей процедуры, создайте еще одну кнопку и назначьте ей макрос «Test3».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub Test3() Dim a As Variant ‘При возникновении ошибки ‘перейти к метке «Inform» On Error GoTo Inform Set a = Application.InputBox(«Пожалуйста,» _ & vbNewLine & «Выберите диапазон:», _ «Наш диалог», , , , , , 8) MsgBox a.Cells(1) MsgBox a.Address ‘Выйти из процедуры, ‘если не произошла ошибка Exit Sub ‘Метка Inform: ‘Вывести информационное окно с ‘сообщением об ошибке MsgBox «Диалог закрыт или нажата кнопка « _ & Chr(34) & «Отмена» & Chr(34) & «!» End Sub |
Попробуйте теперь нажать кнопку «Отмена» или закрыть форму диалога крестиком.
Пример 3 — возвращение массива
Скопируйте в стандартный модуль код процедуры ниже, создайте четвертую кнопку и назначьте ей макрос «Test4». В этой процедуре указан только аргумент параметра Type равным 64, остальные необязательные параметры оставлены по умолчанию.
Sub Test4() Dim a As Variant a = Application.InputBox(«Выберите диапазон:», , , , , , , 64) MsgBox a(3, 3) End Sub |
Откройте диалоговую форму, нажав четвертую кнопку, и выберите диапазон размерностью не менее 3х3. Нажмите «OK»: информационное сообщение выведет значение соответствующего элемента массива «a», в нашем случае — «a(3, 3)». Если вы выберите диапазон по одному из измерений меньше 3, тогда строка «MsgBox a(3, 3)» вызовет ошибку, так как указанный элемент выходит за границы массива. Эта же строка по этой же причине вызовет ошибку при нажатии кнопки «Отмена» и при закрытии диалога крестиком. Если закомментировать строку «MsgBox a(3, 3)», то закрываться диалог будет без ошибок и при нажатии кнопки «Отмена», и при закрытии диалога крестиком.
Чтобы не попасть за границу массива используйте функцию UBound для определения наибольшего доступного индекса по каждому из двух измерений, например, вот так:
Sub Test5() Dim a As Variant a = Application.InputBox(«Выберите диапазон:», , , , , , , 64) MsgBox «Максимальный индекс 1 измерения = « & UBound(a, 1) & _ vbNewLine & «Максимальный индекс 2 измерения = « & UBound(a, 2) End Sub |
только присваивайте значения выражений «UBound(a, 1)» и «UBound(a, 2)» числовым переменным. А этот код используйте для ознакомления с работой функции UBound и ее тестирования.
В этой процедуре ошибка выдается при выборе одной ячейки или диапазона в одной строке, очевидно, Excel воспринимает его как одномерный массив. Хотя при выборе диапазона в одном столбце, по крайней мере в Excel 2016, все проходит гладко и вторая строка информационного сообщения отображается как «Максимальный индекс 2 измерения = 1».
Ошибка выдается и при нажатии кнопки «Отмена», и при закрытии диалога крестиком, так как переменная «а» в этом случае еще не является массивом, а мы пытаемся использовать ее как аргумент для функции массива, что и вызывает ошибку.
Пример 4 — возвращение формулы
Возвращение формулы рассмотрим на следующем примере:
Sub Test6() Dim a As Variant a = Application.InputBox(«Создайте формулу:», , , , , , , 0) Cells(1, 1) = a End Sub |
На активном листе Excel заполните некоторые ячейки числами и запустите процедуру на выполнение. После отображения диалога Application.InputBox выбирайте по одной ячейке с числами, вставляя между ними математические операторы. После нажатия на кнопку «OK» формула запишется в первую ячейку активного рабочего листа «Cells(1, 1)» (в текст формулы ее не выбирайте, чтобы не возникла циклическая ссылка). При нажатии на кнопку «Отмена» и при закрытии диалога крестиком в эту ячейку запишется слово «Ложь».
Можно записывать не только математические формулы, но и объединять содержимое ячеек с помощью оператора «&» и многое другое. Только не понятно, для чего это вообще нужно, как, впрочем, и возврат логических, числовых значений и значений ошибки. Вы можете протестировать их возврат с помощью процедуры «Test6», заменив в ней параметр Type метода Application.InputBox соответствующим для возвращения логических, числовых значений и значений ошибки.
- Категория: VBA
- Опубликовано: 10 марта 2018
- Просмотров: 18242
В этой статье Вы научитесь создавать поле ввода в VBA Excel — InputBox, в которое можно вносить различную информацию для вычислений.
Функция InputBox предлагает пользователям ввести значения. После ввода значений, если пользователь нажимает кнопку OK или нажимает ENTER на клавиатуре, функция InputBox возвращает текст в текстовое поле. Если пользователь нажмет кнопку «Отмена», функция вернет пустую строку («»).
Синтаксис
InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context])
Параметр Описание
- Запрос — требуемый параметр. Строка, отображаемая в виде сообщения в диалоговом окне. Максимальная длина приглашения — около 1024 символов. Если сообщение распространяется более чем на одну строку, то строки могут быть разделены с использованием символа возврата каретки (Chr (13)) или символа перевода строки (Chr (10)) между каждой строкой.
- Заголовок — необязательный параметр. Строковое выражение отображается в строке заголовка диалогового окна. Если заголовок оставлен пустым, имя приложения помещается в строку заголовка.
- По умолчанию — необязательный параметр. Текст по умолчанию в текстовом поле, которое пользователь хотел бы отобразить.
- XPos — необязательный параметр. Положение оси X представляет собой приблизительное расстояние от левой стороны экрана по горизонтали. Если оставить поле пустым, поле ввода будет располагаться по горизонтали.
- YPos — необязательный параметр. Положение оси Y представляет собой приблизительное расстояние от левой стороны экрана по вертикали. Если оставить пустым, поле ввода будет вертикально центрировано.
- Файл справки — необязательный параметр. Строковое выражение, которое идентифицирует файл справки, который будет использоваться для предоставления контекстно-зависимой справки для диалогового окна.
- context — Необязательный параметр. Числовое выражение, которое идентифицирует номер контекста справки, присвоенный автору справки, в соответствующий раздел справки. Если контекст предоставлен, также должен быть предоставлен справочный файл.
пример
Вычислим площадь прямоугольника, получив значения от пользователя во время выполнения с помощью двух полей ввода (один для длины и один для ширины).
Function findArea() Dim Length As Double Dim Width As Double Length = InputBox("Введите длину ", "Введите число") Width = InputBox("Введите ширину", "Введите число") findArea = Length * Width End Function
Шаг 1 — Чтобы выполнить то же самое, вызовите с помощью имени функции и нажмите Enter, как показано на следующем снимке экрана.
Шаг 2 — После выполнения отображается первый поле ввода (длина). Введите значение в поле ввода.
Шаг 3 — После ввода первого значения отображается второе поле ввода (ширина).
Шаг 4 — После ввода второго номера нажмите кнопку OK. Область отображается, как показано на следующем снимке экрана.
С уважением, авторы сайта Компьютерапия
Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!
Подобно многим языкам программирования Visual Basic for Application (VBA) позволяет создать три типа процедур: Sub, Function, Property.
Процедура – это набор описаний и инструкций, сгруппированных для выполнения.
Процедура Sub – набор команд, с помощью которого можно решить определенную задачу. При ее запуске выполняются команды процедуры, а затем управление передается в приложение или процедуру, которая вызвала процедуру Sub. Записываемые макросы автоматически описываются как процедуры Sub, любой макрос или другой код VBA, который просто выполняет определенный набор действий, используя приложения Office, и обычно является процедурой Sub.
Процедура Function (или функция) также представляет собой набор команд, который решает определенную задачу. Различия заключается в том, что процедуры данного типа обязательно возвращают значение. При создании процедуры Function можно описать тип данных, который возвращает функция. Функции обычно используются при выполнении вычислений, операциями с текстом, либо возвращают логические значения.
Процедура Property используется для ссылки на свойство объекта. Данный тип процедур применяется для установки или получения значения пользовательских свойств форм и модулей. Процедуры облегчают хранение и применение информации, если использовать их сначала для сохранения в свойстве этой информации, а затем для ее чтения.
Структура процедуры
При записи процедуры требуется соблюдать правила ее описания. Упрощенный синтаксис для процедур Sub является следующим:
Sub имя ([аргументы]) Инструкции End Sub
Синтаксис описания функций очень похож на синтаксис описания процедуры Sub, однако, имеются некоторые отличия:
Function имя ([аргументы]) [As Тип] Инструкции имя = выражение End Function
Использование операторов
Процедуры состоят из операторов – наименьших единиц программного кода. Как правило, операторы занимают по одной строке программного кода, и в каждой строке обычно содержится только один оператор, но это не обязательно. В VBA имеется четыре типа операторов: объявления, операторы присваивания, выполняемые операторы и параметры компилятора.
Объявления
Объявление – это оператор, сообщающий компилятору VBA о намерениях по поводу использования в программе именованного объекта (переменной, константы, пользовательского типа данных или процедуры). Кроме того, объявление задает тип объекта и обеспечивает компилятору дополнительную информацию о том, как использовать данный объект. Объявив объект, можно использовать его в любом месте программы.
Переменные – это именованные значения, которые могут изменяться во время выполнения программы.
Рассмотрим пример объявления переменной.
С помощью оператора Dim объявляется переменная с именем МоеЛюбимоеЧисло и объявляется, что значение, которое она будет содержать, должно быть целым:
Dim МоеЛюбимоеЧисло As Integer
Константы представляют собой именованные значения, которые не меняются.
Оператор Constant создает строковую константу (текст) с именем НеизменныйТекст, представляющую собой набор символов Вечность:
Constant НеизменныйТекст = "Вечность"
Оператором Type объявляется пользовательский тип данных с именем Самоделкин, определяя его как структуру, включающую строковую переменную с именем Имя и переменную типа Date с именем ДеньРождения. В данном случае объявление займет несколько строк:
Type Самоделкин Имя As String ДеньРождения As Date End Type
Объявление Private создает процедуру типа Sub с именем СкрытаяПроцедура, говоря о том, что эта процедура является локальной в смысле области видимости. Завершающий процедуру оператор End Sub считается частью объявления.
Private Sub СкрытаяПроцедура () инструкции End Sub
Оператор присваивания
Оператор присваивания = приписывают переменным или свойствам объектов конкретные значения. Такой оператор всегда состоят из трех частей: имени переменной, или свойства, знака равенства и выражения, задающего нужное значение.
Оператор = присваивает переменной МоеЛюбимоеЧисло значение суммы переменной ДругоеЧисло и числа 12.
МоеЛюбимоеЧисло = ДругоеЧисло + 12
В следующей строке кода, записывается, что свойству Color (Цвет) объекта AGraphicShape присваивается значение Blue (Синий) в предположении, что Blue является именованной константой:
AGraphicShape.Color = Blue
В следующеей строке, чтобы задать значение переменной КвадратныйКорень, для текущего значения переменной МоеЛюбимоеЧисло вызывается функция Sqr — встроенная функция VBA вычисления квадратного корня:
КвадратныйКорень = Sqr (МоеЛюбимоеЧисло)
В VBA выражением называется любой фрагмент программного кода, задающий некоторое числовое значение, строку текста или объект. Выражение может содержать любую комбинацию чисел или символов, констант, переменных, свойств объектов, встроенных функций и процедур типа Function, связанных между собой знаками операции (например, + или *). Несколько примеров выражений:
Выражение |
Значение |
3.14 |
3.14 |
Xn*5 |
10 (в предположении, что Xn = 2) |
(12 — Sqr(x))/5 |
2 (в предположении, что х = 4) |
«Розы красные,» & |
Розы красные, фиалки фиолетовые |
Выполняемые операторы
Выполняемые операторы делают главную работу в программе и используются для выполнения следующих задач:
- вызов процедуры;
- активизация метода некоторого объекта;
- управление порядком, в котором должны выполняться другие операторы, посредством организации циклов или выбором участка программного кода (из нескольких альтернатив) для последующего выполнения;
- выполнение одного из встроенных операторов VBA или функции.
Пример. Оператор, вызывающий для выполнения метод Rotate объекта AGraphicShape:
AGraphicShape. Rotate(90)
Запись нескольких операторов
Как правило, каждый оператор занимает одну строку программного кода, но VBA не обязывает уместить оператор в одной строке. Если оператор слишком длинный, можно разместить его в двух или более строках, добавив в конце каждой из строк (кроме последней) символ подчеркивания (_).
Можно сделать и наоборот — разместить несколько операторов в одной строке программного кода. Например,
Dim A As Integer, В As Integer: A = 3: B = 5: A = A +B
Эта строка программного кода эквивалентна следующим четырем строкам:
Dim A As Integer, В As Integer A = 3 B = 5 А = А + В
Самыми простыми диалоговыми окнами являются окна сообщений (message boxes) — это диалоговые окна, которые выдают пользователю сообщения и снабжаются одной или более кнопками для выбора. В VBA они создаются с использованием функции MsgBox.
В своей самой простой форме MsgBox используется как оператор с одним аргументом – сообщением, которое должно отображаться. Например, приведенный ниже макрос создаёт сообщение, показанное на рисунке.
Sub Program () MsgBox "Это - окно сообщений" End Sub
MsgBox можно использовать для отображения числового значения.
Sub ShoeValue() Amount = 10 MsgBox Amount End Sub
Переменной Amount присваивается значение 10. На следующей строке для отображения значения Amount используется MsgBox. Вокруг Amount нет кавычек, поскольку это – значение переменной, которое нужно выдать на экран, а не слово «Amount».
Чтобы использовать вместе две отдельные строки в одном окне сообщения, следует использовать операцию конкатенации (&) — объединение.
Sub SayGoodNight() Name = "Саша" MsgBox "Пожелайте доброй ночи " & Name End Sub
Переменной Name присваивается строка «Саша». В строке кода с MsgBox задаётся текстовая строка «Пожелайте доброй ночи «, за которой следует & Name, указывая MsgBox присоединить значение переменной Name к предыдущей текстовой строке.
Опции MsgBox
необязательные аргументы, например, для того, чтобы вставить значок или изменить заголовок (title).
MsgBox "Это - замечательное окно сообщений", _vbExclamation, "Персональное окно"
Существует четыре значка для окон сообщений. Каждый имеет определённое числовое значение, которое должно передаваться в качестве аргумента MsgBox. Однако вместо числа можно использовать константы со специальными именами, встроенные в VBA.
Таблица 1
Значки окна сообщений MsgBox
Отображение |
Константа |
Когда используется |
vbInformation |
для сообщения, не требующего ответа |
|
vbQuestion |
для того, чтобы задать вопрос |
|
vbExclamation |
для выдачи важной информации |
|
vbCritical |
для предупреждения |
MsgBox как функция
MsgBox является функцией и может возвращать значение, соответствующее той кнопке, которую нажимает пользователь. Одной из имеющихся опций окна сообщения является изменение кнопок, которое оно отображает. Вот окно сообщений, которое появляется, когда осуществляется выход из Excel, имея не сохраненные изменения в документе. Это окно имеет три кнопки.
После выбора соответствующей кнопки Excel получает информацию о том, какую кнопку выбрали.
Общий формат для функции MsgBox:
MsgBox(prompt [, buttons] [, title])
где prompt — единственный обязательный аргумент. Для окна сообщений следует задавать текстовую строку с информацией. если вы хотите изменить заголовок, появляющийся в верхней части окна, задайте для заголовка (title) текстовую строку. По умолчанию используется заголовок Microsoft Excel.
Таблица 2 Комбинации кнопок MsgBox
Отображение |
Константа |
Когда используется |
vbOKOnly |
Когда не требуется от пользователя принятия решения |
|
vbOKCancel |
Когда окно сообщений объясняет возможное действие. Позволяет пользователю сделать выбор с помощью кнопки Отмена |
|
vbYesNo |
Альтернатива константе vbOKCancel, когда кажется, что это сделает окно сообщений более понятным |
|
vbYesNoCancel |
Для таких ситуаций, как выход или закрытие файлов без сохранения (подобно ситуации, показанной на рисунке выше) |
|
vbAbortRetryIgnore |
При ответе на сообщения об ошибках диска или файла |
|
|
vbRetryCancel |
При ответе на сообщения об ошибках диска или файла |
Если не указывать, какие кнопки необходимо отображать в окне сообщений, то используется значение по умолчанию, соответствующее кнопке Оk.
Примеры решения задач
Приведем несколько примеров решения задач на VBA.
Пример 1. Вычислить значение выражения a равного
, при x = 3, y = 2.5
Решение.
Sub выражение1() Dim A, x, y x = 3 y = 2.5 A = 2 * x - 3 * y MsgBox (A) End Sub
Пояснение решения.
В строке Dim A, x, y объявляются переменные A, x, y.
Пример 2.
Пример 2. Вычислить значение выражения a равного
, при x = 3, y = 2.5
Замечание: значения x и y вводит пользователь.
Решение.
Sub выражение2() Dim A, x, y As Double x = InputBox("Введите x=") y = InputBox("Введите y=") A = 2 * x - 3 * y MsgBox (A) End Sub
Пояснение решения.
В строке Dim A, x, y As Double описываются переменные A, x, y как числа двойной точности.
При использовании строки
x = InputBox("Введите x=")
появиться окно
Пример 3
Пример 3. Вычислить значение выражения a равного
, при x = 3, y = 2.5
Замечание: значения x и y вводит пользователь, ответ выводится в виде «a = <значение>».
Решение.
Sub выражение3() Dim A, x, y As Double Dim ответ As String x = InputBox("Введите x=") y = InputBox("Введите y=") A = 2 * x - 3 * y ответ = "a=" + Str(A) MsgBox (ответ) End Sub
Пояснение решения.
В строке Dim ответ As String описывается переменная ответ как строковая.
Код Str(A) преобразует значение переменной A в строку.
Пример 4
Пример 4. Вычислить значения выражений при x = 3, y = 2.5
,
,
,
,
Решение.
Sub выражение4() Dim A, b, c, d, a1, x, y As Double x = InputBox("Введите x=") y = InputBox("Введите y=") A = 2 * x - 3 * y b = (2 * x - 3 * y) / 2 c = (2 * x - 3 * y) / 2 * x d = (2 * x - 3 * y) / (2 * x) a1 = (2 * x - 3 * y) / (2 * x) + (5 - x) / (3 + y) MsgBox ("a=" + Str(A)) MsgBox ("b=" + Str(b)) MsgBox ("c=" + Str(c)) MsgBox ("d=" + Str(d)) MsgBox ("a1=" + Str(a1)) End Sub
Пример 5
Пример 5. Выполнить пример 4, другим способом, с помощью вспомогательных переменных.
Решение.
Sub выражение5() Dim A, b, c, d, a1, a2, b1, c1, c2, x, y As Double x = InputBox("Введите x=") y = InputBox("Введите y=") A = 2 * x - 3 * y b = (2 * x - 3 * y) / 2 c = (2 * x - 3 * y) / 2 * x d = (2 * x - 3 * y) / (2 * x) a1 = (2 * x - 3 * y) / (2 * x) + (5 - x) / (3 + y) ‘ новое решение b1 = A / 2 c1 = b * x c2 = b / (2 * x) a2 = d + (5 - x) / (3 + y) MsgBox ("a=" + Str(A)) MsgBox ("b=" + Str(b)) MsgBox ("c=" + Str(c)) MsgBox ("d=" + Str(d)) MsgBox ("a1=" + Str(a1)) MsgBox ("b1=" + Str(b1)) MsgBox ("c1=" + Str(c1)) MsgBox ("c2=" + Str(c2)) MsgBox ("a2=" + Str(a2)) End Sub
Пример 6
Пример 6. Вычислить площадь треугольника по трем известным сторонам. Например, a = 3, b = 4, c = 5.
Решение.
Sub Герон1() Dim A, b, c, p, s As Double A = 3 b = 4 c = 5 p = (A + b + c) / 2 s = Sqr(p * (p - A) * (p - b) * (p - c)) MsgBox ("s=" + Str(s)) End Sub
Пояснение решения.
Для решения задачи используется формула Герона.
Пример 7
Пример 7. Вычислить площадь треугольника по трем известным сторонам.
Решение.
Sub Герон2() Dim A, b, c, p, s As Double A = Val(InputBox("Введите a=")) b = Val(InputBox("Введите b=")) c = Val(InputBox("Введите c=")) p = (A + b + c) / 2 s = Sqr(p * (p - A) * (p - b) * (p - c)) MsgBox ("s=" + Str(s)) End Sub
Пояснение решения.
Код Val(InputBox(«Введите a=»)) преобразует введенное значение через InputBox в число, так как InputBox возвращает строку. Если такого преобразования не сделать, то программа правильно вычислять s не будет.
Пример 8
Пример 8. Вычислить гипотенузу прямоугольного треугольника по двум катетам.
Решение.
Sub гипотенуза() Dim a, b, c, p, s As Double a = Val(InputBox("Введите a=")) b = Val(InputBox("Введите b=")) c = Sqr(a ^ 2 + b ^ 2) MsgBox ("c=" + Str(c)) End Sub
Построение диалогов
См. также Экранные формы (Forms).
Диалоги
Диалоги являются абсолютно необходимым средством для повышения управляемости и гибкости макропрограмм.
Они представлены двумя командами: MsgBox (диалог с кнопками) и InputBox (для ввода значений).
Для начинающих программистов этого вполне достаточно.
Синтаксис команд:
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
Доступ к этим материалам предоставляется только зарегистрированным пользователям!
InputBox
Диалог предназначен для ввода единичного символьного (строкового) значения. Как видно из основного синтаксиса:
InputBox(prompt[, title] [, default] [, xpos] [, ypos]),
обязательным является только поясняющий текст (prompt).
Появляется возможность указать значение по умолчанию (default), пренебрегать которым не стоит.
Ведь во многих случаях оно может быть предсказано и пользователю не придется заниматься утомительным вводом.
Также можно указать в твипсах (1/20 часть пикселя, а не пункта, как принято в полиграфии) координаты окна (xpos, ypos).
Если соответствующие координаты опущены, то диалог центрируется относительно горизонтали и опускается примерно на треть экрана по вертикали.
Использовать команду следует в виде функции, так как введенное значение обязано быть присвоено переменной.
Dim x As Single x = InputBox("Введите значение x для подстановки")
Результат будет выглядеть так:
Если внимательно посмотреть на текст программы, то закономерным будет вопрос: переменной x (числового типа Single) будет передаваться строковое значение, что является ошибочным?
Однако в VBA это будет обработано правильно, если пользователь введет любое число: преобразование пройдет само собой. Если же он введет буквы или нажмёт кнопку отмены (Cancel), то переменной будет присваиваться строковое значение, что породит ошибку:
Избежать подобной ситуации можно двумя способами, предоставляющими различные возможности.
Решение 1
x = Val(InputBox("Введите значение x для подстановки"))
Здесь сразу происходит преобразование типа возвращаемого значения функцией Val(). В результате при вводе букв они будут:
- преобразованы в 0,
- если в начале строки введены числа («125xyz»), то строка преобразуется в число (125).
При нажатии на кнопку Cancel будет возвращена пустая строка («»), преобразуемая в 0.
Если такой ввод допустим в принципе, то нет возможности прекратить выполнение программы без дополнительного запроса пользователю.
Решение 2
Dim x As Single, xVal As String
xVal = InputBox("Введите значение x для подстановки")
If xVal = "" Then Exit Sub
x = Val(xVal)
В данном случае создаётся дополнительная переменная (xVal), в которой хранится результат ввода. Что мы имеем в результате?
- В строке, выделенной красным, проведен анализ результата ввода и выход из программы при пустой строке.
Такой подход вполне приемлем и для случая, когда пользователь забыл задать значение.
Здесь ему может быть задан вопрос о необходимости прерывания программы. - Значение, сохраненное в xVal, можно использовать и в дальнейшем. В том числе для детальной разборки или анализа, в том числе на предмет правильности ввода.
- Появляется возможность ввести несколько значений, например, через запятую, которые потом можно анализировать и использовать в соответствии с замыслом программиста.
- Занята дополнительная память, что является платой за функциональность.
InputBox в Excel VBA
К сожалению, объектная модель Word и Excel не совпадают, в связи с чем приходится говорить, что в Excel можно воспользоваться ещё одним способом:
Dim x As Variant x = Application.InputBox(Prompt:="Введите значение x для подстановки", Type:=1)
В этой ситуации пользователь сможет ввести данные только указанного типа (числового). Если можно вводить несколько типов, то следует задать тип как сумму соответствующих типов: 1+2 (либо сразу 3) — можно вводить цифры и символы.
- Перечень типов:
- 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 |
Пример:
Dim RunMacro As Byte 'Задать целочисленную переменную минимального размера RunMacro = MsgBox("Заменить дефисы в документе?", 4 + 48, "Замена дефисов") 'Запустить диалог с кнопками Yes+No и картинкой "Внимание!" 'Целое число, соответствующее нажатой кнопке, запомнить в RunMacro If RunMacro = 6 Then 'Нажато Yes (вместо 6 можно записать vbYes) Selection.HomeKey Unit:=wdStory 'Перейти на начало документа и продолжить программу после End If Else 'Нажато не Yes (No для нашего примера) Exit Sub 'Выйти из программы, не делая ничего End If ... Основная программа
Диалог будет выглядеть так:
Можно сказать, что в нем допущена интерфейсная ошибка, так как нажатие клавиши Esc не позволит закрыть диалог.
Для комфортности лучше использовать одновременно кнопки Yes, No и Cancel.
Для доработки понадобится только заменить в тексте программы 4 на 3: ведь нажатие на Cancel обработается также, как и No (выход из программы).
Обратите внимание! Вместо 4+48, можно было бы записать сразу результат сложения (52).
Программа выполнилась бы чуточку быстрее, но редактирование человеком стало бы сложнее.
Также можно заменить эту форму сложением программных констант: vbYesNo+vbExclamation, что легче понять при чтении.
Идеальным(?) решением было бы добавление кнопки Cancel, как показано ниже.
RunMacro = MsgBox("Заменить дефисы в документе?", 3 + 48, "Замена дефисов")
См. также Экранные формы (Forms).
Функция MsgBox хороша, когда от
пользователя надо получить простые
данные — ответы типа Да-Нет или
ОК-Отмена. Если необходимо ввести
число или текст, то применяется функция
InputBox. Эта функция отображает
диалоговое окно ввода, содержащее поле
ввода и поясняющий текст. Функция
InputBox имеет следующий синтаксис:
InputBox
приглашение[,
заголовок]
[, по_умолчанию]
[, хпоз]
[, yпоз]
[, файл_справки,
содержание])
Эта функция требует обязательного
задания только аргумента приглашение.
Так же, как и в функции MsgBox, значением
аргумента приглашение служит
текстовая строка, которая отображается
в диалоговом окне ввода в качестве
сообщения.
Аргумент заголовок используется
для задания текста, который помещается
в строке заголовка окна ввода. Если этот
аргумент не задан, то в строке заголовка
отображается Microsoft Excel.
Аргумент по_умолчанию задает
значение, которое отображается по
умолчанию в поле ввода, пока пользователь
не введет свое значение. Если этот
аргумент опустить, то поле ввода
отображается пустым.
Необязательные аргументы xпоз и
yпоз задают положение окна ввода на
экране. Аргументы файл_справки и
содержание используются в том
случае, если вы создаете для своего
приложения собственную систему справки.
Возвращаемым значением функции InputBox
является значение, введенное пользователем
в поле ввода. Для иллюстрации использования
этой функции выполните следующий пример.
-
Вставьте новую подпрограмму в текущий
модуль и назовите ее ПримерВвода. -
Введите следующий код:
Dim
iResult As Integer
iResult
= InputBox(“Введите число:”)
MsgBox
iResult
ActiveCell.Value
= iResult
Этот код открывает окно ввода для ввода
числа, которое затем будет отображено
в окне сообщения и помещено в текущую
ячейку рабочего листа.
-
Нажмите клавишу <F5> для выполнения
процедуры. Отобразится окно ввода (рис.
5.3). -
Введите число и нажмите клавишу <Enter>.
Открывшееся окно сообщения покажет
введенное вами число. -
Щелкните на кнопке ОК. Окно сообщения
закроется. -
Перейдите в рабочую книгу. В активной
ячейке рабочего листа вы увидите
введенное число.
Если вы заглянете в справочную систему
VBA, то прочитаете, что функция InputBox
возвращает строковое (текстовое)
значение. Это не совсем точно. В последней
версии Visual Basic (и, следовательно, VBA) тип
возвращаемого значения определен как
Variant, т.е. тип определяется введенным
значением. Иначе как бы сработала наша
процедура, где переменная iResult
объявлена как Integer? Если пользователь
щелкнет на кнопке Отмена, то в этом
случае функция InputBox возвращает
строку нулевой длины (“ ”).
Рис. 5.3. Окно ввода готово к вводу числа
Метод InputBox
Excel предлагает еще один путь получения
данных от пользователя, который называется
методом InputBox. Метод InputBox на
первый взгляд имеет только пару
незначительных отличий от функции
InputBox. Чтобы разобраться в этих
отличиях, рассмотрим сначала синтаксис
метода InputBox.
Application.InputBox(приглашение,
[заголовок],
[по_умолчанию],
[слева],
[сверху),
[файл_справки],
[содержание],
[тип])
Синтаксис очень похож на синтаксис
функции InputBox. Отметим, что оператор
начинается со слова Application. Excel
является собственником метода InputBox,
поэтому здесь присутствует слово
Application (приложение). Более подробно
суть методов рассмотрена в 8-м часе.
Большинство аргументов вам знакомы.
Аргументы слева и сверху играют
ту же роль, что и аргументы хпоз и
yпоз в функции InputBox.
Основное отличие синтаксиса метода
InputBox от синтаксиса одноименной
функции заключается в последнем аргументе
тип (type). Необязательный аргумент
тип позволяет явно указать тип
возвращаемого значения. В табл. 5.3
содержатся значения, которые может
принимать этот аргумент.
Таблица 5.3. Значения аргумента тип
Значение |
Возвращаемое |
0 |
Формула |
1 |
Число |
2 |
Текст (строка) |
4 |
Логические значения, |
8 |
Ссылка на ячейку |
16 |
Значение ошибки |
64 |
Массив значений |
Обратите внимание, что в последовательности
чисел, задающих значение аргумента тип,
есть пропуски, например между числами
4 и 8 или между 16 и 64. Это сделано потому,
что можно суммировать значения данного
аргумента. Например, если вы хотите,
чтобы метод мог возвращать как текст,
так и числа, сделайте аргумент тип
равным 3 (1 + 2). Если аргумент тип не
задан, то метод InputBox по умолчанию
возвращает текст. Для демонстрации
метода InputBox выполните следующие
действия.
-
Выполните процедуру ПримерВвода.
-
Введите букву в поле ввода и нажмите
<Enter>. Посмотрим, что получится. Так
как вы ввели текст, а не число, то
процедура отказывается работать (рис.
5.4), — произошла так называемая ошибка
выполнения. -
Щелкните на кнопке End (Конец), чтобы
закрыть окно сообщения и вернуться в
редактор Visual Basic. -
Создайте новую процедуру с названием
МетодВвод. Эта процедура будет
использовать метод InputBox. -
В новую процедуру введите следующий
код:
Dim
iResult As Integer
iResult
= Application.InputBox _
(«Введите
число:»,
, , , , , , 1)
MsgBox
iResult
ActiveCell.Value
= iResult
Запятые в выражении Application.InputBox
бронируют» места для тех аргументов,
которые мы опустили. Последний аргумент,
тип, имеет значение 1. Это показывает,
что допустимыми вводимыми значениями
являются только числа. Отметьте, что
единственное отличие кода этой процедуры
от кода процедуры ПримерВвода
заключается в операторе Application.InputBox.
-
Поместите курсор внутри кода процедуры
МетодВвод и нажмите <F5> для
выполнения процедуры. Появится окно
ввода. -
Введите букву А и нажмите <Enter>.
В отличие от процедуры ПримерВвода
теперь не будет сообщения об ошибке
выполнения, а появится окно с сообщением
о причине возникшей проблемы — Неверное
число (рис. 5.5). -
Для закрытия окна сообщения нажмите
клавишу <Enter>. -
Введите число 7 и нажмите <Enter>.
Отобразится окно сообщения с числом
7. Щелкните на кнопке ОК, чтобы
закрыть это окно.
Рис. 5.4. Это окно сообщения указывает
на ошибку выполнения процедуры. Нельзя
допустить, чтобы пользователи вашего
приложения получали такие окна сообщений!
Вы видели, что одним из преимуществ
метода InputBox является возможность
внутренней обработки ошибок. Другое
отличие метола от функции заключается
в значении, которое они возвращают,
когда пользователь щелкает на кнопке
Отмена. В этом случае функция InputBox
возвращает строку нулевой длины, а метод
InputBox — значение False (Ложь).
Рис. 5.5. Пользователю деликатно сообщают,
что введено неверное число.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #