[an error occurred while processing this directive]

В начало

Введение

1-й час. Знакомство с Visual Basic for Applications

2-й час. Работа с макросами

3-й час. Работа с элементами управления

4-й час. Переменные и константы

5-й час. Ввод данных

6-й час. Логика условных операторов

7-й час. Циклические вычисления

8-й час. Введение в объекты

9-й час. Основные объекты Excel

10-й час. Объект Range

11-й час. Редактор Visual Basic

12-й час. Отладка программ

13-й час. Обработка ошибок

14-й час. Экранные формы

15-й час. Автоматизация экранных форм

16-й час. Панели инструментов

17-й час. Работа с меню

18-й час. Диаграммы

19-й час. Сводные таблицы

20-й час. Получение внешних данных

21-й час. Доступ к данным с помощью ADO

22-й час. Еще об ADO

23-й час. Автоматизация

24-й час. Выполнение процедур

Приложение. Ответы

5-й час. Ввод данных

В предыдущих часах в примерах, иллюстрирующих различные темы, несколько раз использовались операторы MsgBox и InputBox. В этом часе мы подробно изучим эти операторы и методы их применения в кодах VBA. В 1-м часе "Знакомство с Visual Basic for Applications" обсуждались ограничения, присущие записанным макросам. Одно из таких ограничений - невозможность ввести какую-либо информацию во время выполнения макроса. В этом часе мы покажем, как организовать ввод информации при выполнении приложения.

В этом часе будут рассмотрены следующие вопросы.

  • Использование функции MsgBox.
  • Использование функции InputBox.
  • Применение метода InputBox.
  • Именование аргументов.
  • Использование объединения текстовых строк.

Функция MsgBox

Посмотрите на рис. 5.1, на котором показано, что произойдет, если вы попытаетесь закрыть рабочую книгу без ее сохранения.

Вы можете подумать, что создание такого окна сообщения требует многих часов программирования. Заблуждаетесь! Такое окно можно создать с помощью всего одной строчки кода VBA:

MsgBox "Сохранить изменения в ' “ & ThisWorkbook.Name & “ '? “, _

 vbYesNoCancel + vbExclamation

Отметим, что оператор MsgBox записан здесь в две строки, хотя в окне кода редактора Visual Basic он может располагаться в одну строку. В VBA символами продолжения строки служит пробел с последующим символом подчеркивания.

Рис. 5.1. Одно из многих окон сообщений, генерируемых Excel

В этом коде свойство ThisWorkbook.Name возвращает имя текущей рабочей книги.

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

MsgBox (приглашение [, кнопки] [, заголовок] [, файл_справки, содержание])

Приглашение (prompt) - единственный обязательный аргумент этой функции. Значением этого аргумента служит строка текста, которая появляется как сообщение в диалоговом окне. Эта строка текста должна быть заключена в двойные кавычки. Отметим использование круглых скобок в синтаксисе MsgBox - они указывают на то, что в данном случае MsgBox является функцией, возвращающей какое-либо значение. Если скобки опушены, то для VBA это признак того, что данное выражение значение не возвращает. Если вы хотите возвратить значение, надо использовать код, подобный следующему:

Dim iResponse As Integer

iResponse = MsgBox (“Сохранить изменения в ‘ ” &_

 ThisWorkbook.Name & “ ‘?”, vbYesNoCancel + vbExclamation)

Если не указан аргумент кнопки, то VBA предполагает, что в диалоговом окне сообщения присутствует только кнопка ОК. Аргумент кнопки - очень "богатый" по своим возможностям аргумент, который позволяет управлять следующими параметрами окна сообщения.

  • Количество кнопок в окне.
  • Типы кнопок и их размещение в окне.
  • Пиктограмма, отображаемая в окне.
  • Какая кнопка назначается кнопкой по умолчанию.
  • Режим (модальность) окна сообщения.

В табл. 5.1 показаны возможные установки для этого аргумента. В этой таблицы значения аргумента разбиты на группы. Первая группа значений устанавливает число и тип кнопок. Вторая позволяет выбрать стиль пиктограммы, отображаемой в диалоговом окне сообщения. Третья назначает кнопку по умолчанию. Четвертая группа устанавливает режим окна сообщения. Для создания конечного значения аргумента кнопки можно использовать только одно значение из каждой группы, объединив их знаком "плюс".

Таблица 5.1. Установки для аргумента кнопки функции MsgBox

Группа Константа Значение Описание
Группа 1 vbOKOnly 0 Отображает только кнопку ОК (установка по умолчанию)
vbOKCancel 1 Отображает кнопки ОК и Отмена1
vbAbortRetryIgnore 2 Отображает кнопки Стоп, Повтор и Пропустить
voYesNoCancel 3 Отображает кнопки Да, Нет и Отмена
vbYesNo 4 Отображает кнопки Да и Heт
vbRetryCancel 5 Отображает кнопки Повтор и Отмена
Группа 2 vbCritical 16 Отображает запрещающую пиктограмму (белый знак × в красном круге)
vbQuestion 32 Отображает предупреждающую пиктограмму (знак вопроса на белом фоне)
vbExclamation 48 Отображает предупреждающую пиктограмму (знак вопроса в красном треугольнике)
vbInformation 64 Отображает информационную пиктограмму (знак "i" на белом фоне)
Группа 3 vbDefaultButton1 0 Первая кнопка - кнопка по умолчанию
vbDefaultButton2 256 Вторая кнопка - кнопка по умолчанию
vbDefaultButton3 512 Третья кнопка - кнопка по умолчанию
vbDefaultButton4 768 Четвертая кнопка - кнопка по умолчанию
Группа 4 vbApplicationModal 0 Режим приложения: пользователь должен закрыть окно сообщения перед продолжением работы в текущем приложении
vbSystemModal 4096 Системный режим: все приложения недоступны, пока пользователь не закроет окно сообщения
Дополнительная группа vbMsgBoxHelpButton 16384 Отображает кнопку Справка
vbMsgBoxSetForeground 65536 Делает окно сообщения окном переднего плана
vbMsgBoxRight 524288 Отображает окно сообщения, выровненным по правому краю окна приложения
vbMsgBoxRtlReading 1048576 Для иврита и арабского языка указывает, что текст должен выводиться справа налево

Чтобы не ошибиться при вводе значений аргумента кнопки, используйте список констант, который появляется после ввода знака "+". Знак "+" используется для объединения нескольких констант при задании сложного аргумента кнопки. - Прим. ред.

Чтобы просмотреть список всех внутренних констант Visual Basic, откройте с помощью клавиши <F2> окно просмотра объектов Object Browser и выберите класс Constants (Константы). В этом же окне можно найти все внутренние константы Excel.

Аргумент заголовок позволяет задать текст, помещаемый в строке заголовка диалогового окна сообщения. Если этот аргумент опущен, то в строке заголовка отображается Microsoft Excel.

Аргументы файл_справки и содержание используются тогда, своего приложения для своего приложения собственную справочную систему.

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

Таблица 5.2. Значения, возвращаемые функцией

Константа Значение Нажатая кнопка
vbOK 1 ОК
vbCancel 2 Отмена
vbAbort 3 Стоп
vbRetry 4 Повтор
vbIgnore 5 Пропустить
vbYes 6 Да
vbNo 7 Нет

Глядя на эту таблицу, вы можете задать вопрос: "Какой тип данных надо назначить переменной, которая будет принимать возвращаемое функцией MsgBox значение?". Наилучший тип переменной, принимающей значение функции MsgBоx, - Integer. В следующем примере мы создадим окно сообщения с несколькими кнопками, а затем покажем возвращаемое значение в другом окне сообщения.

  1. Откройте редактор Visual Basic.
  2. Щелкните правой кнопкой мыши на элементе ЭтаКнига в окне проектов Project Explorer.
  3. В контекстном меню выберите команду Inserts Module (Вставка Модуль).
  4. Выполните команду Insert Procedure (Вставка Процедура).
  5. Введите название процедуры ПримерОСообщения и нажмите клавишу <Enter>.
  6. Введите следующий код процедуры:

Dim iResult As Integer

iResult = MsgBox(“Щелкните на кнопке”, vbYеsNoCancel)

MsgBox iResult

  1. Нажмите клавишу <F5> для выполнения процедуры. Отобразится окно сообщения, как на рис. 5.2.

Рис. 5.2. В соответствии с заданными аргументами окно сообщения содержит три кнопки

  1. Щелкните на кнопке Да. Следующее диалоговое окно должно вывести цифру 6. Посмотрите в табл. 5.2, чтобы удостовериться, что число 6 - результат щелчка на кнопке Да. Щелкните на кнопке ОК, второе окно сообщения закроется, и вы вернетесь в редактор Visual Basic.
  2. Снова нажмите клавишу <F5> для выполнения процедуры. Теперь в окне сообщения щелкните на кнопке Нет. Во втором окне сообщения отобразится цифра 7. Для возврата в редактор Visual Basic щелкните на кнопке ОК.
  3. Нажмите клавишу <F5> еще раз. В окне сообщения щелкните на кнопке Отмена. Во втором окне сообщения отобразится цифра 2. Щелкните на кнопке ОК.

Теперь вы знаете, как показать значение, возвращаемое окном сообщения. В 6-м часе "Логика условных операторов" вы узнаете, как можно использовать это значение.

Функция InputBox

Функция MsgBox хороша, когда от пользователя надо получить простые данные - ответы типа Да-Нет или ОК-Отмена. Если необходимо ввести число или текст, то применяется функция InputBox. Эта функция отображает диалоговое окно ввода, содержащее поле ввода и поясняющий текст. Функция InputBox имеет следующий синтаксис:

InputBox приглашение[, заголовок] [, по_умолчанию] [, хпоз] [, yпоз] [, файл_справки, содержание])

Эта функция требует обязательного задания только аргумента приглашение. Так же, как и в функции MsgBox, значением аргумента приглашение служит текстовая строка, которая отображается в диалоговом окне ввода в качестве сообщения.

Аргумент заголовок используется для задания текста, который помещается в строке заголовка окна ввода. Если этот аргумент не задан, то в строке заголовка отображается Microsoft Excel.

Аргумент по_умолчанию задает значение, которое отображается по умолчанию в поле ввода, пока пользователь не введет свое значение. Если этот аргумент опустить, то поле ввода отображается пустым.

Необязательные аргументы xпоз и yпоз задают положение окна ввода на экране. Аргументы файл_справки и содержание используются в том случае, если вы создаете для своего приложения собственную систему справки.

Возвращаемым значением функции InputBox является значение, введенное пользователем в поле ввода. Для иллюстрации использования этой функции выполните следующий пример.

  1. Вставьте новую подпрограмму в текущий модуль и назовите ее ПримерВвода.
  2. Введите следующий код:

Dim iResult As Integer

iResult = InputBox(“Введите число:”)

MsgBox iResult

ActiveCell.Value = iResult

Этот код открывает окно ввода для ввода числа, которое затем будет отображено в окне сообщения и помещено в текущую ячейку рабочего листа.

  1. Нажмите клавишу <F5> для выполнения процедуры. Отобразится окно ввода (рис. 5.3).
  2. Введите число и нажмите клавишу <Enter>. Открывшееся окно сообщения покажет введенное вами число.
  3. Щелкните на кнопке ОК. Окно сообщения закроется.
  4. Перейдите в рабочую книгу. В активной ячейке рабочего листа вы увидите введенное число.

Если вы заглянете в справочную систему 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 выполните следующие действия.

  1. Выполните процедуру ПримерВвода.
  2. Введите букву в поле ввода и нажмите <Enter>. Посмотрим, что получится. Так как вы ввели текст, а не число, то процедура отказывается работать (рис. 5.4), - произошла так называемая ошибка выполнения.
  3. Щелкните на кнопке End (Конец), чтобы закрыть окно сообщения и вернуться в редактор Visual Basic.
  4. Создайте новую процедуру с названием МетодВвод. Эта процедура будет использовать метод InputBox.
  5. В новую процедуру введите следующий код:

Dim iResult As Integer

iResult = Application.InputBox _

 ("Введите число:", , , , , , , 1)

MsgBox iResult

ActiveCell.Value = iResult

Запятые в выражении Application.InputBox бронируют" места для тех аргументов, которые мы опустили. Последний аргумент, тип, имеет значение 1. Это показывает, что допустимыми вводимыми значениями являются только числа. Отметьте, что единственное отличие кода этой процедуры от кода процедуры ПримерВвода заключается в операторе Application.InputBox.

  1. Поместите курсор внутри кода процедуры МетодВвод и нажмите <F5> для выполнения процедуры. Появится окно ввода.
  2. Введите букву А и нажмите <Enter>. В отличие от процедуры ПримерВвода теперь не будет сообщения об ошибке выполнения, а появится окно с сообщением о причине возникшей проблемы - Неверное число (рис. 5.5).
  3. Для закрытия окна сообщения нажмите клавишу <Enter>.
  4. Введите число 7 и нажмите <Enter>. Отобразится окно сообщения с числом 7. Щелкните на кнопке ОК, чтобы закрыть это окно.

Рис. 5.4. Это окно сообщения указывает на ошибку выполнения процедуры. Нельзя допустить, чтобы пользователи вашего приложения получали такие окна сообщений!

Вы видели, что одним из преимуществ метода InputBox является возможность внутренней обработки ошибок. Другое отличие метола от функции заключается в значении, которое они возвращают, когда пользователь щелкает на кнопке Отмена. В этом случае функция InputBox возвращает строку нулевой длины, а метод InputBox - значение False (Ложь).

