[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-й час. Выполнение процедур

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

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

В предыдущем часе мы изучили средства, с помощью которых пользователь может вводить данные в приложение и присваивать их переменным. Что с этими данными делать дальше? Можно организовать различные потоки1 выполнения приложения в зависимости от введенной пользователем информации. Такое ветвление выполнения приложения осуществляется с помощью условных (логических) операторов, на которых мы сфокусируем свое внимание в этом часе.

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

  • Управление потоками выполнения приложения.
  • Использование оператора If.
  • Применение оператора Select Case.
  • Вывод на экран встроенных диалоговых окон Excel.

Управление выполнением приложения

Предположим, ваше приложение вывело на экран окно сообщения с двумя кнопками Да и Нет. Допустим даже, вы знаете, что должно делать приложение, если пользователь щелкнет на кнопке Да, и что - когда щелкнет на кнопке Нет. Другими словами, вы понимаете, что при разном выборе пользователя должны выполняться различные последовательности операторов. Чтобы организовать такое ветвление выполнение программы, используются условные операторы. Условные операторы проверяют некоторое логическое условие (которое может принимать значение ИСТИНА или ЛОЖЬ) и в зависимости от результатов проверки выполняют те или иные операторы.

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

Для создания логических условий часто используются операторы сравнения. Эти операторы сравнивают, например, значение содержимого некоторой ячейки с заданным значением или значением, возвращаемым какой-либо функции. Выражение, в котором используются операторы сравнения, в зависимости от результата сравнения принимают значения ИСТИНА или ЛОЖЬ. С операторами сравнения вы встречались при работе с некоторыми функциями Excel, такими как функция Если. В табл. 6.1 приведены возможные операторы сравнения.

Таблица 6.1. Оператор сравнения

Оператор сравнения Что обозначает
= Равно
<> Не равно
> Больше чем
>= Больше или равно
< Меньше чем
<= Меньше или равно

Иногда требуется найти значение выражения, содержащего несколько логических условий. В этом случае применяются логические операторы, соединяющие отдельные условия. В табл. 6.2 описаны логические операторы, которые поддерживает VBA. Примеры использования логических операторов приведены далее в этом часе.

Таблица 6.2. Логические операторы

Логический оператор Описание
And (И) Если оба условия, соединенные этим оператором, имеют значение ИСТИНА, то результат - ИСТИНА, в противном случае - ЛОЖЬ
Or (Или) Если хотя бы одно из условий, соединенных этим оператором, имеет значение ИСТИНА, то результат - ИСТИНА, в противном случае - ЛОЖЬ
Not (Нет) Если логическое выражение имеет значение ЛОЖЬ, то результат применения к нему этого оператора - ИСТИНА. Если логическое выражение имеет значение ИСТИНА, ТО результат применения оператора - ЛОЖЬ
Xor (исключающее Или) Если одно и только одно из условий, соединенных этим оператором, имеет значение ИСТИНА, то результат - ИСТИНА. Если оба условия имеют значения ИСТИНА или ЛОЖЬ, то результат - ЛОЖЬ.

Оператор If

Первым условным оператором, который мы рассмотрим, будет оператор If... Then… Else (Если... Тогда... Иначе). Этот оператор имеет следующий синтаксис:

If условие_1 Then

[операторы_1]

[ElseIf условие_2 Then

[операторы_2]

[Else

[операторы]]

End If

В этом синтаксисе условие_1 - необходимая часть оператора. Это то основное условие, которое должно проверяться. Если значение этого условия ИСТИНА, выполняются операторы, записанные после слова Then.

Если вы хотите проверить второе условие в этом же операторе, добавьте еще одно выражение - ElseIf с последующим условием. VBA первым проверяет условие, записанное после слова If. Если это условие ложно, то проверяется второе условие, приведенное после слова ElseIf. Если это условие истинно, то выполняются операторы_2. В противном случае выполняются операторы, записанные после слова Else. Рассмотрим пример использования оператора If.

  1. Откройте новую рабочую книгу.
  2. Создайте таблицу, показанную на рис. 6.1.

Рис. 6.1. Рабочий лист, который послужит основой приложения

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

Dim iResponse As Integer

iResponse = MsgВох (“Необходима для этого груза отправка?”, vbYesNo)

If iResponse = vbYes Then

 Range("B4").Value = 10

Else

 Range("B4").Value = 0

End If

  1. Перейдите в рабочую книгу.
  2. Вставьте командную кнопку в рабочий лист. Откроется диалоговое окно Назначить макрос объекту.
  3. В списке Имя макроса выберите пункт Отправка и щелкните на кнопке ОК. Сейчас вы назначили командной кнопке процедуру.
  4. Выделите текст на командной кнопке и нажмите клавишу <Delete> для его удаления. Введите текст Общая сумма - это новое название кнопки.
  5. Щелкните вне командной кнопки для снятия с нее выделения. В результате получим рабочий лист, подобный показанному на рис. 6.2.
  6. Введите число 120 в ячейку В3.
  7. Щелкните на кнопке Общая сумма. Отобразится окно сообщения (рис. 6.3).
  8. Щелкните на кнопке Да. В ячейке В4 появится число 10.
  9. Снова щелкните на кнопке Общая сумма.
  10. Теперь в окне сообщения щелкните на кнопке Нет. В ячейке В4 отобразится ноль.

Рис. 6.2. Законченный рабочий лист

Рис. 6.3. Щелкните на одной из кнопок в окне сообщения

Этот простой пример демонстрирует использование условного оператора. Прежде чем закончить с этим примером, задержите свое внимание на коде созданной процедуры (листинг 6.1).

Листинг 6.1. Процедура Отправка

1:Public Sub Shipping ()

2: Dim iResponse As Integer

3:

4: iResponse = MsgBox (“Необходима для этого груза отправка?”, vbYesNo)

5:

6: If IResponse = vbYes Then

7:  Range (“B4”).Value = 10

8: Else

9:  Range (“B4”).Value = 0

10: End If

11:

12:End Sub

Во второй строке процедуры объявляется переменная iResponse

Dim iResponse As Integer

Эта переменная используется для хранения значения, возвращаемого из окна сообщения:

iResponse = MsgBox(“Необходима для этого груза отправка?”, vbYesNo)

Возвращаемое окном сообщения значение генерируется кнопками Да и Нет. Значение переменной iResponse проверяется оператором If:

If iResponse = vbYes Then

 Range("B4").Value = 10

Else

 Range<"B4").Value = 0

End If

Если значение переменной iResponse равно vbYes, т.е. пользователь щелкнул на кнопке Да, то в ячейку В4 вводится число 10. В противном случае в ячейку В4 вводится ноль.

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

Когда один оператор находится внутри другого оператора, такая структура называется вложением операторов.

  1. Перейдите на новый рабочий лист в открытой рабочей книге.
  2. Создайте таблицу, как на рис. 6.4.
  3. Перейдите в редактор Visual Basic.
  4. Вставьте новую процедуру с именем Комиссионные.

Рис. 6.4. Рабочий лист, используемый для начисления комиссионных.

  1. Введите следующий код процедуры:

Dim sngCommission As Single

 If Range (“B2”) = “Нет” Then

  sngCommission = 0.02

  If Range(“В3”).Value >= 5 And Range(“B3”) <10 Then

   sngCommission = sngCommission + 0.01

  ElseIf Range(“B3”).Value >= 10 Then

   sngCommission = sngCommission + 0.02

  End If

  If Range (“B1”).Value = “Фурнитура” Then

   sngCommission = sngCommission + 0.01

  End If

 Else

  sngCommission = 0.01

 End If

 Range(“B5”).Value = sngCommission

  1. Перейдите на рабочий лист и вставьте командную кнопку. Назначьте процедуру Комиссионные.
  2. Замените текст на кнопке - назовите ее Вычисление комиссионных.
  3. Для снятия выделения с кнопки щелкните где-нибудь вне ее.
  4. Введите Фурнитура в ячейку В1. Удостоверьтесь, что текст введен правильно.
  5. Введите Нет в ячейку В2. Проверьте, чтобы текст был введен именно так, как здесь показано.
  6. Введите число 10 в ячейку В3.
  7. Щелкните на командной кнопке. В ячейке В5 должно появиться число 0,05, так как товар не в продаже, продавец работает в отделе фурнитуры и стаж его работы 10 лет - все условия максимальных комиссионных выполнены.

Полный код процедуры Комиссионные представлен в листинге 6.2.

Листинг 6.2. Процедура Комиссионные

1:Public Sub Комиссионные()

2: Dim sngCommission As Single

3:

4: If Range (“B2”) = “Нет” Then

5:  sngCommission = 0.02

6:

7:  If Range (“B3”).Value >= 5 And Range (“B3”) < 10 Then

8:   sngCommission = sngCommission + 0.01

9:  ElseIf Range (“B3”).Value >= 10 Then

10:   sngCommission = sngCommission + 0.02

11:  End If

12:

13:  If Range (“B1”).Value = “Фурнитура” Then

14:   sngCommission = sngCommission + 0.01

15:  End If

16:

17: Else

18:  sngCommission = 0.01

19: End If

20:

21: If Range (“B5”).Value = sngCommission

22:

23:End Sub

Как обычно, процедура начинается с объявления переменной, в данном случае - переменной sngCommission. Эта переменная используется для вычисления комиссионных. Первое условие - проверка, находится или нет товар в продаже:

If Range (“B2”) = “Нет” Then

 sngCommission = 0.02

Ячейка В2 содержит значение Да, если товар находится в продаже (комиссионные составляют 1%), и значение Нет - в противном случае (комиссионные составляют 2%):

Else

 sngCommission = 0.01

End If

Если товар не находится в продаже, то проверяются следующие условия:

If Range (“B3”).Value >= 5 And Range(“B3”) < 10 Then

 sngCommission = sngCommission + 0.01

ElseIf Range(“B3”) .Value >= 10 Then

 sngCommission = sngCommission + 0.02

End If

If Range (“B1”).Value = “Фурнитура” Then

 sngCommission = sngCommission + 0.01

End If

Здесь первый оператор If проверяет стаж работника. Второй оператор If определяет отдел, реализующий товар. Эти операторы вложены в первый оператор If процедуры.

В приведенных выше инструкциях по созданию процедуры специально указывалось, чтобы вы проверили, как введено слово Нет в ячейку В2. Чтобы понять, для чего это сделано, выполните следующие действия.

  1. Вернитесь на рабочий лист с вычислениями комиссионных. Отметьте, что сейчас величина комиссионных составляет 0.05.
  2. Введите нет (все буквы строчные) в ячейку В2.
  3. Щелкните на кнопке Вычисление комиссионных. Какой размер комиссионных получили? 0,01. Почему?
  4. Вернитесь в редактор Visual Basic и просмотрите код процедуры. Обратите внимание на выражение If Range (“B2”) = “Нет” в первом операторе If. Это выражение "чувствительно" к тому, в каком регистре введен текст в ячейке В2. Чтобы избавиться от этого недостатка, приведите код процедуры к следующему виду:

Public Sub Комиссионные()

 Dim sngCommission As Single

 If UCase(Range(“B2”)) = “НЕТ” Then

  sngCommission = 0.02

  If Range(“B3”).Value >= 5 And Range (“B3”) < 10

   sngCommission = sngCommission + 0.01

  ElseIf Range(“B3”).Value >= 10 Then

   sngCommission = sngCommission + 0.02

  End If

  If UCase(Range(“B1”).Value) = "ФУРНИТУРА" Then

   sngCommission = sngCommission + 0.01

  End If

 Else

  sngCommission = 0.01

 End If

 If Range("B5").Value - sngCommission

End Sub

  1. Вернитесь на рабочий лист и щелкните на кнопке Вычисление комиссионных. Процедура должна дать правильный результат.

Функция VBA UCase преобразует все символы текстового аргумента в верхний регистр. Благодаря этой функции операторы If перестали быть чувствительны к регистру вводимых данных. (В русской версии Excel (но не в VBA!) эта функция называется ПРОПИСН. - Прим. ред.)

Оператор Select Case

Посмотрите на код листинга 6.3: оператор If переводит баллы, полученные студентами при выполнении тестов, в пятибалльную систему оценок.

Листинг 6.3. Применение оператора If для случая многих исходов

1: If Range(“A3”) >= 90 Then

2:  MsgBox “Вы получили за тесты оценку 5”

3: ElseIf Range(“A3”) < 90 And Range (“A3”) >= 80 Then

4:  MsgBox “Вы получили за тесты оценку 4”

5: ElseIf Range(“A3”) < 80 And Range (“A3”) >= 70 Then

6:  MsgBox “Вы получили за тесты оценку 3”

7: ElseIf Range(“A3”) < 70 And Range (“A3”) >= 60 Then

8:  MsgBox “Вы получили за тесты оценку 2”

9: Else

10:  MsgBox “Вы не прошли тесты”

11: End If

Этот оператор содержит множество выражений ElseIf и труден для восприятия. В подобных случаях альтернативой оператору If может быть оператор Select Case, который легче для восприятия и лучше приспособлен для работы в ситуациях со многими исходами. Листинг 6.4 содержит код с оператором Select Case, выполняющий ту же задачу, что и код листинга 6.3.

Листинг 6.4. Пример оператора Select Case

1: Select Case Range(“A3”)

2:  Case Is >= 90

3:   MsgBox “Вы получили 5!”

4:  Case 80 To 89

5:   MsgBox “Вы получили 4”

6:  Case 70 To 79

7:   MsgBox “Вы получили 3”

8:  Case 60 To 69

9:   MsgBox “Вы получили 2”

10:  Case Else

11:   MsgBox “Вы не прошли тесты”

12: End Select

Вы видите, что этот код более понятен и прост для восприятия. Синтаксис оператора Select Case следующий:

Select Case тестовое_выражение

[Case список_выражений-n

[операторы-n]]...

[Саse Else

[операторы]]

End Select

Листинг 6.5 показывает другой пример использования оператора Select Case. Обратите внимание, что когда отдельные значения разделены запятыми, то это эквивалентно применению логического оператора Or (Или). Например, выражение Case “Техас”, “Флорида” интерпретируется оператором Select Case как Техас или Флорида.

Листинг 6.5. Еще пример оператора Select Case

1: 'Оператор Select Case определяет стоимость отправки грузов

2: 'в зависимости от регионов

3: Select Case State

4: Case “Нью-Йорк”

5:  cShipping = 5.00

6: Case “Джорджия”, “Южная Каролина”, “Огайо”

7:  cShipping = 4.00

8: Case “Флорида”, “Техас”

9:  cShipping = 3.00

10: Case “Алабама”, “Вашингтон”, “Калифорния”, “Иллинойс”

11:  cShipping = 2.00

12: Case Else

13:  cShipping = 1.00

14: End Select

Для применения в операторе Select Case операторов сравнения необходимо использовать ключевые слова Is и То. Ключевое слово Is используется тогда, когда необходимо сравнить тестовое_выражение со значениями список_выражений. Ключевое слово служит для задания интервала значений, как это сделано в листинге 6.4.

Использование встроенных диалоговых окон Excel

Теперь, когда вы знаете, как управлять потоками выполнения приложений, можно организовать любую реакцию приложения в ответ на выбор, сделанный пользователем в окне сообщения. Например, если в окне сообщения спрашивается, хочет ли пользователь сохранить свою рабочую книгу, то вы должны организовать вывод на экран диалогового окна Сохранение документа. Excel имеет примерно 200 встроенных диалоговых окон. С помощью VBA можно получить доступ ко всем встроенным диалоговым окнам. Синтаксис оператора для открытия встроенных диалоговых окон следующий:

Application.Dialogs (xlDialogКонстанта).Show

Чтобы задать значение аргумента xlDialogКонстанта, откройте окно просмотра объектов Object Browser и в библиотеке Excel выберите класс XLBuiltInDialog. Вы увидите список всех доступных значений аргумента xlDLslogКонстанта и без труда поймете, что Константа - это просто название диалогового окна. (Естественно, название диалогового окна надо вводить на английском языке и так, как оно показано в окне Object Browser, но это не мешает VBA отображать сами окна в русифицированном виде. - Прим. ред.) Следующие действия приведут к открытию вашим приложением встроенного диалогового окна.

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

Dim iResponse As Integer

iResponse = MsgBox(“Сохранить рабочую книгу?”, vbYesNo)

If iResponse = vbYes Then

 Application.Dialogs(xlDialogSaveAs).Show

End If

  1. Перейдите на рабочий лист, где вы вычисляли комиссионные.
  2. Вставьте новую командную кнопку и назначьте ей процедуру СохранениеКниги.
  3. Дайте этой кнопке название Сохранить книгу.
  4. Щелкните вне кнопки, чтобы снять с нее выделение.
  5. Щелкните на кнопке Сохранить книгу. Откроется окно сообщения, спрашивающее, хотите ли вы сохранить рабочую книгу.
  6. Щелкните на кнопке Да, и на экране появится диалоговое окно Сохранение документа (рис. 6.5).
  7. Щелкните на кнопке Отмена.

Рис. 6.5. Для вас доступны все диалоговые окна Excel!

Резюме

В этом часе вы изучили два способа управления потоками выполнения программ: С помощью оператора If и оператора Select Case. Вы также узнали, как получить доступ к встроенным диалоговым окнам Excel. Это сохранит ваше время как разработчика приложения (в вашем распоряжении более 200 диалоговых окон!), а пользователю вашего приложения даст для работы хорошо знакомый ему интерфейс.

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

Вопрос. Если необходимо организовать различное выполнение программы в зависимости от многочисленных условий, то какой оператор лучше использовать If или Select Case?

Ответ. Если эти условия однородные, то рациональнее применить оператор Select Case.

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

Ответ. Нет, в своем приложении вы можете использовать все встроенные диалоговые окна Excel.

Практикум

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

Тесты

  1. Какие два основных оператора используются для управления потоком выполнения приложений?
  2. Истинно или ложно следующее утверждение: операторы If и Select Case чувствительны к регистру используемых значений?
  3. Какой метод позволяет отображать встроенные диалоговые окна Excel?
  4. Как преобразовать текстовую строку, чтобы все символы были прописными?

Упражнение

Создайте процедуру с именем ТестЩелчок. Эта процедура должна выводить на экран окно сообщения с текстом "Вы хотите продолжать?" и кнопками ОК и Отмена. Примените оператор If, чтобы узнать, на какой кнопке щелкнул пользователь, и выведите окно сообщения, показывающее выбор пользователя.

Создайте еще одну процедуру под названием Скидка. Процедура должна вывести на экран окно ввода, предлагающее ввести категорию скидки: 1, 2. 3 или 4. С помощью оператора Select Case организуйте вывод величины скидки в окне сообщения. Категории 1 соответствует скидка 5%, категории 2 - 10%, категории 3 - 15% и категории 4 - 20%.


1 Примечание для программистов и "блюстителей чистоты терминологии": применяемое автором выражение the flow of an application мы переводим как поток выполнения приложения и используем его как синоним выполнения одной из ветвей программы и не претендуем на стандартный термин поток (stream), применяемый в объектно-ориентированных языках программирования (таких как C++). - Прим. ред.

[an error occurred while processing this directive]