Vba excel вложенные циклы for

Цикл For… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For… Next.

Цикл For… Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла — счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each… Next.


For counter = start To end [ Step step ]

    [ statements ]

    [ Exit For ]

    [ statements ]

Next [ counter ]


For счетчик = начало To конец [ Step шаг ]

    [ операторы ]

    [ Exit For ]

    [ операторы ]

Next [ счетчик ]


В квадратных скобках указаны необязательные атрибуты цикла For… Next.

Компоненты цикла For… Next

Компонент Описание
counter Обязательный атрибут. Числовая переменная, выполняющая роль счетчика, которую еще называют управляющей переменной цикла.
start Обязательный атрибут. Числовое выражение, задающее начальное значение счетчика.
end Обязательный атрибут. Числовое выражение, задающее конечное значение счетчика.
Step* Необязательный атрибут. Оператор, указывающий, что будет задан шаг цикла.
step Необязательный атрибут. Числовое выражение, задающее шаг цикла. Может быть как положительным, так и отрицательным.
statements Необязательный** атрибут. Операторы вашего кода.
Exit For Необязательный атрибут. Оператор выхода из цикла до его окончания.
Next [ counter ] Здесь counter — необязательный атрибут. Это то же самое имя управляющей переменной цикла, которое можно здесь не указывать.

*Если атрибут Step отсутствует, цикл For… Next выполняется с шагом по умолчанию, равному 1.

**Если не использовать в цикле свой код, смысл применения цикла теряется.

Примеры циклов For… Next

Вы можете скопировать примеры циклов в свой модуль VBA, последовательно запускать их на выполнение и смотреть результаты.

Простейший цикл

Заполняем десять первых ячеек первого столбца активного листа Excel цифрами от 1 до 10:

Sub test1()

Dim i As Long

  For i = 1 To 10

    Cells(i, 1) = i

  Next

End Sub

Простейший цикл с шагом

В предыдущий цикл добавлен оператор Step со значением 3, а результаты записываем во второй столбец:

Sub test2()

Dim i As Long

  For i = 1 To 10 Step 3

    Cells(i, 2) = i

  Next

End Sub

Цикл с отрицательными аргументами

Этот цикл заполняет десять первых ячеек третьего столбца в обратной последовательности:

Sub test3()

Dim i As Long

  For i = 0 To 9 Step 1

    Cells(i + 10, 3) = i + 10

  Next

End Sub

Увеличиваем размер шага до -3 и записываем результаты в четвертый столбец активного листа Excel:

Sub test4()

Dim i As Long

  For i = 0 To 9 Step 3

    Cells(i + 10, 4) = i + 10

  Next

End Sub

Вложенный цикл

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

Sub test5()

Dim i1 As Long, i2 As Long

  For i1 = 1 To 10

‘Пятой ячейке в строке i1 присваиваем 0

    Cells(i1, 5) = 0

      For i2 = 1 To 4

        Cells(i1, 5) = Cells(i1, 5) + Cells(i1, i2)

      Next

  Next

End Sub

Выход из цикла

В шестой столбец активного листа запишем названия десяти животных, конечно же, с помощью цикла For… Next:

Sub test6()

Dim i As Long

  For i = 1 To 10

    Cells(i, 6) = Choose(i, «Медведь», «Слон», «Жираф», «Антилопа», _

    «Крокодил», «Зебра», «Тигр», «Ящерица», «Лев», «Бегемот»)

  Next

End Sub

Следующий цикл будет искать в шестом столбце крокодила, который съел галоши. В ячейку седьмого столбца цикл, пока не встретит крокодила, будет записывать строку «Здесь был цикл», а когда обнаружит крокодила, запишет «Он съел галоши» и прекратит работу, выполнив команду Exit For. Это будет видно по ячейкам рядом с названиями животных ниже крокодила, в которых не будет текста «Здесь был цикл».

Sub test7()

Dim i As Long

  For i = 1 To 10

    If Cells(i, 6) = «Крокодил» Then

      Cells(i, 7) = «Он съел галоши»

      Exit For

        Else

      Cells(i, 7) = «Здесь был цикл»

    End If

  Next

End Sub


Результат работы циклов For… Next из примеров:

Результат работы циклов For... Next из примеров

Результат работы циклов For… Next

Такие данные на активном листе Excel вы получите, если последовательно запустите на выполнение в редакторе VBA все семь подпрограмм из примеров, демонстрирующих работу циклов For… Next.

Цикл с дробными аргументами

Атрибуты start, end и step могут быть представлены числом, переменной или числовым выражением:

For i = 1 To 20 Step 2

For i = a To b Step c

For i = a 3 To 2b + 1 Step c/2  

В результате вычисления значения переменной вне цикла или выражения внутри его может получиться дробный результат. VBA Excel округлит его до целого числа, используя бухгалтерское округление:

‘Значения атрибутов до округления

For i = 1.5 To 10.5 Step 2.51

‘Округленные значения атрибутов

For i = 2 To 10 Step 3  

Старайтесь не допускать попадания в тело цикла For… Next неокругленных значений аргументов, чтобы не получить непредсказуемые результаты его выполнения. Если без дробных чисел не обойтись, а необходимо использовать обычное округление, применяйте в коде VBA функцию рабочего листа WorksheetFunction.Round для округления числа перед использованием его в цикле For… Next.


In this Article

  • VBA Loop Quick Examples
    • For Each Loops
    • For Next Loops
    • Do While Loops
    • Do Until Loops
  • VBA Loop Builder
  • VBA For Next Loop
    • For Loop Syntax
    • For Loop Step
    • For Loop Step – Inverse
    • Nested For Loop
    • Exit For
    • Continue For
  • VBA For Each Loop
    • For Each Cell in Range
    • For Each Worksheet in Workbook
    • For Each Open Workbook
    • For Each Shape in Worksheet
    • For Each Shape in Each Worksheet in Workbook
    • For Each – IF Loop
  • VBA Do While Loop
    • Do While
    • Loop While
  • VBA Do Until Loop
    • Do Until
    • Loop Until
  • Exit Do Loop
  • End or Break Loop
  • More Loop Examples
    • Loop Through Rows
    • Loop Through Columns
    • Loop Through Files in a Folder
    • Loop Through Array
  • Loops in Access VBA

To work effectively in VBA, you must understand Loops.

Loops allow you to repeat a code block a set number of times or repeat a code block on a each object in a set of objects.

First we will show you a few examples to show you what loops are capable of. Then we will teach you everything about loops.

VBA Loop Quick Examples

For Each Loops

For Each Loops loop through every object in a collection, such as every worksheet in workbook or every cell in a range.

Loop Through all Worksheets in Workbook

This code will loop through all worksheets in the workbook, unhiding each sheet:

Sub LoopThroughSheets()
Dim ws As Worksheet
 
    For Each ws In Worksheets
        ws.Visible = True
    Next
 
End Sub

Loop Through All Cells in Range

This code will loop through a range of cells, testing if the cell value is negative, positive, or zero:

