Skip to content

Циклы VBA

Доброго времени суток! Данную статью я решил посвятить рубрике по основам программирования в Visual Basic for Application. И сегодня мы поговорим о циклах в VBA, разберём их синтаксис и рассмотрим несколько примеров, которые часто встречаются программисту.

Сначала напомню, что цикл — процесс повторения части кода, выполняемый, пока не будет выполнено или нарушено заданное нами условие.

В данной статье мы разберём синтаксис и примеры следующих циклов в VBA:

  • For
  • For each
  • While
  • Until

Цикл For в VBA

Блок схема цикла for
Цикл for в VBA обычно используется при зацикливании фрагмента кода, если нам известно конечное значение counter — счетчика, при котором мы выйдем из цикла.
Возьмём для примера самый распространённый пример:

Сгенерировать массив из 5 целых значений

Dim mas(5) As Integer
For i% = 0 To 4
    mas(i) = Int((10 * Rnd) + 1)
Next i

Обратите ваше внимание, что в этом примере используется неявное объявление при работе с циклами в VBA. i% — означает неявное объявление переменной i в формате integer. Такая конструкция по сути заменяет следующую: dim i as integer. Это используется для сокращения кода и для удобства написания и чтения. В старых версиях VBA необходимо указывать знак формата после каждого использования неявной переменной. В более поздних версиях достаточно всего один раз.

VBA для цикла for даёт возможность использовать функцию Step. Как ясно из перевода, это шаг, с которым мы будем проходить наш интервал. По умолчанию, он равен 1. Популярный вариант использования встречается в случаях, когда counter связан с переменной, используемой внутри цикла. Например, при написании программ, связанных с функциями.

Найти пересечение графика функции y = 5*x + 5 с осью ординат

Function expr(x As Integer) As Integer
    expr = 5 * x + 5
End Function
Sub CodeTown()
    Dim i As Integer
    For i = -10 To 10 Step 1
        If expr(i) = 0 Then MsgBox "При Y = 0, Х = "+ CStr(i)
    Next i
End Sub

Теперь представим, что у нас достаточно большой диапазон и мы не хотим заставлять компьютер считать лишние итерации. На этот случай существует команда Exit For. Перепишем наш последний пример с новой командой.

Function expr(x As Integer) As Integer
    expr = 5 * x + 5
End Function
Sub CodeTown()
    Dim i As Integer
    For i = -10 To 10 Step 1
        If expr(i) = 0 Then
            MsgBox "При Y = 0, Х = "+ CStr(i)
            Exit For
        End If
    Next i
End Sub

C помощью команды Exit можно закончить выполнение любого цикла в VBA. Достаточно указать после Exit название используемого цикла. Также им возможно завершить работу любой процедуры или функции.

Цикл For Each в VBA

Блок схема For Each
For Each в VBA основан на переборе всех элементов, указанного типа в массиве, объекте или группе.
Самый популярный вариант его использования — перебор страниц в рабочей книге.

Вывести названия всех листов в рабочей книге

For Each ws In ThisWorkbook.Worksheets
    MsgBox ws.Name
Next ws

И ещё один интересный пример:

Изменить размер шрифта и выравнить по центру текст в label

For Each element In UserForm1.Controls
    If InStr(1, UserForm1.Controls.Item(i%).Name, "Label") > 0 Then
        UserForm1.Controls.Item(i%).TextAlign = fmTextAlignCenter
        UserForm1.Controls.Item(i%).Font.Size = 20
        i% = i% + 1
    End If
Next element

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

Цикл While в VBA

Цикл while VBA
Циклы в VBA, которые используют структуру Do..Loop (это while и until циклы) можно записывать с разным расположением фрагмента условия. Как видите на картинке выше, условие может проверяться после выполнения одной итерации, а может перед запуском цикла.
Самый популярный пример:

Отсортируйте по возрастанию сгенерированный массив методом пузырька

Dim mas(5) As Integer
For i% = 0 To 4
    mas(i%) = Int((10 * Rnd) + 1)
Next i
Dim count As Integer, temp As Integer
count = 1
Do While count > 0
    count = 0
    For i% = 0 To 3
        If mas(i) > mas(i + 1) Then
            temp = mas(i)
            mas(i) = mas(i + 1)
            mas(i + 1) = temp
            count = count + 1
        End If
    Next i%
Loop

В вышеуказанном примере мы отсортировали массив с рандомными значениями в порядке возрастания. Метод пузырька считается достаточно долгим, но простым в реализации. В основном, им сортируют небольшие числовые массивы.

Цикл Until в VBA

Цикл Until VBA
Как видите, отличия от while крайне несущественные. Цикл Until в VBA можно реализовать с помощью конструкции while NOT (condition). Тем не менее, приведу пример:

Заставить пользователя ввести число

Dim temp As Variant
Do
    temp = InputBox("Введите число")
Loop Until IsNumeric(temp)

Почему заставить? Потому, что если пользователь закроет окно ввода, это его не спасёт, оно будет появляться вновь и вновь пока он не введёт любое число.

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

Опубликовано вVBA

Будьте первым, кто оставит комментарий

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *