Пятница, 09.20.2024, 3:52 AM
Приветствую Вас Гость | RSS

Электронный учебник по VBA MS Excel 2010

Циклы

Цикл - это повторяющееся действие какой-либо операции.
Например, нам надо прибавить к одному и тому же числу значения от 1 до 100. ЕСтественно неудобно будет писать каждую операцию вручную. Вот именно для этого и придумали циклы, без которых никуда.

Посмотрим какие они бывают.

Цикл For ... Next

Цикл For ... Next самый распространённый. Потому, что он самый простой. записывается в макросе он следующим образом:

        Sub Primer()
        .........
            For i = 1 To 100 Step 1
                r = r + i
            Next i
        .........
        End Sub

For - Объявляет наш цикл;
i - это переменная которая принимает разные значения (равносильно нашему От);
To - это конечное значение переменной (равносильно нашему До);
Step - это шаг цикла;
Next - это конец нашего цикла, он переводит цикл на начало For.

Читается это так: Цикл от 1 до 100 с шагом в еденицу. То-есть в начале выполнения нашего цикла i = 1, далее происходит какое-то выражение или оперция и значение Next переводит переменную i на следующее значение. В данном случае шаг Step 1, т.е. следующее значение i будет равняться 2. И так далее. Как только i достигнет своего сотого значения (так как до 100 цикл), цикл прекратится выполняться и дальше пойдёт выполнение нашего программного кода, который стоит после цикла.

Приведём ещё один пример, сложим значения от 1 до 100 при помощи цикла:

        Sub Primer()
        Dim i As Byte
        Dim r As Integer
          
          For i = 1 To 100 Step 1
              r = r + i
          Next i
        
        MsgBox "Сумма чисел от 1 до 100 равняется " & r, vbInformation, "Сумма"
        End Sub

Если шаг вашего цикла равен 1, то Step можно не писать. Выглядеть это будет так:

        Sub Primer()
        Dim i As Byte
        Dim r As Integer
          
          For i = 1 To 100
              r = r + i
          Next i
        
        MsgBox "Сумма чисел от 1 до 100 равняется " & r, vbInformation, "Сумма"
        End Sub

Шаг Step может принимать не только положительные значения, но и отрицательные:

        Sub Primer()
        Dim i As Integer
        Dim r As Integer
        
          For i = 100 To 1 Step -1
              r = r + i
          Next i
        
        MsgBox "Сумма чисел от 1 до 100 равняется " & r, vbInformation, "Сумма"
        End Sub        

а также дробные. Например так:

        Sub Primer()
        Dim i As Byte
        Dim r As Integer
          
          For i = 1 To 100 Step 1.5
              r = r + i
          Next i
        
        MsgBox "Сумма чисел от 1 до 100 равняется " & r, vbInformation, "Сумма"
        End Sub

Цикл For Each ... Next

Цикл For Each ... Next применяется когда требуется перебрать элекменты в какой либо группе, коллекции, массиве и т.п. Наприер перебрать все листы книги Excel, все ячейки в определённом диапазоне, или "пробежаться" по объектам.
Записывается он следующим образом:

            For Each X In Y
                ....
            Next X

For Each - начало нашего цикла;
X - это переменная в группе;
In - это синтаксис указывающий в какой группе необходимо перебирать элементы (равносильно нашему "смотри в");
Y - это группа;
Next - переводит цикл на начало;

К примеру, данным циклом можно посчитать количество листов в активной книге:

            Sub Primer()
            Dim Shet As Object
            Dim r As Integer
    
            For Each Shet In ActiveWorkbook.Sheets
                r = r + 1
            Next Shet
      
            MsgBox "Количество листов в книге = " & r, vbInformation, "Справка"
            End Sub

Или собрать все имена листов (попробуйте запустить данный код):

            Sub Primer()
            Dim Shet As Object
            Dim r As String
      
            For Each Shet In ActiveWorkbook.Sheets
                r = Shet.Name
                s  = s & " " & r
            Next Shet
    
            MsgBox "В книге присутствуют следующие имена листов:" & _
                    vbNewLine & s, vbInformation, "Справка"
            End Sub

vbNewLine - переносит текст на следующую строку сообщения.
& - отделяет текст от переменных (правило синтаксиса).