Рис. 5.5. Пользователю деликатно сообщают, что введено неверное число.

Именование аргументов

В предыдущем примере мы применили оператор

iResult = Application.InputBox (“Введите число:” , , , , , , , 1)

Если в этом операторе вы пропустите хоть одну запятую, то, вероятно, получите сообщение об ошибке при его выполнении. Идентификация аргументов путем их местоположения в списке аргументов - большой недостаток подобных операторов. Для исправления этого недостатка VBA поддерживает именование аргументов. Использование имен аргументов позволяет задавать их в любом порядке. Например, в нашем случае оператор с заданным аргументом mun (type) можно записать так:

iResult = Application.InputBox (“Введите число:”, Type:=1)

Для использования именованных аргументов введите имя аргумента, двоеточие, знак равенства и значение аргумента. Синтаксис оператора (и, следовательно, имена аргументов) показаны в экранной подсказке, которая появляется после ввода оператора. Можно также обратиться к справочной системе VBA.

Если экранная подсказка не отображается, выполните команду Tools > Options (Сервис > Параметры) и в открывшемся диалоговом окне Options (Параметры) на вкладке Editor (Редактор) установите флажок опции Auto Quick Info (Автоматическая экранная подсказка)/

Объединение текстовых строк

Если надо объединить несколько текстовых строк в одну, используется символ конкатенации (&) (в листинге 5.1 показано использование этого символа).

Листинг 5.1. Объединение строк

1: Sub ОбъединениеСтрок()

2:  Dim sName As String

3:  Dim sLongText As String

4:

5:  sName = InputBox (“Введите ваше имя: ”)

6:

7:  ‘Следующая строка для окна сообщения объединяет

8:  ‘слово “Привет” со значением переменной sName

9:  MsgBox “Привет” @ sName

10:

11:  sLongText = “Это пример объединения нескольких”

12:  sLongText = sLongText @ “строк в одну большую”

13:  sLongText = sLongText @ “строку.” @ vbNewLine

14:  sLongText = sLongText @ “vbNewLine - константа, позволяющая”

15:  sLongText = sLongText @ “начинать новую строку”

16:  MsgBox sLongText

17: End Sub

На рис. 5.6 показано второе окно сообщения, заданное в строке 16 листинга. С помощью символа конкатенации можно составлять строки, содержащие текст, значения переменных, числа и т.д.

Рис. 5.6. Объединение строк - полезное для создания текста сообщений

Резюме

В этом часе мы изучили несколько способов ввода информации пользователем: с помощью диалоговых окон сообщений и диалоговых окон ввода.

В следующем часе мы рассмотрим средства, позволяющие проверять данные, введенные пользователем, а также строить процедуры, выполняющие различные действия в зависимости от введенной пользователем информации.

Вопросы и ответы

Вопрос. Что лучше использовать: функцию InputBox или метод InputBox?

Ответ. Лучшим выбором будет метод InputBox, так как функция InputBox не обладает встроенными средствами обработки ошибок.

Вопрос. Что делать со значением, возвращаемым функцией или методом InputBox?

Ответ. Возвращаемое значение вы можете использовать в окнах сообщений, поместить в ячейку рабочего листа, применить в вычислениях, использовать в качестве имени какого-либо объекта и т.п.

Вопрос. Где можно применить окна сообщений?

Ответ. Окна сообщений можно использовать как элементы интерфейса, позволяющиеся пользователю обмениваться информацией с приложением.

Практикум

С помощью тестов и упражнений вы проверите, насколько хорошо усвоили изложенный материал. Ответы на вопросы смотрите в Приложении.

Тесты

  1. Как можно объединить несколько строк?
  2. Какой тип данных возвращаемого значения окна сообщения?
  3. Какой тип данных возвращаемого значения метода InputBox?
  4. Какие установки можно задать для окна сообщений с помощью аргумента
  5. Истинно или ложно следующее утверждение: в VBA аргументы операторов и функций идентифицируются только своим местоположением в списке

Упражнение

Создайте процедуру с именем ВашИнфо. Эта процедура должна выполнять следующие задачи.

  1. Отобразить три окна ввода. Первое окно предназначено для ввода имени пользователя. Во втором окне надо ввести название города, где живет пользователь, а в третьем - возраст пользователя.
  2. Отобразить введенную в трех окнах ввода информацию в одном окне сообщения.

1 На протяжении всей книги предполагается, что пользователь работает с русской версией Excel 2000, поэтому, несмотря на англоязычность VBA, кнопки в создаваемых окнах автоматически будут иметь названия на русском языке. - Прим. ред.

[an error occurred while processing this directive]