Sub If_Loop()
Dim Cell as Range
 
  For Each Cell In Range("A2:A6")
    If Cell.Value > 0 Then
      Cell.Offset(0, 1).Value = "Positive"
    ElseIf Cell.Value < 0 Then
      Cell.Offset(0, 1).Value = "Negative"
    Else
      Cell.Offset(0, 1).Value = "Zero"
     End If
  Next Cell
 
End Sub

vba else if statement

For Next Loops

Another type of “For” Loop is the For Next Loop.  The For Next Loop allows you to loop through integers.

This code will loop through integers 1 through 10, displaying each with a message box:

Sub ForLoop()
    Dim i As Integer
    For i = 1 To 10
        MsgBox i
    Next i
End Sub

Do While Loops

Do While Loops will loop while a condition is met. This code will also loop through integers 1 through 10, displaying each with a message box.

Sub DoWhileLoop()
    Dim n As Integer
    n = 1
    Do While n < 11
        MsgBox n
        n = n + 1
    Loop
End Sub

Do Until Loops

Conversely, Do Until Loops will loop until a condition is met. This code does the same thing as the previous two examples.

Sub DoUntilLoop()
    Dim n As Integer
    n = 1
    Do Until n >= 10
        MsgBox n
        n = n + 1
    Loop
End Sub

We will discuss this below, but you need to be extremely careful when creating Do While or Do Until loops so that you don’t create a never ending loop.

VBA Loop Builder

vba loop builder

This is a screenshot of the “Loop Builder” from our Premium VBA Add-in: AutoMacro. The Loop Builder allows you to quickly and easily build loops to loop through different objects, or numbers. You can perform actions on each object and/or select only objects that meet certain criteria.

The add-in also contains many other code builders, an extensive VBA code library, and an assortment of coding tools. It’s a must have for any VBA developer.

Now we will cover the different types of loops in depth.

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

VBA For Next Loop

For Loop Syntax

The For Next Loop allows you to repeat a block of code a specified number of times. The syntax is:

[Dim Counter as Integer]

For Counter = Start to End [Step Value]
    [Do Something]
Next [Counter]

Where the items in brackets are optional.

  • [Dim Counter as Long] – Declares the counter variable. Required if Option Explicit is declared at the top of your module.
  • Counter – An integer variable used to count
  • Start – The start value (Ex. 1)
  • End – The end value (Ex. 10)
  • [Step Value] – Allows you to count every n integers instead of every 1 integer. You can also go in reverse with a negative value (ex. Step -1)
  • [Do Something] – The code that will repeat
  • Next [Counter] – Closing statement to the For Next Loop. You can include the Counter or not. However, I strongly recommend including the counter as it makes your code easier to read.

If that’s confusing, don’t worry. We will review some examples:

Count to 10

This code will count to 10 using a For-Next Loop:

Sub ForEach_CountTo10()

Dim n As Integer
For n = 1 To 10
    MsgBox n
Next n

End Sub

For Loop Step

Count to 10 – Only Even Numbers

This code will count to 10 only counting even numbers:

Sub ForEach_CountTo10_Even()

Dim n As Integer
For n = 2 To 10 Step 2
    MsgBox n
Next n

End Sub

Notice we added “Step 2”. This tells the For Loop to “step” through the counter by 2.  We can also use a negative step value to step in reverse:

VBA Programming | Code Generator does work for you!

For Loop Step – Inverse

Countdown from 10

This code will countdown from 10:

Sub ForEach_Countdown_Inverse()

Dim n As Integer
For n = 10 To 1 Step -1
    MsgBox n
Next n
MsgBox "Lift Off"

End Sub

Delete Rows if Cell is Blank

I’ve most frequently used a negative step For-Loop to loop through ranges of cells, deleting rows that meet certain criteria.  If you loop from the top rows to the bottom rows, as you delete rows you will mess up your counter.

This example will delete rows with blank cells (starting from the bottom row):

Sub ForEach_DeleteRows_BlankCells()

Dim n As Integer
For n = 10 To 1 Step -1
    If Range("a" & n).Value = "" Then
        Range("a" & n).EntireRow.Delete
    End If
Next n

End Sub

Nested For Loop

You can “nest” one For Loop inside another For Loop. We will use Nested For Loops to create a multiplication table:

Sub Nested_ForEach_MultiplicationTable()

Dim row As Integer, col As Integer

For row = 1 To 9
    For col = 1 To 9
        Cells(row + 1, col + 1).Value = row * col
    Next col
Next row

End Sub

vba nested for loop

Exit For

The Exit For statement allows you to exit a For Next loop immediately.

You would usually use Exit For along with an If Statement, exiting the For Next Loop if a certain condition is met.

For example, you might use a For Loop to find a cell. Once that cell is found, you can exit the loop to speed up your code.

This code will loop through rows 1 to 1000, looking for “error” in column A. If it’s found, the code will select the cell, alert you to the found error, and exit the loop:

Sub ExitFor_Loop()

Dim i As Integer
 
For i = 1 To 1000
    If Range("A" & i).Value = "error" Then
        Range("A" & i).Select
        MsgBox "Error Found"
        Exit For
    End If
Next i

End Sub

Important: In the case of Nested For Loops, Exit For only exits the current For Loop, not all active Loops.

Continue For

VBA does not have the “Continue” command that’s found in Visual Basic. Instead, you will need to use “Exit”.

AutoMacro | Ultimate VBA Add-in | Click for Free Trial!

VBA For Each Loop

The VBA For Each Loop will loop through all objects in a collection:

  • All cells in a range
  • All worksheets in a workbook
  • All shapes in a worksheet
  • All open workbooks

You can also use Nested For Each Loops to:

  • All cells in a range on all worksheets
  • All shapes on all worksheets
  • All sheets in all open workbooks
  • and so on…

The syntax is:

For Each Object in Collection
[Do Something]
Next [Object]

