VBA
Структуры контроля потока
Поиск…
Выберите Случай
Select Case
можно использовать, когда возможны различные условия. Условия проверяются сверху вниз, и выполняется только первый случай, который соответствует.
Sub TestCase()
Dim MyVar As String
Select Case MyVar 'We Select the Variable MyVar to Work with
Case "Hello" 'Now we simply check the cases we want to check
MsgBox "This Case"
Case "World"
MsgBox "Important"
Case "How"
MsgBox "Stuff"
Case "Are"
MsgBox "I'm running out of ideas"
Case "You?", "Today" 'You can separate several conditions with a comma
MsgBox "Uuuhm..." 'if any is matched it will go into the case
Case Else 'If none of the other cases is hit
MsgBox "All of the other cases failed"
End Select
Dim i As Integer
Select Case i
Case Is > 2 '"Is" can be used instead of the variable in conditions.
MsgBox "i is greater than 2"
'Case 2 < Is '"Is" can only be used at the beginning of the condition.
'Case Else is optional
End Select
End Sub
Логика блока Select Case
может быть инвертирована для поддержки тестирования различных переменных. В этом сценарии мы также можем использовать логические операторы:
Dim x As Integer
Dim y As Integer
x = 2
y = 5
Select Case True
Case x > 3
MsgBox "x is greater than 3"
Case y < 2
MsgBox "y is less than 2"
Case x = 1
MsgBox "x is equal to 1"
Case x = 2 Xor y = 3
MsgBox "Go read about ""Xor"""
Case Not y = 5
MsgBox "y is not 5"
Case x = 3 Or x = 10
MsgBox "x = 3 or 10"
Case y < 10 And x < 10
MsgBox "x and y are less than 10"
Case Else
MsgBox "No match found"
End Select
Операторы case также могут использовать арифметические операторы. Если для значения Select Case
используется арифметический оператор, ему должно предшествовать ключевое слово Is
:
Dim x As Integer
x = 5
Select Case x
Case 1
MsgBox "x equals 1"
Case 2, 3, 4
MsgBox "x is 2, 3 or 4"
Case 7 To 10
MsgBox "x is between 7 and 10 (inclusive)"
Case Is < 2
MsgBox "x is less than one"
Case Is >= 7
MsgBox "x is greater than or equal to 7"
Case Else
MsgBox "no match found"
End Select
Для каждого цикла
Конструкция For Each
цикла идеально подходит для итерации всех элементов коллекции.
Public Sub IterateCollection(ByVal items As Collection)
'For Each iterator must always be variant
Dim element As Variant
For Each element In items
'assumes element can be converted to a string
Debug.Print element
Next
End Sub
Использовать For Each
при повторной сборке объектов:
Dim sheet As Worksheet
For Each sheet In ActiveWorkbook.Worksheets
Debug.Print sheet.Name
Next
Избегайте For Each
при повторении массивов; For
цикла будет предлагать значительно более высокую производительность с массивами. И наоборот, For Each
цикла будет предлагать более высокую производительность при переборе в Collection
.
Синтаксис
For Each [item] In [collection]
[statements]
Next [item]
Ключевое слово Next
может необязательно сопровождаться переменной итератора; это может помочь прояснить вложенные циклы, хотя есть лучшие способы прояснить вложенный код, например, извлечение внутреннего цикла в его собственную процедуру.
Dim book As Workbook
For Each book In Application.Workbooks
Debug.Print book.FullName
Dim sheet As Worksheet
For Each sheet In ActiveWorkbook.Worksheets
Debug.Print sheet.Name
Next sheet
Next book
Проведите цикл
Public Sub DoLoop()
Dim entry As String
entry = ""
'Equivalent to a While loop will ask for strings until "Stop" in given
'Prefer using a While loop instead of this form of Do loop
Do While entry <> "Stop"
entry = InputBox("Enter a string, Stop to end")
Debug.Print entry
Loop
'Equivalent to the above loop, but the condition is only checked AFTER the
'first iteration of the loop, so it will execute even at least once even
'if entry is equal to "Stop" before entering the loop (like in this case)
Do
entry = InputBox("Enter a string, Stop to end")
Debug.Print entry
Loop While entry <> "Stop"
'Equivalent to writing Do While Not entry="Stop"
'
'Because the Until is at the top of the loop, it will
'not execute because entry is still equal to "Stop"
'when evaluating the condition
Do Until entry = "Stop"
entry = InputBox("Enter a string, Stop to end")
Debug.Print entry
Loop
'Equivalent to writing Do ... Loop While Not i >= 100
Do
entry = InputBox("Enter a string, Stop to end")
Debug.Print entry
Loop Until entry = "Stop"
End Sub
Пока цикл
'Will return whether an element is present in the array
Public Function IsInArray(values() As String, ByVal whatToFind As String) As Boolean
Dim i As Integer
i = 0
While i < UBound(values) And values(i) <> whatToFind
i = i + 1
Wend
IsInArray = values(i) = whatToFind
End Function
Для цикла
Цикл For
используется для повторения замкнутого раздела кода заданное количество раз. Следующий простой пример иллюстрирует основной синтаксис:
Dim i as Integer 'Declaration of i
For i = 1 to 10 'Declare how many times the loop shall be executed
Debug.Print i 'The piece of code which is repeated
Next i 'The end of the loop
В приведенном выше коде объявляется целочисленный i
. Цикл For
присваивает каждому значению от 1 до 10 до i
а затем выполняет Debug.Print i
- то есть код печатает числа с 1 по 10 в ближайшее окно. Обратите внимание, что переменная цикла увеличивается с помощью оператора Next
, то есть после выполнения прилагаемого кода, а не перед его выполнением.
По умолчанию счетчик будет увеличиваться на 1 при каждом выполнении цикла. Тем не менее, может быть указан Step
, чтобы изменить величину приращения в виде литерального или возвращаемого значения функции. Если начальное значение, конечное значение или значение Step
- это число с плавающей запятой, оно округляется до ближайшего целочисленного значения. Step
может быть положительным или отрицательным.
Dim i As Integer
For i = 1 To 10 Step 2
Debug.Print i 'Prints 1, 3, 5, 7, and 9
Next
В общем случае цикл For
будет использоваться в ситуациях, когда это известно до того, как цикл запустит сколько раз для выполнения заключенного кода (в противном случае может быть более целесообразным цикл Do
или While
). Это связано с тем, что условие выхода фиксируется после первого входа в цикл, поскольку этот код демонстрирует:
Private Iterations As Long 'Module scope
Public Sub Example()
Dim i As Long
Iterations = 10
For i = 1 To Iterations
Debug.Print Iterations 'Prints 10 through 1, descending.
Iterations = Iterations - 1
Next
End Sub
Цикл For
может быть выведен на раннем этапе с помощью инструкции Exit For
:
Dim i As Integer
For i = 1 To 10
If i > 5 Then
Exit For
End If
Debug.Print i 'Prints 1, 2, 3, 4, 5 before loop exits early.
Next