|
В Visual Basic for Application (VBA) существует несколько способов
изменения порядка выполнения инструкций. Управляющие структуры VBA во
многом схожи с подобными структурами в других языках программирования.
Основные управляющие структуры VBA :
If Then Else 'End If
For Next
While Wend
Do Loop
Select Case 'End Select
For Each Next
Управляющая инструкция If Then Else 'End If
Эта инструкция изменяет порядок выполнения инструкций в зависимости
от результатов проверки заданного условия (или набора условий)
Пример :
Sub TestIfThen()
iData = "pashulka"
If iData = "Excel" Then
MsgBox "Этого сообщения Вы не увидите никогда !!!"
ElseIf iData = "Office" Then
MsgBox "К сожалению, этого сообщения Вы тоже не увидите !!!"
Else
MsgBox "Это сообщение появится в любом случае", ,iData
End If
End Sub
Комментарии :
If - ключевое слово, означающее начало проверки
iData - переменная, значение которой будет проверяться
Then - ключевое слово, означающее конец проверки
MsgBox - сообщение
ElseIf - ключевое слово, означающее начало новой проверки
Then - ключевое слово, означающее конец дополнительной проверки
MsgBox - сообщение
Else - ключевое слово, означающее конец блока инструкций,
выполняемых при положительном результате проверки, и начало блока инструкций,
выполняемых при отрицательном результате.
MsgBox - сообщение
End If - ключевое слово, означающее конец инструкции
В инструкции If Then Else 'End If ключевые слова ElseIf и
Else являются необязательными.
Управляющая инструкция For Next
Эта инструкция позволяет выполнять определённые действия нужное
количество раз. Такие инструкции, как правило, называют циклами.
Пример :
Sub TestForNext()
For iCount = 1 To 100 Step 2
i = i + 1
Next
MsgBox "Число повторений : " & i
End Sub
Комментарии :
For - ключевое слово, означающее начало цикла
iCount - переменная, определяющая число повторений цикла.
1 - начальное значение счётчика
To - ключевое слово, разделяющее начальное и конечное значение счётчика
100 - конечное значение счётчика
Step - ключевое слово, определяющее шаг счётчика
2 - шаг счётчика (число)
Next - ключевое слово, при достижении которого значение счётчика
изменяется на величину шага, после чего управление опять переходит в начало
цикла.
MsgBox - сообщение о количестве повторений
В инструкции For Next ключевое слово Step является
необязательным. При его отсутствии, шаг выполнения счётчика будет равен 1.
важно Шаг счётчика обязательно должен быть числом.
Если шаг счётчика указан в виде отрицательного числа, то тогда значение
счётчика будет с каждым циклом будет уменьшаться.
Пример, с обратным отсчётом :
Sub TestForNext2()
For iCount = 300 To 1 Step -3
i = i + 1
If iCount = 153 Then Exit For
Next iCount
MsgBox "Число повторений : " & i
End Sub
Обратите внимание на :
If iCount = 153 Then - в этом VBA коде мы применили уже
известную нам инструкцию If Then Else
Exit For - инструкция означающая досрочный выход из цикла
Next iCount - в коде присутствует переменная (счётчик), который
располагается после ключевого слова. Подобный синтаксис используется, как
правило, для визуального определения конца цикла, если в VBA коде присутствует
достаточно много подобных инструкций.
Управляющая инструкция While Wend
Эта инструкция позволяет выполнять определённые действия до тех пор,
пока соблюдается заданное условие.
Пример :
Sub TestWhileWend()
While iCount < 100
iCount = iCount + 1
Wend
MsgBox "Число повторений : " & iCount
End Sub
Комментарии :
While - ключевое слово, означающее начало цикла
iCount < 100 - условие, при соблюдении которого будет выполняться эта
инструкция
Wend - ключевое слово, означающее конец цикла
MsgBox - сообщение о количестве повторений
Управляющая инструкция Do Loop
Эта инструкция позволяет выполнять определённые действия не только до
тех пор, пока соблюдается заданное условие, но и наиборот, пока не будет
выполнено заданное условие.
Пример :
Sub TestDoLoop()
Do Until iCount >= 100
iCount = iCount + 1
Loop
MsgBox "Число повторений : " & iCount
End Sub
Комментарии :
Do - ключевое слово, означающее начало цикла
Until - ключевое слово, означающее наличие условия
iCount >= 100 - условие, при соблюдении которого будет выполняться эта
инструкция
Loop - ключевое слово, означающее конец цикла
MsgBox - сообщение о количестве повторений
Sub TestDoLoop2()
Do
iCount = iCount + 1
If iCount = 50 Then Exit Do
Loop Until iCount = 100
MsgBox "Число повторений : " & iCount
End Sub
Обратите внимание на :
If iCount = 50 Then - в этом VBA коде мы опять применили
уже известную нам инструкцию If Then Else
Exit Do - инструкция означающая досрочный выход из цикла
iCount = 100 - условие, при соблюдении которого будет
выполняться эта инструкция
Примечание :
Условие заданное в конце цикла гарантирует, что он будет выполнен хотя
бы один раз. Будьте осторожны с инструкциями While Wend, Do Loop, так как
при некорректном задании условия, Вы можете получить практически perpetuum
mobile.
Управляющая инструкция Select Case 'End Select
Эта инструкция в зависимости от результатов значения переменной или выражения
выполняет один из нескольких фрагментов кода.
Пример :
Sub TestSelectCase()
iNumeric = 15
Select Case iNumeric
Case 1
MsgBox "Это сообщение Вы не должны увидеть"
Case 2, 5
MsgBox "Это сообщение Вы не должны увидеть"
Case 10 To 13
MsgBox "Это сообщение Вы не должны увидеть"
Case Is > 14
MsgBox "Именно это сообщение Вы и должны увидеть"
Case Else
MsgBox "Это сообщение появится, если переменная будет < 1"
End Select
End Sub
Комментарии :
Select Case - ключевые слова, означающее начало инструкции
iNumeric - переменная или выражение, значение которой определяет
выбор фрагмента VBA кода для выполнения
Case 1 - первый вариант значения для сравнения.
Если значение переменной совпадёт с ним, то будет выполнен фрагмент кода
следующий за Case, но до следующего ключевого Case, затем инструкция завершит
свою работу. В противном случае проверка продолжится.
Case 2, 5 - второй вариант значения.
Case 10 To 13 - третий вариант значения.
Case Is > 14 - четвёртый вариант значения.
MsgBox - сообщение, которое будет выведено в данном случае
Case Else - ключевые слова, означающее выполнение кода, если ни одно
из предыдущих вариантов не совпало.
End Select - ключевое слово, означающее конец инструкции
В инструкции Select Case 'End Select ключевое слово
Case Else является необязательным.
Управляющая инструкция For Each Next
Эта инструкция позволяет выполнять определённые действия с каждым
об'ектом семейства или элементом массива.
Пример с об'ектом Range :
Sub TestForEachNextRange()
For Each iCell In Range("A1:C5")
i = i + 1
iCell.Value = "Ячейка # " & i
Next
MsgBox "Число ячеек : " & i
End Sub
Комментарии :
For Each - ключевые слова, означающее начало инструкции
iCell - переменная, которой присваиваются значения элементов
группы (массива или семейства) Для работы с элементами массива переменная
должна принадлежать к типу Variant.
In - ключевое слово, отделяющее переменную от группы
Range("A1:C5") - группа, т.е. массив или семейство об'ектов.
Количество повторений цикла зависит от числа элементов, входящих в группу.
При первом выполнении цикла переменной присваивается значение самого первого
элемента группы, а затем, всех последующих.
Next - ключевое слово, при достижении которого управление опять
переходит в начало цикла.
MsgBox - сообщение о количестве элементов группы.
В данном случае использовать подобный подсчёт числа ячеек в об'екте
Range является не лучшим способом, так как у этого об'екта существует
свойство, которое справится с этой задачей гораздо лучше :
Об'ект Range : его свойства и методы
Пример манипуляции с об'ектом Range :
Sub TestForEachNextRangeChanges()
For Each iCell In Range("A1:C5")
i = i + 1: iCell.Value = i
If iCell.Value < 10 And iCell.Value <> 5 Then
iCell.Font.Size = 15
iCell.Interior.ColorIndex = 50
ElseIf iCell.Value = 13 Or iCell.Value = 5 Then
iCell.Font.Size = 20
iCell.Interior.ColorIndex = 3
Else
iCell.Clear
End If
Next
End Sub
Обратите внимание на :
- в этом VBA коде для проверки значений находящихся в ячейке мы
применили уже известную нам инструкцию If Then Else.
- в зависимости от того какое условие прошло проверку, выполняется
определённый фрагмент кода, который использует различные свойства
об'екта Range.
Пример с семейством WorkSheets :
Sub TestForEachNextSheet()
For Each iList In Worksheets
i = i + 1
iNameList = iNameList & Chr(10) & iList.Name
Next
MsgBox "Число рабочих листов : " & i & Chr(10) & _
"Имена рабочих листов : " & iNameList
End Sub
В данном случае использовать подобный подсчёт числа рабочих листов
является не лучшим способом, так как у этого об'екта также существует свойство,
которое справится с этой задачей гораздо лучше :
Об'ект WorkSheet : его свойства и методы
Пример с элементами массива :
Option Base 1
Sub TestForEachNextArray()
Dim NameArray(3)
NameArray(1) = "pashulka"
NameArray(2) = "john"
NameArray(3) = "maurizio"
For Each iArray In NameArray
i = i + 1
iNameArray = iNameArray & Chr(10) & iArray
Next
MsgBox "Число элементов массива : " & i & iNameArray
End Sub
|
|