Where:

  • Object – Variable representing a Range, Worksheet, Workbook, Shape, etc. (ex. rng)
  • Collection – Collection of objects (ex. Range(“a1:a10”)
  • [Do Something] – Code block to run on each object
  • Next [Object] – Closing statement. [Object] is optional, however strongly recommended.

For Each Cell in Range

This code will loop through each cell in a range:

Sub ForEachCell_inRange()

Dim cell As Range

For Each cell In Range("a1:a10")
    cell.Value = cell.Offset(0,1).Value
Next cell

End Sub

For Each Worksheet in Workbook

This code will loop through all worksheets in a workbook, unprotecting each sheet:

Sub ForEachSheet_inWorkbook()

Dim ws As Worksheet

For Each ws In Worksheets
    ws.Unprotect "password"
Next ws

End Sub

For Each Open Workbook

This code will save and close all open workbooks:

Sub ForEachWB_inWorkbooks()

Dim wb As Workbook

For Each wb In Workbooks
    wb.Close SaveChanges:=True
Next wb

End Sub

AutoMacro | Ultimate VBA Add-in | Click for Free Trial!

For Each Shape in Worksheet

This code will delete all shapes in the active sheet.

Sub ForEachShape()

Dim shp As Shape

For Each shp In ActiveSheet.Shapes
    shp.Delete
Next shp

End Sub

For Each Shape in Each Worksheet in Workbook

You can also nest For Each Loops. Here we will loop through all shapes in all worksheets in the active workbook:

Sub ForEachShape_inAllWorksheets()

Dim shp As Shape, ws As Worksheet

For Each ws In Worksheets
    For Each shp In ws.Shapes
        shp.Delete
    Next shp
Next ws

End Sub

For Each – IF Loop

As we’ve mentioned before, you can use an If statement within a loop, performing actions only if certain criteria is met.

This code will hide all blank rows in a range:

Sub ForEachCell_inRange()

Dim cell As Range

For Each cell In Range("a1:a10")
    If cell.Value = "" Then _
       cell.EntireRow.Hidden = True
Next cell

End Sub

VBA Do While Loop

The VBA Do While and Do Until (see next section) are very similar. They will repeat a loop while (or until) a condition is met.

The Do While Loop will repeat a loop while a condition is met.

Here is the Do While Syntax:

Do While Condition
[Do Something]
Loop

Where:

  • Condition – The condition to test
  • [Do Something] – The code block to repeat

You can also set up a Do While loop with the Condition at the end of the loop:

Do 
[Do Something]
Loop While Condition

We will demo each one and show how they differ:

AutoMacro | Ultimate VBA Add-in | Click for Free Trial!

Do While

Here is the Do While loop example we demonstrated previously:

Sub DoWhileLoop()
    Dim n As Integer
    n = 1
    Do While n < 11
        MsgBox n
        n = n + 1
    Loop
End Sub

Loop While

Now let’s run the same procedure, except we will move the condition to the end of the loop:

Sub DoLoopWhile()
    Dim n As Integer
    n = 1
    Do
        MsgBox n
        n = n + 1
    Loop While n < 11
End Sub

VBA Do Until Loop

Do Until Loops will repeat a loop until a certain condition is met. The syntax is essentially the same as the Do While loops:

Do Until Condition
[Do Something]
Loop

and similarly the condition can go at the start or the end of the loop:

Do 
[Do Something]
Loop Until Condition

Do Until

This do Until loop will count to 10, like our previous examples

Sub DoUntilLoop()
    Dim n As Integer
    n = 1
    Do Until n > 10
        MsgBox n
        n = n + 1
    Loop
End Sub

AutoMacro | Ultimate VBA Add-in | Click for Free Trial!

Loop Until

This Loop Until loop will count to 10:

Sub DoLoopUntil()
    Dim n As Integer
    n = 1
    Do
        MsgBox n
        n = n + 1
    Loop Until n > 10
End Sub

Exit Do Loop

Similar to using Exit For to exit a For Loop, you use the Exit Do command to exit a Do Loop immediately

Exit Do

Here is an example of Exit Do:

Sub ExitDo_Loop()

Dim i As Integer
i = 1 

Do Until i > 1000
    If Range("A" & i).Value = "error" Then
        Range("A" & i).Select
        MsgBox "Error Found"
        Exit Do
    End If
    i = i + 1
Loop

End Sub

End or Break Loop

As we mentioned above, you can use the Exit For or Exit Do to exit loops:

Exit For
Exit Do

However, these commands must be added to your code before you run your loop.

If you are trying to “break” a loop that’s currently running, you can try pressing ESC or CTRL + Pause Break on the keyboard. However, this may not work.  If it doesn’t work, you’ll need to wait for your loop to end or, in the case of an endless loop, use CTRL + ALT + Delete to force close Excel.

This is why I try to avoid Do loops, it’s easier to accidentally create an endless loop forcing you to restart Excel, potentially losing your work.

More Loop Examples

AutoMacro | Ultimate VBA Add-in | Click for Free Trial!

Loop Through Rows

This will loop through all the rows in a column:

Public Sub LoopThroughRows()
 
Dim cell As Range
 
For Each cell In Range("A:A")
    If cell.value <> "" Then MsgBox cell.address & ": " & cell.Value
Next cell
 
End Sub

Loop Through Columns

This will loop through all columns in a row:

Public Sub LoopThroughColumns()

Dim cell As Range

For Each cell In Range("1:1")
    If cell.Value <> "" Then MsgBox cell.Address & ": " & cell.Value
Next cell

End Sub

Loop Through Files in a Folder

This code will loop through all files in a folder, creating a list:

Sub LoopThroughFiles ()

Dim oFSO As Object
Dim oFolder As Object
Dim oFile As Object
Dim i As Integer

Set oFSO = CreateObject("Scripting.FileSystemObject")

Set oFolder = oFSO.GetFolder("C:Demo)

i = 2

For Each oFile In oFolder.Files
    Range("A" & i).value = oFile.Name
    i = i + 1
Next oFile

End Sub

Loop Through Array

This code will loop through the array ‘arrList’:

For i = LBound(arrList) To UBound(arrList)
    MsgBox arrList(i)
Next i

The LBound function gets the “lower bound” of the array and UBound gets the “upper bound”.

Loops in Access VBA

Most of the examples above will also work in Access VBA. However, in Access, we loop through the Recordset Object rather than the Range Object.

Sub LoopThroughRecords()
   On Error Resume Next
   Dim dbs As Database
   Dim rst As Recordset
   Set dbs = CurrentDb
   Set rst = dbs.OpenRecordset("tblClients", dbOpenDynaset)
   With rst
      .MoveLast
      .MoveFirst
      Do Until .EOF = True
         MsgBox (rst.Fields("ClientName"))
        .MoveNext
     Loop
   End With
   rst.Close
   Set rst = Nothing
   Set dbs = Nothing
End Sub

7.1 Операторы цикла
7.2 Вложенные циклы


7.1 Операторы цикла.

Циклы позволяют выполнить одну или несколько строк кода несколько раз. VBA поддерживает следующие циклы:

For...Next
For Each...Next
Do... Loop

Конструкция For . . . Next. Когда число повторений известно заранее, используют цикл For . . . Next. В цикле For используется переменная, называемая переменной цикла или счетчиком цикла, которая увеличивается или уменьшается на заданную величину при каждом повторении цикла. Синтаксис этой конструкции следующий:

For counter = start To end [Step increment]
 операторы 
Next [counter]

Параметры counter (счетчик), start (начало цикла), end (конец цикла) и increment (приращение) являются числовыми.

Примечание. Параметр increment может быть как положительным, так и отрицательным. Если он положителен, параметр start должен быть меньше или равен параметру end, иначе цикл не будет выполняться. Если параметр increment отрицателен, то параметр start должен быть больше или равен значению параметра end, чтобы выполнялось тело цикла. Если параметр Step не задан, то значение параметра increment по умолчанию равно 1.

VBA выполняет цикл For в следующей последовательности:

1. Устанавливает значение переменной цикла counter в значение start.

2. Сравнивает значение переменной цикла counter и значение параметра end. Если переменная counter больше, VBA завершает выполнение цикла. (Если значение параметра increment отрицательно, то VBA прекращает выполнение цикла при условии, что значение переменной цикла counter меньше значения параметра end.)

3. Выполняет операторы тела цикла statements.

4. Увеличивает значение переменной цикла counter на 1 или на величину значения параметра increment, если он задан.

5. Повторяет шаги со 2 по 4.

Рассмотрим пример: Вычислить значение функции f(t)

при заданных a, b, n, если t изменяется от a до b с шагом Dt=(b-a)/(n-1).

Sub пример3()
Dim f() As Single
Dim a As Single, b As Single, t As Single, dt As Single
Dim i As Integer, n As Integer
Call read("a1", a) : Call read("b1", b) : Call read("c1", n)
ReDim f(1 To n - 1)
dt = (b - a) / (n - 1) : t = a
Call out("a2", "i") : Call out("b2", "t") : Call out("c2", "f(t)")
For i = 1 To n - 1
t = t + dt
If t <= -1 Then
f(i) = -1
ElseIf t > 1 Then
f(i) = 1
Else
f(i) = t
End If
Call out("a" & (2 + i), i) : Call out("b" & (2 + i), t) : Call out("c" & (2 + i), f(i))
Next i
End Sub

Конструкция For Each . . . Next

Цикл For Each . . . Next похож на цикл For . . . Next, но он повторяет группу операторов для каждого элемента из набора объектов или из массива, вместо повторения операторов заданное число раз. Он особенно полезен, когда неизвестно, сколько элементов содержится в наборе.

Синтаксис конструкции цикла For Each . . . Next таков:

For Each element In group
  операторы 
Next element

Следует помнить следующие ограничения при использовании цикла For Each . . . Next:

 Для наборов параметр element может быть только переменной типа variant, общей переменной типа object или объектом, перечисленным в Object Browser

 Для массивов параметр element может быть только переменной типа Variant

 Нельзя использовать цикл For Each . . . Next с массивом, имеющим определенный пользователем тип, так как переменная типа variant не может содержать значение определенного пользователем типа

Конструкция Do…Loop

Цикл Do применяется для выполнения блока операторов неограниченное число раз. Существует несколько разновидностей конструкции Do . . . Loop, но каждая из них вычисляет выражение-условие, чтобы определить момент выхода из цикла. Как и в случае конструкции If . . . Then условие должно быть величиной или выражением, принимающими значение False (нуль) или True (не нуль).

В следующей конструкции Do . . . Loop операторы выполняются до тех пор, пока значением условия является True (Истина):

Do While условие
  операторы 
Loop

Выполняя этот цикл, VBA сначала проверяет условие. Если условие ложно (False), он пропускает все операторы цикла. Если оно истинно (True), VBA выполняет операторы цикла, снова возвращается к оператору Do While и снова проверяет условие.

Следовательно, цикл, представленный данной конструкцией, может выполняться любое число раз, пока значением условия является не нуль или True (Истина). Отметим, что операторы тела цикла не выполняются ни разу, если при первой проверке условия оно оказывается ложным (False).

Рассмотрим пример: Вычислить сумму ряда

с заданной точностью.

Sub пример4()
Dim e As Single, x As Single, s As Single
Dim m As Single, p As Single, i As Single
Call read("a1", x) : Call read("b1", e)
s = 0: i = 1: m = 1: p = -1
Call out("a2", "i") : Call out("b2", "m") : Call out("c2", "s")
Do While Abs(m) >= e
p = -p * x
m = p / i
s = s + m
Call out("a" & (2 + i), i) : Call out("b" & (2 + i), Abs(m)) : Call out("c" & (2 + i), s)
i = i + 1
Loop
End Sub

Другая разновидность конструкции Do . . . Loop сначала выполняет операторы тела цикла, а затем проверяет условие после каждого выполнения. Эта разновидность гарантирует, что операторы тела цикла выполнятся по крайней мере один раз:

Do
  операторы 
Loop 
While условие

Две другие разновидности конструкции цикла аналогичны предыдущим, за исключением того, что цикл выполняется, пока условие ложно (False):

 Цикл не выполняется вообще или выполняется много раз:

Do Until условие

операторы Loop

 Цикл выполняется по крайней мере один раз:

Do

операторы

Loop Until условие

7.2 Вложенные циклы.

Можно помещать структуры управления внутрь других структур управления (например, блок If . . . Then внутрь цикла For . . . Next). Говорят, что структура управления, помещенная внутрь другой структуры управления, является вложенной.

Глубина вложения управляющих структур в VBA не ограничена. Для улучшения читаемости кода принята практика смещения тела конструкции принятия решения или цикла в программе в случае использования вложенных структур управления.

При вложении в цикл одного или несколько других циклов говорят о вложенных циклах, в которых различают внешние (охватывающие) и внутренние (вложенные) циклы.

Рассмотрим пример суммирования элементов Aij матрицы A(n,m) построчно.

Sub пример5()
Dim a() As Single, s() As Single
Dim n As Integer, m As Integer
Dim i As Integer, j As Integer
Call read("a1", n): Call read("b1", m)
ReDim a(1 To n, 1 To m), s(1 To n)
'Чтение матрицы
For i = 1 To n
For j = 1 To m
Call readcell(i + 1, j, a(i, j))
Next j
Next i
'Вычисление
For i = 1 To n
s(i) = 0
For j = 1 To m
s(i) = s(i) + a(i, j)
Next j
Call outcell(i + 1, m + 1, s(i))
Next i
End Sub

Заметим, что первый оператор Next закрывает внутренний цикл For, а последний оператор Next закрывает внешний цикл For. Точно так же и для вложенных операторов If, операторы End If автоматически применяются для закрытия ближайшего к нему оператора If. Вложенные структуры Do . . . Loop работают подобным же образом: самый дальний оператор Loop соответствует самому дальнему оператору Do.

При вводе/выводе элементов двумерного массива на рабочий лист Microsoft Excel удобно применять пользовательские процедуры ввода/вывода:

Sub readcell(i As Integer, j As Integer, val As Variant)
val = Лист1.Cells(i, j).Value
End Sub
Sub outcell(i As Integer, j As Integer, val As Variant)
Лист1.Cells(i, j).Value = val
End Sub

где I — номер строки, j — номер столбца рабочего листа.

Выход из структур управления

Оператор Exit позволяет выходить непосредственно из цикла For, цикла Do, процедуры Sub или процедуры Function. Синтаксис оператора Exit прост:

For counter = start To end [Step -increment]
[блок операторов]
[Exit For]
[блок операторов] 
Next [counter]
Do [(While | Until} условие]
[блок операторов]
[Exit Do]
[блок операторов] 
Loop

Exit For внутри цикла For и Exit Do внутри цикла Do могут появиться сколько угодно раз.

Оператор Exit Do работает со всеми разновидностями синтаксиса цикла Do.

Операторы Exit For и Exit Do применяются, если необходимо завершить цикл немедленно, не продолжая дальнейших итераций или не ожидая выполнения блока операторов в теле цикла.

При использовании оператора Exit для выхода из цикла значения переменной цикла зависят от того, каким образом завершается выполнение цикла:

 При нормальном завершении цикла значение переменной цикла имеет на единицу больше верхней границы числа циклов

 При преждевременном завершении цикла переменная цикла сохраняет свое значение, которое она получила с учетом обычных правил

 При завершении цикла по концу набора переменная цикла имеет значение Nothing (Ничего), если она является переменной типа object (Объект), или значение Empty (Пусто), если она является переменной типа Variant

Содержание

  1. Циклы VBA (ч.3). Вложенные циклы
  2. Прерывание выполнения макроса или процедуры
  3. For. Next statement
  4. Syntax
  5. Remarks
  6. Example
  7. See also
  8. Support and feedback
  9. Excel VBA Loops – For Each, For Next, Do While, Nested & More
  10. VBA Loop Quick Examples
  11. For Each Loops
  12. Loop Through all Worksheets in Workbook
  13. Loop Through All Cells in Range
  14. For Next Loops
  15. Do While Loops
  16. Do Until Loops
  17. VBA Loop Builder
  18. VBA Coding Made Easy
  19. VBA For Next Loop
  20. For Loop Syntax
  21. Count to 10
  22. For Loop Step
  23. Count to 10 – Only Even Numbers
  24. For Loop Step – Inverse
  25. Countdown from 10
  26. Delete Rows if Cell is Blank
  27. Nested For Loop
  28. Exit For
  29. Continue For
  30. VBA For Each Loop
  31. For Each Cell in Range
  32. For Each Worksheet in Workbook
  33. For Each Open Workbook
  34. For Each Shape in Worksheet
  35. For Each Shape in Each Worksheet in Workbook
  36. For Each – IF Loop
  37. VBA Do While Loop
  38. Do While
  39. Loop While
  40. VBA Do Until Loop
  41. Do Until
  42. Loop Until
  43. Exit Do Loop
  44. End or Break Loop
  45. More Loop Examples
  46. Loop Through Rows
  47. Loop Through Columns
  48. Loop Through Files in a Folder
  49. Loop Through Array
  50. Loops in Access VBA
  51. VBA Code Examples Add-in

Циклы VBA (ч.3). Вложенные циклы

Циклы можно помещать внутрь друг друга. Помещение одной структуры цикла в другую называется вложением циклов. Можно делать вложение структур циклов разного типа.

При вложении циклов надо соблюдать определенные правила:

  • При вложении циклов For..Next каждый цикл должен иметь свою уникальную переменную счетчика;
  • При вложении циклов For Each..Next каждый цикл должен иметь свою уникальную element-переменную;
  • Если используется оператор Exit For или Exit Do во вложенном цикле, этим оператором заканчивается только выполняемый в данный момент цикл. VBA продолжает выполнение следующего цикла более высокого уровня.

В нижеприведенном листинге показан простейший пример использования вложенных циклов For..Next:

Прерывание выполнения макроса или процедуры

Зачастую программисты допускают ошибки в написании кода, которые приводят к зацикливанию программы (бесконечный цикл). Для прерывания выполнения VBA необходимо нажать клавишу Esc или комбинацию клавиш Ctrl+Break. VBA заканчивает выполнение текущего оператора, переходит в состояние ожидания и отображает окно сообщения о runtime-ошибке.

В начало страницы

В начало страницы

Источник

For. Next statement

Repeats a group of statements a specified number of times.

Syntax

For counter = start To end [ Step step ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]

The For…Next statement syntax has these parts:

Part Description
counter Required. Numeric variable used as a loop counter. The variable can’t be a Boolean or an array element.
start Required. Initial value of counter.
end Required. Final value of counter.
step Optional. Amount counter is changed each time through the loop. If not specified, step defaults to one.
statements Optional. One or more statements between For and Next that are executed the specified number of times.

The step argument can be either positive or negative. The value of the step argument determines loop processing as follows.

Value Loop executes if
Positive or 0 counter = end

After all statements in the loop have executed, step is added to counter. At this point, either the statements in the loop execute again (based on the same test that caused the loop to execute initially), or the loop is exited and execution continues with the statement following the Next statement.

Changing the value of counter while inside a loop can make it more difficult to read and debug your code.

Any number of Exit For statements may be placed anywhere in the loop as an alternate way to exit. Exit For is often used after evaluating some condition, for example If. Then, and transfers control to the statement immediately following Next.

You can nest For. Next loops by placing one For. Next loop within another. Give each loop a unique variable name as its counter. The following construction is correct:

If you omit counter in a Next statement, execution continues as if counter is included. If a Next statement is encountered before its corresponding For statement, an error occurs.

Example

This example uses the For. Next statement to create a string that contains 10 instances of the numbers 0 through 9, each string separated from the other by a single space. The outer loop uses a loop counter variable that is decremented each time through the loop.

See also

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

Excel VBA Loops – For Each, For Next, Do While, Nested & More

In this Article

To work effectively in VBA, you must understand Loops.

Loops allow you to repeat a code block a set number of times or repeat a code block on a each object in a set of objects.

First we will show you a few examples to show you what loops are capable of. Then we will teach you everything about loops.

VBA Loop Quick Examples

For Each Loops

For Each Loops loop through every object in a collection, such as every worksheet in workbook or every cell in a range.

Loop Through all Worksheets in Workbook

This code will loop through all worksheets in the workbook, unhiding each sheet:

Loop Through All Cells in Range

This code will loop through a range of cells, testing if the cell value is negative, positive, or zero:

For Next Loops

Another type of “For” Loop is the For Next Loop. The For Next Loop allows you to loop through integers.

This code will loop through integers 1 through 10, displaying each with a message box:

Do While Loops

Do While Loops will loop while a condition is met. This code will also loop through integers 1 through 10, displaying each with a message box.

Do Until Loops

Conversely, Do Until Loops will loop until a condition is met. This code does the same thing as the previous two examples.

We will discuss this below, but you need to be extremely careful when creating Do While or Do Until loops so that you don’t create a never ending loop.

VBA Loop Builder

This is a screenshot of the “Loop Builder” from our Premium VBA Add-in: AutoMacro. The Loop Builder allows you to quickly and easily build loops to loop through different objects, or numbers. You can perform actions on each object and/or select only objects that meet certain criteria.

The add-in also contains many other code builders, an extensive VBA code library, and an assortment of coding tools. It’s a must have for any VBA developer.

Now we will cover the different types of loops in depth.

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

VBA For Next Loop

For Loop Syntax

The For Next Loop allows you to repeat a block of code a specified number of times. The syntax is:

Where the items in brackets are optional.

  • [Dim Counter as Long] – Declares the counter variable. Required if Option Explicit is declared at the top of your module.
  • Counter – An integer variable used to count
  • Start – The start value (Ex. 1)
  • End – The end value (Ex. 10)
  • [Step Value] – Allows you to count every n integers instead of every 1 integer. You can also go in reverse with a negative value (ex. Step -1)
  • [Do Something] – The code that will repeat
  • Next [Counter] – Closing statement to the For Next Loop. You can include the Counter or not. However, I strongly recommend including the counter as it makes your code easier to read.

If that’s confusing, don’t worry. We will review some examples:

Count to 10

This code will count to 10 using a For-Next Loop:

For Loop Step

Count to 10 – Only Even Numbers

This code will count to 10 only counting even numbers:

Notice we added “Step 2”. This tells the For Loop to “step” through the counter by 2. We can also use a negative step value to step in reverse:

For Loop Step – Inverse

Countdown from 10

This code will countdown from 10:

Delete Rows if Cell is Blank

I’ve most frequently used a negative step For-Loop to loop through ranges of cells, deleting rows that meet certain criteria. If you loop from the top rows to the bottom rows, as you delete rows you will mess up your counter.

This example will delete rows with blank cells (starting from the bottom row):

Nested For Loop

You can “nest” one For Loop inside another For Loop. We will use Nested For Loops to create a multiplication table:

Exit For

The Exit For statement allows you to exit a For Next loop immediately.

You would usually use Exit For along with an If Statement, exiting the For Next Loop if a certain condition is met.

For example, you might use a For Loop to find a cell. Once that cell is found, you can exit the loop to speed up your code.

This code will loop through rows 1 to 1000, looking for “error” in column A. If it’s found, the code will select the cell, alert you to the found error, and exit the loop:

Important: In the case of Nested For Loops, Exit For only exits the current For Loop, not all active Loops.

Continue For

VBA does not have the “Continue” command that’s found in Visual Basic. Instead, you will need to use “Exit”.

VBA For Each Loop

The VBA For Each Loop will loop through all objects in a collection:

  • All cells in a range
  • All worksheets in a workbook
  • All shapes in a worksheet
  • All open workbooks

You can also use Nested For Each Loops to:

  • All cells in a range on all worksheets
  • All shapes on all worksheets
  • All sheets in all open workbooks
  • and so on…
  • Object – Variable representing a Range, Worksheet, Workbook, Shape, etc. (ex. rng)
  • Collection – Collection of objects (ex. Range(“a1:a10”)
  • [Do Something] – Code block to run on each object
  • Next [Object] – Closing statement. [Object] is optional, however strongly recommended.

For Each Cell in Range

For Each Worksheet in Workbook

This code will loop through all worksheets in a workbook, unprotecting each sheet:

For Each Open Workbook

This code will save and close all open workbooks:

For Each Shape in Worksheet

This code will delete all shapes in the active sheet.

For Each Shape in Each Worksheet in Workbook

You can also nest For Each Loops. Here we will loop through all shapes in all worksheets in the active workbook:

For Each – IF Loop

As we’ve mentioned before, you can use an If statement within a loop, performing actions only if certain criteria is met.

This code will hide all blank rows in a range:

VBA Do While Loop

The VBA Do While and Do Until (see next section) are very similar. They will repeat a loop while (or until) a condition is met.

The Do While Loop will repeat a loop while a condition is met.

Here is the Do While Syntax:

  • Condition – The condition to test
  • [Do Something] – The code block to repeat

You can also set up a Do While loop with the Condition at the end of the loop:

We will demo each one and show how they differ:

Do While

Here is the Do While loop example we demonstrated previously:

Loop While

Now let’s run the same procedure, except we will move the condition to the end of the loop:

VBA Do Until Loop

Do Until Loops will repeat a loop until a certain condition is met. The syntax is essentially the same as the Do While loops:

and similarly the condition can go at the start or the end of the loop:

Do Until

This do Until loop will count to 10, like our previous examples

Loop Until

This Loop Until loop will count to 10:

Exit Do Loop

Similar to using Exit For to exit a For Loop, you use the Exit Do command to exit a Do Loop immediately

Here is an example of Exit Do:

End or Break Loop

As we mentioned above, you can use the Exit For or Exit Do to exit loops:

However, these commands must be added to your code before you run your loop.

If you are trying to “break” a loop that’s currently running, you can try pressing ESC or CTRL + Pause Break on the keyboard. However, this may not work. If it doesn’t work, you’ll need to wait for your loop to end or, in the case of an endless loop, use CTRL + ALT + Delete to force close Excel.

This is why I try to avoid Do loops, it’s easier to accidentally create an endless loop forcing you to restart Excel, potentially losing your work.

More Loop Examples

Loop Through Rows

This will loop through all the rows in a column:

Loop Through Columns

This will loop through all columns in a row:

Loop Through Files in a Folder

Loop Through Array

This code will loop through the array ‘arrList’:

The LBound function gets the “lower bound” of the array and UBound gets the “upper bound”.

Loops in Access VBA

Most of the examples above will also work in Access VBA. However, in Access, we loop through the Recordset Object rather than the Range Object.

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

Источник

Содержание

  • Быстрые примеры цикла VBA
  • Конструктор циклов VBA
  • VBA для следующего цикла
  • VBA для каждого цикла
  • Цикл выполнения цикла в VBA
  • VBA: делать до цикла
  • Выход из цикла
  • Завершить или прервать цикл
  • Больше примеров петель
  • Циклы в Access VBA

Чтобы эффективно работать в VBA, вы должны понимать циклы.

Циклы позволяют повторять блок кода заданное количество раз или повторять блок кода для каждого объекта в наборе объектов.

Сначала мы покажем вам несколько примеров, чтобы показать, на что способны циклы. Затем мы научим вас всему, что касается петель.

Для каждой петли

For Each Loops перебирает каждый объект в коллекции, например каждый лист в книге или каждую ячейку в диапазоне.

Прокрутите все рабочие листы в рабочей тетради

Этот код будет перебирать все листы в книге, отображая каждый лист:

12345678 Sub LoopThroughSheets ()Dim ws как рабочий листДля каждого ws в листахws.Visible = TrueСледующийКонец подписки

Перебрать все ячейки в диапазоне

Этот код будет проходить через диапазон ячеек, проверяя, является ли значение ячейки отрицательным, положительным или нулевым:

1234567891011121314 Sub If_Loop ()Тусклая ячейка как диапазонДля каждой ячейки в диапазоне («A2: A6»)Если Cell.Value> 0, тоCell.Offset (0, 1) .Value = «Положительный»ElseIf Cell.Value <0 ТогдаCell.Offset (0, 1) .Value = «Отрицательное»ЕщеCell.Offset (0, 1) .Value = «Ноль»Конец, еслиСледующая ячейкаКонец подписки

Для следующих циклов

Другой тип цикла «For» — это цикл For Next. Цикл For Next Loop позволяет вам перебирать целые числа.

Этот код будет перебирать целые числа от 1 до 10, отображая каждое с окном сообщения:

123456 Sub ForLoop ()Dim i как целое числоДля i = от 1 до 10MsgBox iДалее яКонец подписки

Циклы «Пока»

Циклы выполнения цикла «Пока» будут повторяться, пока выполняется условие. Этот код также будет перебирать целые числа от 1 до 10, отображая каждое с окном сообщения.

12345678 Sub DoWhileLoop ()Dim n как целое числоп = 1Делай, пока n <11MsgBox nп = п + 1ПетляКонец подписки

До циклов

И наоборот, Do until Loops будет повторяться до тех пор, пока не будет выполнено условие. Этот код делает то же самое, что и в предыдущих двух примерах.

12345678 Подложка DoUntilLoop ()Dim n как целое числоп = 1До n> = 10MsgBox nп = п + 1ПетляКонец подписки

Мы обсудим это ниже, но вам нужно быть предельно осторожным при создании циклов Do While или Do While, чтобы не создать бесконечный цикл.

Конструктор циклов VBA

Это снимок экрана «Loop Builder» из нашей надстройки Premium VBA: AutoMacro. Конструктор циклов позволяет быстро и легко создавать циклы для обхода различных объектов или чисел. Вы можете выполнять действия с каждым объектом и / или выбирать только те объекты, которые соответствуют определенным критериям.

Надстройка также содержит множество других построителей кода, обширную библиотеку кода VBA и набор инструментов кодирования. Это необходимо для любого разработчика VBA.

Теперь мы подробно рассмотрим различные типы петель.

VBA для следующего цикла

Для синтаксиса цикла

Цикл For Next Loop позволяет вам повторять блок кода определенное количество раз. Синтаксис:

12345 [Тусклый счетчик как целое число]Для счетчика = от начала до конца [значение шага][Сделай что-нибудь]Далее [Счетчик]

Где элементы в скобках необязательны.

  • [Тусклый счетчик по длине] — Объявляет переменную счетчика. Требуется, если Option Explicit объявлен в верхней части вашего модуля.
  • Прилавок — Целочисленная переменная, используемая для подсчета
  • Начинать — Начальное значение (Пример 1)
  • Конец — Конечное значение (Пример 10)
  • [Значение шага] — Позволяет считать каждые n целых чисел вместо каждого целого числа. Вы также можете сделать обратное с отрицательным значением (например, шаг -1).
  • [Сделай что-нибудь] — Код, который будет повторяться
  • Далее [Счетчик] — Заключительное слово для цикла For Next. Вы можете включить счетчик или нет. Однако я настоятельно рекомендую включить счетчик, так как он облегчает чтение кода.

Если это сбивает с толку, не волнуйтесь. Мы рассмотрим несколько примеров:

Считай до 10

Этот код будет считать до 10 с использованием цикла For-Next:

12345678 Sub ForEach_CountTo10 ()Dim n как целое числоДля n = от 1 до 10MsgBox nСледующий nКонец подписки

Для шага цикла

Считайте до 10 — только четные числа

Этот код будет считать до 10, считая только четные числа:

12345678 Sub ForEach_CountTo10_Even ()Dim n как целое числоДля n = от 2 до 10 Шаг 2MsgBox nСледующий nКонец подписки

Обратите внимание, что мы добавили «Шаг 2». Это указывает циклу For «пройти» через счетчик на 2. Мы также можем использовать отрицательное значение шага для перехода в обратном направлении:

Шаг цикла — обратный

Обратный отсчет с 10

Этот код будет отсчитывать от 10:

123456789 Sub ForEach_Countdown_Inverse ()Dim n как целое числоДля n = от 10 до 1 Шаг -1MsgBox nСледующий nMsgBox «Взлет»Конец подписки

Удалить строки, если ячейка пуста

Чаще всего я использовал цикл For-Loop с отрицательным шагом, чтобы перебирать диапазоны ячеек, удаляя строки, соответствующие определенным критериям. Если вы перейдете от верхних строк к нижним строкам, при удалении строк вы испортите свой счетчик.

В этом примере будут удалены строки с пустыми ячейками (начиная с нижней строки):

12345678910 Sub ForEach_DeleteRows_BlankCells ()Dim n как целое числоДля n = от 10 до 1 Шаг -1Если Range («a» & n) .Value = «» ТогдаДиапазон («a» и n) .EntireRow.DeleteКонец, еслиСледующий nКонец подписки

Вложенный цикл For

Вы можете «вложить» один цикл For внутри другого цикла For Loop. Мы будем использовать Nested For Loops для создания таблицы умножения:

1234567891011 Sub Nested_ForEach_MultiplicationTable ()Тусклый ряд как целое число, столбец как целое числоДля ряда = от 1 до 9Для col = от 1 до 9Ячейки (строка + 1, столбец + 1). Значение = строка * столбецСледующий столбецСледующая строкаКонец подписки

Выход для

Оператор Exit For позволяет немедленно выйти из цикла For Next.

Обычно вы используете Exit For вместе с оператором If, выходя из цикла For Next Loop, если выполняется определенное условие.

Например, вы можете использовать цикл For Loop, чтобы найти ячейку. Как только эта ячейка будет найдена, вы можете выйти из цикла, чтобы ускорить код.

Этот код будет перебирать строки с 1 по 1000 в поисках «ошибки» в столбце A. Если она найдена, код выберет ячейку, предупредит вас о найденной ошибке и выйдет из цикла:

12345678910111213 Sub ExitFor_Loop ()Dim i как целое числоДля i = от 1 до 1000Если Range («A» & i) .Value = «error» ТогдаДиапазон («A» и i). ВыбратьMsgBox «Обнаружена ошибка»Выход дляКонец, еслиДалее яКонец подписки

Важно: В случае вложенных циклов For, Exit For завершает только текущий цикл For, а не все активные циклы.

Продолжить для

В VBA нет команды «Продолжить», которая есть в Visual Basic. Вместо этого вам нужно будет использовать «Выход».

VBA для каждого цикла

VBA For Each Loop будет перебирать все объекты в коллекции:

  • Все ячейки в диапазоне
  • Все листы в книге
  • Все фигуры на листе
  • Все открытые книги

Вы также можете использовать Nested For Each Loops, чтобы:

  • Все ячейки в диапазоне на всех листах
  • Все формы на всех листах
  • Все листы во всех открытых книгах
  • и так далее…

Синтаксис:

123 Для каждого объекта в коллекции[Сделай что-нибудь]Следующий [Объект]

Где:

  • Объект — Переменная, представляющая диапазон, рабочий лист, рабочую книгу, форму и т. Д. (Например, rng)
  • Коллекция — Коллекция объектов (например, Range («a1: a10»)
  • [Сделай что-нибудь] — Блок кода для запуска на каждом объекте
  • Следующий [Объект] — Заключительное заявление. [Объект] не является обязательным, но настоятельно рекомендуется.

Для каждой ячейки в диапазоне

Этот код будет перебирать каждую ячейку в диапазоне:

123456789 Sub ForEachCell_inRange ()Тусклая ячейка как диапазонДля каждой ячейки в диапазоне («a1: a10»)cell.Value = cell.Offset (0,1) .ValueСледующая ячейкаКонец подписки

Для каждого рабочего листа в книге

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

123456789 Sub ForEachSheet_inWorkbook ()Dim ws как рабочий листДля каждого ws в листахws.Unprotect «пароль»Следующий wsКонец подписки

Для каждой открытой книги

Этот код сохранит и закроет все открытые книги:

123456789 Sub ForEachWB_inWorkbooks ()Dim wb As WorkbookДля каждого ББ в книгахwb.Close SaveChanges: = TrueСледующий wbКонец подписки

Для каждой формы на листе

Этот код удалит все фигуры на активном листе.

123456789 Sub ForEachShape ()Dim shp как формаДля каждого файла в ActiveSheet.Shapesshp.УдалитьСледующая shpКонец подписки

Для каждой формы на каждом листе в книге

Вы также можете вкладывать For Each Loops. Здесь мы пройдемся по всем фигурам на всех листах в активной книге:

1234567891011 Sub ForEachShape_inAllWorksheets ()Dim shp as shape, ws as WorksheetДля каждого ws в листахДля каждой шп в ws.Shapesshp.УдалитьСледующая shpСледующий wsКонец подписки

Для каждого — IF Loop

Как мы упоминали ранее, вы можете использовать оператор If внутри цикла, выполняя действия только при соблюдении определенных критериев.

Этот код скроет все пустые строки в диапазоне:

12345678910 Sub ForEachCell_inRange ()Тусклая ячейка как диапазонДля каждой ячейки в диапазоне («a1: a10»)Если cell.Value = «» Тогда _cell.EntireRow.Hidden = ИстинаСледующая ячейкаКонец подписки

Цикл выполнения цикла в VBA

VBA Do While и Do While (см. Следующий раздел) очень похожи. Они будут повторять цикл, пока (или до тех пор, пока) не будет выполнено условие.

Цикл Do While Loop будет повторять цикл, пока выполняется условие.

Вот синтаксис Do while:

123 Сделать пока условие[Сделай что-нибудь]Петля

Где:

  • Состояние — Состояние для проверки
  • [Сделай что-нибудь] — Кодовый блок для повторения

Вы также можете настроить цикл Do While с условием в конце цикла:

123 Делать[Сделай что-нибудь]Цикл, пока условие

Мы продемонстрируем каждый из них и покажем, чем они отличаются:

Делать пока

Вот пример цикла Do While, который мы продемонстрировали ранее:

12345678 Sub DoWhileLoop ()Dim n как целое числоп = 1Делай, пока n <11MsgBox nп = п + 1ПетляКонец подписки

Цикл пока

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

12345678 Sub DoLoopWhile ()Dim n как целое числоп = 1ДелатьMsgBox nп = п + 1Цикл пока n <11Конец подписки

VBA: делать до цикла

Do until Loops будет повторять цикл до тех пор, пока не будет выполнено определенное условие. Синтаксис по существу такой же, как у циклов Do While:

123 Сделать до состояния[Сделай что-нибудь]Петля

и аналогично условие может идти в начале или в конце цикла:

123 Делать[Сделай что-нибудь]Цикл до состояния

До тех пор, пока

Этот цикл do until будет считать до 10, как и в наших предыдущих примерах.

12345678 Подложка DoUntilLoop ()Dim n как целое числоп = 1До n> 10MsgBox nп = п + 1ПетляКонец подписки

Цикл до

Этот цикл «Цикл до» будет считаться до 10:

12345678 Подложка DoLoopUntil ()Dim n как целое числоп = 1ДелатьMsgBox nп = п + 1Цикл до n> 10Конец подписки

Выход из цикла

Подобно использованию Exit For для выхода из цикла For, вы используете команду Exit Do для немедленного выхода из цикла Do

Вот пример Exit Do:

123456789101112131415 Sub ExitDo_Loop ()Dim i как целое числоя = 1До i> 1000Если Range («A» & i) .Value = «error» ТогдаДиапазон («A» и i). ВыбратьMsgBox «Обнаружена ошибка»Выход СделатьКонец, еслия = я + 1ПетляКонец подписки

Завершить или прервать цикл

Как мы упоминали выше, вы можете использовать Exit For или Exit Do для выхода из циклов:

Однако эти команды необходимо добавить в ваш код перед запуском цикла.

Если вы пытаетесь «разорвать» цикл, который в данный момент выполняется, вы можете попробовать нажать ESC или CTRL + Пауза перерыв на клавиатуре. Однако это может не сработать. Если это не сработает, вам нужно дождаться завершения цикла или, в случае бесконечного цикла, использовать CTRL + ALT + Удалить чтобы принудительно закрыть Excel.

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

Больше примеров петель

Цикл по строкам

Это будет проходить через все строки в столбце:

123456789 Публичный Sub LoopThroughRows ()Тусклая ячейка как диапазонДля каждой ячейки в диапазоне («A: A»)Ff cell.value «» затем MsgBox cell.address & «:» & cell.valueСледующая ячейкаКонец подписки

Цикл по столбцам

Это будет проходить через все столбцы в строке:

123456789 Общедоступная подпрограмма LoopThroughColumns ()Тусклая ячейка как диапазонДля каждой ячейки в диапазоне («1: 1»)Если cell.Value «» Тогда MsgBox cell.Address & «:» & cell.ValueСледующая ячейкаКонец подписки

Перебирать файлы в папке

Этот код будет перебирать все файлы в папке, создавая список:

12345678910111213141516171819 Sub LoopThroughFiles ()Dim oFSO как объектDim oFolder As ObjectDim oFile As ObjectDim i как целое числоУстановите oFSO = CreateObject («Scripting.FileSystemObject»)Установите oFolder = oFSO.GetFolder («C: Demo)я = 2Для каждого oFile в oFolder.FilesДиапазон («A» & i) .value = oFile.Nameя = я + 1Следующий oFileКонец подписки

Цикл через массив

Этот код будет циклически перебирать массив arrList:

123 Для i = LBound (arrList) To UBound (arrList)MsgBox arrList (i)Далее я

Функция LBound получает «нижнюю границу» массива, а UBound — «верхнюю границу».

Циклы в Access VBA

Большинство приведенных выше примеров также будут работать в Access VBA. Однако в Access мы перебираем объект Recordset, а не объект Range.

123456789101112131415161718 Sub LoopThroughRecords ()При ошибке Возобновить ДалееDim dbs как база данныхDim rst As RecordsetУстановите dbs = CurrentDbУстановите rst = dbs.OpenRecordset («tblClients», dbOpenDynaset)С первой.MoveLast.MoveFirstДо тех пор, пока .EOF = TrueMsgBox (rst.Fields («ClientName»)).MoveNextПетляКонец ссначала закрытьУстановить rst = ничегоУстановить dbs = NothingКонец подписки

Понравилась статья? Поделить с друзьями:
  • Vba excel вставить текущую дату
  • Vba excel включить фильтры
  • Vba excel вставить строку со сдвигом вниз
  • Vba excel включить автофильтр
  • Vba excel вставить строку снизу