Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню Справочник | VBA | Управляющие структуры ... Циклы


Rambler's Top100


Counter CO.KZ
В 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("A1:C5") использовать Selection или Application.Selection, то инструкция For Each Next будет выполнять свои действия в выделенном диапазоне, если таковой конечно имеется.

    Пример манипуляции с об'ектом 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 : его свойства и методы

    Совет : При использовании инструкции For Each Next допускается изменение свойств об'ектов семейств, но нельзя изменять значения элементов массива.

    Пример с элементами массива :

    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


    Функция MsgBox используемая во многих примерах, не является частью управляющих структур и использована только в качестве наглядного примера.

  • Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора : Microsoft Excel 95, 97, 2000, XP
    © 2004-2012 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff