- •8. Объявление переменных. Объявление переменных в модулях и процедурах. Область действия переменных и процедур. Пример передачи в процедуру аргументов.
- •11.Основные свойства и методы объектов Application, Workbook, Worksheet.
- •15. Работа с массивами. Оператор Option Base. Динамическая модель индексации и оператор ReDim. Примеры использования этих операторов. Функция управления массивами Array. Пример использования.
- •20. Структура принятия решения If-Then-Else
- •21. Дополнительное условие ElseIf
- •22. Управляющая структура For-Next
- •23. Управляющая структура While-Wend
- •24. Управляющая структура Do-Loop
- •25. Управляющая структура Select Case
- •26. Управляющая структура For-Each-Next
20. Структура принятия решения If-Then-Else
Условный оператор If-Then-Else изменяет порядок выполнения про-граммы в зависимости от результатов проверки некоторого условия.
Sub LookUpPrice()
Dim ProdCode() As String, UnitPrice() As Currency, ReguestedPrice As Currency, Nproducts As Integer, i As Integer, Found As Boolean, ReguestedCode As String
With ActiveWorkbook.Worksheets("Коды товаров”).Range("A3")
Nproducts = Range(.Offset(1, 0), .End(xlDown)).Rows.Count
ReDim ProdCode(Nproducts)
ReDim UnitPrice(Nproducts)
For i = 1 To Nproducts
ProdCode(i) = .Offset(i, 0)
UnitPrice(i) = .Offset(i, 1)
Next i
End With
ReguestedCode = InputBox("Введите код товара (большая латинская буква и 4 цифры)")
Found = False
For i = 1 To Nproducts
If ProdCode(i) = ReguestedCode Then
Found = True
ReguestedPrice = UnitPrice(i)
Exit For
End If
Next i
If Found Then
MsgBox "Товар с кодом" & ReguestedCode & " стоит " & Format(ReguestedPrice, "0,00р."), vbInformation, "Товар не найден"
Else
MsgBox "Товара с кодом " & ReguestedCode & " нет в списке ", vbInformation, "Товар не найден”
End If
End Sub
21. Дополнительное условие ElseIf
Средствами структуры принятия решенья If-Then-Else можно орга-низовать выполнение операторов в зависимости от соблюдения опреде-ленного условия. Рассмотрим другой вариант ее использования, на этот раз с ключевым словом ElseIf. Программа Proc31 отображает запрос на ввод пароля. Если пароль введен правильно, программа предоставляет пользо-вателю определенные возможности работы с рабочей книгой и сообщает ему об этом.
Sub Proc31_IfThenElseIf ( )
Dim Password As String, ws As WorkSheet
Password = GetPassword
If Password = “level1” Then
For Each ws In ActiveWorkbook.WorkSheets
ws.Visible = True
ws. Unprotect Next
MsgBox “Вы получили доступ ко всем листам книги.”
ElseIf Password = “level2” Then
ActiveWorkbook.Worksneets (1). Visible = True
ActiveWorkbook.Worksneets (1). Unprotect
MsgBox “Вы получили доступ только к первому листу р книги.”
ElseIf Password = “level3” Then
ActiveWorkbook.Worksneets (1). Visible = True
MsgBox “Вы получили доступ только для чтения содержимого первого листа рабочей книги.” Else
MsgBox “Пароль не корректен. Повторите ввод пароля.”
End If
End Sub
Function GetPassword ( )
GetPassword = Lcase (InputBox(“Enter Password:”.” Password”))
End Function
В Proc31 ключевое слово Elself с последующим условием использу-ется дважды. Новое условие вносит в порядок выполнения команд допол-нительные изменения, если проверка первого условия закончилась неуда-чей. В Proc31 первое условие указано сразу за ключевым словом If. В нем проверяется равенство переменной Password строке ”levell”. Если пере-менная не равна строке, VBA переходит к первому ключевому слову Elself, где проверяет следующее условие – равенство переменной Password строке “level2”. Начиная с этого момента, программа использует только новое ус-ловие, “забывая” о старом. Если равенства опять нет, управление перехо-дит к следующему ключевому слову Elself и т. д.
В строке 3 процедуры Proc31 вызывается функция GetPassword, в ко-торой использованы новые элементы. Обратимся к ней еще раз.
Function GetPassword ( )
GetPassword = Lcase (InputBox(“Enter Password:”.” Password”))
End Function
Здесь во второй строке заданы обращения к двум встроенным функ-циям VBA-Lcase и InputBox. Первая преобразует все буквы переданной в нее строки в строчные. Вторая выводит на экран диалоговое окно с запро-сом на ввод данных пользователем. У этой функции есть несколько необя-зательных аргументов, из которых нас интересуют только первые два. Один из них – строка, отображаемая в окне над полем для ввода. Второй содержит строку заголовка диалогового окна. При вызове функции Input-Box на экране появляется диалоговое окно с заданными заголовком и тек-стом приглашением, кроме того оно содержит пустое поле, в котором пользователь может ввести данные. Значение, возвращаемое InputBox, за-висит от того, какую кнопку щелкнет пользователь. Если это – ОК, воз-вращается введенная строка, если – Отмена (Cancel), то пустая. В нашем примере буквы этой строки передаются в функцию Lcase, которая преоб-разует их в строчные. В блоке, начинающемся сразу за ключевым словом If, помещен цикл For-Each-Next (он подробно описан ниже в разделе "Управляющая структура For-Each-Next”). В этом цикле перебираются все листы активной рабочей книги, с каждым из которых выполняются два действия – свойству Visible присваивается значение True и вызывается ме-тод Unprotect. Первое действие позволяет пользователю видеть лист, вто-рое – снимает с листа защиту паролем. У метода Unprotect есть один аргу-мент – строка с паролем. Но в данном случае пароль для защиты листов мы не использовали, поэтому Unprotect вызван без аргументов. В других бло-ках программы свойство Visible и метод Unprotect вызываются выборочно, в зависимости от введенного пароля.