Цикл Do ... Loop

Цикл Do ... Loop означает: выполнять действие пока оно истинно или ложно.
Рассмотрим эти циклы.

Do While Loop

При проверке истинности цикл записывается следующим образом.

          Sub Primer()
          Dim X As Byte
          
          Do While X < 10
              X = X + 1
              MsgBox "Как только X превысит значение 10 код прекратит выполняться." & _
                      vbNewLine & "Сейчас X = " & X
          Loop

 
          End Sub

При такой записи цикл будет выполняться до тех пор, пока Х истинно, то-есть меньше 10.

Do - это начало нашего цикла;
While - это говорит о том, что цикл проверяется на истинность;
X < 10 - это то условие истинности, которое мы задали;
Loop - возврощает цикл на его начало;

При этом он может записываться и так:

          Sub Primer()
          Dim X As Byte
          
          Do
              X = X + 1
              MsgBox "Как только X превысит значение 10 код прекратит выполняться." & _
                      vbNewLine & "Сейчас X = " & X
          Loop While (X < 10)
          
          End Sub

Тут мы сначало открываем цикл, пишем ему какой-то алгоритм, и только потом проверяем его на истинность.

Do Until Loop

При проверке цикла на ложность, код записывается следующим образом:

        Sub Primer()
        Dim X As Byte
          
        Do Until X > 5
            MsgBox "Как только X превысит значение 5 код прекратит выполняться." & _
                    vbNewLine & "Сейчас X = " & X
            X = X + 1
        Loop

 
        End Sub

При такой записи цикл будет выполняться до тех пор пока условие Х > 5 ложно. Как только Х превысит значение 5 и условие станет истинно, цикл прекратит выполняться.

Do - это начало нашего цикла;
Until - это говорит о том, что цикл проверяется на ложность;
X > 5 - это то ложное условие, которое мы задали;
Loop - возврощает цикл на его начало;

При этом он тоже может записываться наоборот:

        Sub Primer()
        Dim X As Byte
          
        Do
            X = X + 1
            MsgBox "Как только X превысит значение 6 код прекратит выполняться." & _
                    vbNewLine & "Сейчас X = " & X
        Loop Until (X > 5)

 
        End Sub

То-есть сперва мы выполняем код, а потом проверяем на наше условие.

У некоторых может возникнуть такой вопрос: А как выйти из цикла экстренно, не заканчивая его выполнение? Например мы нашли наше ложное или истинное условие и хотим его покинуть.
Это тоже предусмотренно. При помощи команды Exit Do.
Выглядеть это будет так:

        Sub Primer()
        Dim X As Byte
          
        Do
            If X = 3 Then Exit Do
            X = X + 1
            MsgBox "Как только X превысит значение 6 код прекратит выполняться." & _
                    vbNewLine & "Сейчас X = " & X
        Loop Until (X > 5)
            MsgBox "Всё!!!"
        End Sub

При этом тот код, который у нас написан после цикла будет выполняться дальше.

Цикл With – End With

Конструкция With – End With позволяет выполнять несколько операций над одним объектом. Для анализа работы посмотрим, как работают следующие процедуры:

Sub changeFont()
    Selection.Font.Name = "Times New Roman"
    Selection.Font.FontStyle = "Bold Italic"
    Selection.Font.Size = 12
    Selection.Font.Underline = xlUnderlineStyleSingle
    Selection.Font.ColorIndex = 5
End Sub
Эту процедуру можно записать с помощью With – End With. Процедура работает точно также:
Sub changeFont2()
       With Selection.Font
              .Name = "Times New Roman"
              .FontStyle = "Bold Italic"
              .Size = 12
              .Underline = xlUnderlineStyleSingle
              .ColorIndex = 5
       End With
End Sub
               Смысл использования второго варианта заключается в том, что он более быстрый с точки зрения обработки операций в процедуре, хотя и менее понятен с точки зрения языка програмирования.

Ещё один нюанс.
Если вы запустили цикл и он оказался бесконечным, то нажмите комбинацию кнопок Ctrl + Break.

< < Предыдущая глава Следующая глава > >
Поиск

Динара Илькаева © 2024
Бесплатный конструктор сайтов - uCoz