ВГОРУ

VBA-Урок 8.1. Цикли (Loops)

Цикли здійснюють повторення інструкцій кілька разів, та можуть заощадити багато часу.

В Excel VBA існують наступні типи циклів:

  • While ... Wend
  • Do ... Loop
  • For ... To ... Next

  • Наступний код вставляє послідовність чисел в кожну комірку колонки A (від 1 до 12):

    Sub while_loop()
    
        Cells(1, 1) = 1
        Cells(2, 1) = 2
        Cells(3, 1) = 3
        Cells(4, 1) = 4
        Cells(5, 1) = 5
        Cells(6, 1) = 6
        Cells(7, 1) = 7
        Cells(8, 1) = 8
        Cells(9, 1) = 9
        Cells(10, 1) = 10
        Cells(11, 1) = 11
        Cells(12, 1) = 12
    
    End Sub
    

    Цей код є дуже повторюваний...

    Уявіть, якщо би ми мусіли вставляти послідовні числа в сотні комірок замість тільки 12... Тепер ви розумієте чому цикли є дуже корисними.

    WHILE ... WEND

    Наведемо приклад порожнього циклу While:

    Sub while_loop()
    
        While [умова]
            'Інструкції
        Wend
    
    End Sub
    

    Поки умова буде дійсною, інструкції в циклі будуть продовжувати виконуватись (але будьте обережні, щоби не зробити нескінченний цикл).

    Нижче є повторюваний макрос, який був розглянутий спочатку, перетворений у While цикл:

    Sub while_loop()
    
        Dim num As Integer
        num = 1 'Початкове число (в даному випадку, це є номер рядка та значення, яке проставляється)
    
        While num <= 12 'Допоки змінна num буде менше або рівне 12, - то інструкції будуть виконуватися
           Cells(num, 1) = num 'Нумерування
           num = num + 1 'Число збільшується на 1 під час кожного проходу циклу
        Wend
           
    End Sub
    

    Використовуючи цей цикл в макросі, все щоби ми мали би зробити, якби на треба було 400 стрічок замість 12, це замінити 12 на 400.

    DO ... LOOP

    Існує інший спосіб написати цикл, що працює так само, як While Wend (виконується так довго, допоки дійсна певна умова, що міститься у While команді):

    Sub do_while_loop()
    
        Do While [умова]
            'Інструкції
        Loop
    
    End Sub
    

    В наступному варіанті показано, що умова може бути прописана в кінці циклу Do Loop, що означає, що інструкції будуть точно виконані щонайменше один раз:

    Sub do_while_loop()
    
        Do
            'Інструкції
        Loop While [умова]
    
    End Sub
    

    Замість того, щоби повторювати цикл поки виконується умова, можна також вийти з циклу по умові, якщо ми замінимо While на Until:

    Sub do_while_loop()
    
        Do Until [умова]
            'Інструкції
        Loop
    
    End Sub
    

    FOR ... TO ... NEXT

    Sub for_loop()
    
        For i = 1 To 5
            'Інструкції
        Next
    
    End Sub
    

    Цикл For буде повторюватись тут 5 разів.

    При кожному повторені цього циклу, змінна і автоматично збільшується на 1:

    Sub for_loop()
    
        For i = 1 To 5
            MsgBox i
        Next
    
    End Sub
    

    Ранній вихід з циклу (Exit)

    Можливо вийти з циклу For завчасно, скориставшись наступною інструкцією:

    Exit For 'Вихід з циклу For
    

    Давайте розглянемо приклад, який наочно це покаже:

    Sub for_loop()
        Dim max_loops As Integer
        max_loops = Range("A1") 'В комірці A1 ми вказали ліміт кількості повторень
    
        For i = 1 To 7 'Очікувана кількість циклів : 7
           If i > max_loops Then 'Якщо комірка A1 є пустою чи містить число менше 7, - то зменшити кількість повторень
               Exit For 'Якщо попередня умова є TRUE, то вихід з циклу For...loop
           End If
       
           MsgBox i
        Next
    
    End Sub
    

    Інші оператори Exit:

    Exit Do 'Вихід з циклу Do Loop
    
    Exit Sub 'Вихід з процедури
    
    Exit Function 'Вихід з функції