Цикл 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
Такие данные на активном листе 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
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
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!
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
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
Содержание
- Циклы VBA (ч.3). Вложенные циклы
- Прерывание выполнения макроса или процедуры
- For. Next statement
- Syntax
- Remarks
- Example
- See also
- Support and feedback
- Excel VBA Loops – For Each, For Next, Do While, Nested & More
- VBA Loop Quick Examples
- For Each Loops
- Loop Through all Worksheets in Workbook
- Loop Through All Cells in Range
- For Next Loops
- Do While Loops
- Do Until Loops
- VBA Loop Builder
- VBA Coding Made Easy
- VBA For Next Loop
- For Loop Syntax
- Count to 10
- For Loop Step
- Count to 10 – Only Even Numbers
- For Loop Step – Inverse
- Countdown from 10
- Delete Rows if Cell is Blank
- 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
- 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Конец подписки |