Содержание
- 1 Оператор цикла «For» в Visual Basic
- 1.1 Цикл «For … Next»
- 1.2 Цикл «For Each»
- 1.3 Оператор прерывания цикла «Exit For»
- 2 Цикл «Do While» в Visual Basic
- 3 Цикл «Do Until» в Visual Basic
Пару недель назад передо мной встала проблема разработки электронной таблицы, просчитывающую диапазоны рабочего времени в зависимости от рабочего графика и производственного календаря. С первого взгляда задача нетрудная, но в ходе проектирования я понял, что избежать использования циклов не удастся. Особую специфику здесь придавало условие заказчика, что готовый продукт должен быть именно
Excel
таблицей БЕЗ макросов и дополнительных модулей (функций пользователя).
Стандартный набор функций Excel не поддерживает ничего похожего на циклы, однако выход нашелся – использование циклических ссылок и итераций.
Первый шаг, чтобы начать работать с циклическими ссылками – это разрешить итеративные вычисления в Excel. В версии Microsoft Office XP это делается в разделе меню «Сервис – Параметры»:
В открывшемся окне активируем соответствующий флажок:
Так же обратите внимание на поле «Предельное число итераций» — оно определяет, сколько раз будет проходить вычисление по всем циклическим ссылкам, если вы сами не поставите ограничение.
!Информация: В Excel 2007 включение итеративных вычислений производится в пункте меню «Файл – Параметры Excel» в разделе «Формулы».
Рассмотрим пример использования итеративных вычислений в виде цикла.
Впишите в ячейку А1 формулу:
Если значение предельного числа итераций равно 100, то результатом вычислений в ячейке А1 будет равно 100. Теперь изменим формулу:
Как видите число итераций мы ограничили числом в ячейке А2, а именно 10. Чтобы проиллюстрировать, как происходят итерации, добавим формулу в ячейку B2:
Как видите, каждый этап итерации (новое значение А1) добавляется к ячейке B1 до тех пор пока происходят итерации.
!Замечание: Возможно, результат в B2 будет не таким – для того, чтобы исправить это сделайте следующее: после ввода формулы в ячейку B1 перейдите в ячейку A1, установите курсор в поле редактирования формулы и нажмите Enter – произойдет пересчет итераций. Для корректной работы итераций необходимо задать ряд дополнительных условий, ограничивающих их количество и задающее условие сброса текущего значения поля в исходное значение. Пересчет всех ячеек с циклическими ссылками происходит каждый раз при изменении ячеек, от которых они зависят.
!Дополнительные ссылки:
Встречаются ситуации, когда от программы VBA требуется совершить несколько раз подряд один и тот же набор действий (то есть повторить несколько раз один и тот же блок кода). Это может быть сделано при помощи циклов VBA.
К циклам VBA относятся:
- Цикл For
- Цикл Do While
- Цикл Do Until
Далее мы подробно рассмотрим каждый из этих циклов.
Оператор цикла «For» в Visual Basic
Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each.
Цикл «For … Next»
Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:
For i = 1 To 10 Total = Total + iArray(i) Next i
В этом простом цикле For … Next используется переменная i, которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total.
В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение . Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.
For d = 0 To 10 Step 0.1 dTotal = dTotal + d Next d
Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.
Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:
For i = 10 To 1 Step -1 iArray(i) = i Next i
Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.
Цикл «For Each»
Цикл For Each похож на цикл For … Next, но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:
Dim wSheet As Worksheet For Each wSheet in Worksheets MsgBox "Найден лист: " & wSheet.Name Next wSheet
Оператор прерывания цикла «Exit For»
Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.
Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:
For i = 1 To 100 If dValues(i) = dVal Then IndexVal = i Exit For End If Next i
Цикл «Do While» в Visual Basic
Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:
'Процедура Sub выводит числа Фибоначчи, не превышающие 1000 Sub Fibonacci() Dim i As Integer 'счётчик для обозначения позиции элемента в последовательности Dim iFib As Integer 'хранит текущее значение последовательности Dim iFib_Next As Integer 'хранит следующее значение последовательности Dim iStep As Integer 'хранит размер следующего приращения 'инициализируем переменные i и iFib_Next i = 1 iFib_Next = 0 'цикл Do While будет выполняться до тех пор, пока значение 'текущего числа Фибоначчи не превысит 1000 Do While iFib_Next < 1000 If i = 1 Then 'особый случай для первого элемента последовательности iStep = 1 iFib = 0 Else 'сохраняем размер следующего приращения перед тем, как перезаписать 'текущее значение последовательности iStep = iFib iFib = iFib_Next End If 'выводим текущее число Фибоначчи в столбце A активного рабочего листа 'в строке с индексом i Cells(i, 1).Value = iFib 'вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub
В приведённом примере условие iFib_Next < 1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.
Другой способ реализовать цикл Do While – поместить условие не в начале, а в конце цикла. В этом случае цикл будет выполнен хотя бы раз, не зависимо от того, выполняется ли условие.
Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:
Do ... Loop While iFib_Next < 1000
Цикл «Do Until» в Visual Basic
Цикл Do Until очень похож на цикл Do While: блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:
iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'Значение текущей ячейки сохраняется в массиве dCellValues dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 Loop
В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until, следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.
Однако, как было показано в примерах цикла Do While, в некоторых ситуациях нужно, чтобы цикл был выполнен хотя бы один раз, не зависимо от первоначального результата условного выражения. В таком случае условное выражение нужно поместить в конце цикла, вот так:
Do ... Loop Until IsEmpty(Cells(iRow, 1))
Урок подготовлен для Вас командой сайта office-guru.ru
Источник: /> Перевел: Антон Андронов
Правила перепечаткиЕще больше уроков по Microsoft Excel
Оцените качество статьи. Нам важно ваше мнение:
Добрый день!
Неделю пытаюсь разобраться с макросами в Excel — выходит признаюсь честно плохо…
Решение задачи так и не нашла. Надеюсь вы сумеете мне подсказать куда конкретнее направить свою активность.
Задача передо мной стоит такая:
ячейка A1 содержит значение, которое я с помощью формул разбиваю на диапазон ячеек (задействовано 276 ячеек) целыми числами. Но при разбивке образуется дельта округления. Так вот мне необходимо эту дельту целыми числами доразнести в уже заполненные формулами ячейки например по порядку.
Например если дельта = 117, а диапазон 276, то в первые 117 ячеек прибавляем по 1, а остальные не трогаем.
Подскажите, пожалуйста, возможно ли вообще это описать для Excel?
A loop is an essential concept for any programming language, and VBA follows the same approach. You can use loops to repeat an action until a specified condition is reached, or move through objects in a group, e.g. all worksheets in a workbook. A loop is an essential concept for programming. In this guide, we’re going to show you how to create a VBA loop in Excel.
Download Workbook
VBA loops can be useful to automate tasks. For example, you may need to protect or unprotect every worksheet at once, iterate a calculation for a specific number of times, or loop cells and store their values into an array until you find an empty cell. The rest is up to your needs and imagination.
VBA has two main loop categories:
- For…Next Loops
- Do Loops
In generally, while For…Next loops are designed for specific amount of iterations, Do loops are good for iterating based on a condition. However, you can modify and configure both loop types by their individual keywords. Let’s see the loop types with examples.
For…Next VBA Loop
For…Next (also known as For) loops are where you start to create VBA loops in Excel. A For loop is a basic concept of a loop structure in all programming languages. A For…Next loop is good for if you want to iterate you code certain amount of times, and for when you need to use the counter. For example, if you want to check cells from A1 to A10, a counter clicks from 1 to 10 can work in that case. Let’s see its syntax and an example.
Syntax
For counter = start To end [ Step step ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
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 a specific number of times. |
Example 1 – Basic Form
In the first example of For…Next loop, we attempt to write serial numbers into the cells in A1:A10. In this code, For…Next loop sets values from 1 to 10 into the variable i. After the variable gets its value, you can use it in the code. We used the variable to specify the row numbers and cell values. Finally, the Next row increases the variable’s row by 1, and cycle goes on until the variable is equal to 11.
Sub FillSerialNumbers() Dim i As Integer For i = 1 To 10 ActiveSheet.Cells(i, 1) = i Next i End Sub
Example 2 – Step
By default, For…Next loop increases its counter variable by 1 for each loop. You can change this property by using the step argument. To specify a step argument, use the Step keyword after the end argument and enter a number. Step can be either a positive or negative.
The following code is a modified version of the first example. Step 2 argument is added to loop. In this loop, the variable i can only take «1, 3, 5, 7, 9» values.
Sub FillSerialNumbers_Step2() Dim i As Integer For i = 1 To 10 Step 2 ActiveSheet.Cells(i, 1) = i Next i End Sub
Remember to choose appropriate start and end arguments when you need to use a negative step value. For example, For I = 10 To 1 Step -1
Example 3 – Nested Loops
You can create loops within other loops. VBA executes all iterations in an inner loop, for each iteration of the outer loop. This type of structure can be helpful if you want add additional dimensions into your code. For example, while one loop is counting rows, other can count the columns. You need three loops to fill a three-dimensional data array.
The important point is using different counter variables for each loop. Otherwise, there will be leaps for the counter values. Let’s see an example for nested For…Next loops.
The following code contains 2 For…Next loops which is using variables named i and j. In the statement panel, i and j are used as row and column numbers respectively.
In the first run, i becomes 1 and j becomes 2. After code is executed in the j-loop, while i keeps its value (1), j becomes 3. This cycle goes on until j becomes 7. After this, i becomes 2 and j returns back to 2.
Sub FillSerialNumbers_Nested() Dim i As Integer, j As Integer For i = 1 To 10 For j = 2 To 6 ActiveSheet.Cells(i, j) = i * j Next j Next i End Sub
Since j gets numbers between 2 and 6, only columns from B to F are filled.
Example 4 – Exit For
You may want to exit a loop when a certain condition is met. Let’s say we do not want to fill cells if i * j is more than 18. To achieve this, we can use Exit For statement.
The following code uses Exit For in the inner loop. Please note that, Exit For works for only the loop it’s in. Thus, when i * j > 18 condition is met, VBA continues to run the outer loop (i-loop).
Sub FillSerialNumbers_ExitFor() Dim i As Integer, j As Integer For i = 1 To 10 For j = 2 To 6 If i * j > 18 Then Exit For ActiveSheet.Cells(i, j) = i * j Next j Next i End Sub
Example 5 — For Each
A For Each loop is a more specialized version of the For…Next loops. For Each loops can iterate for elements in a list. These elements can be values in an array, cells in a range, or worksheets in workbook. For Each loops doesn’t need a counter, each element is stored in a variable to be used in the code.
Let’s take another example. This time there isn’t a counter variable, but a range object c. For Each loop assigns each cell in the range «A1:C8» to element c, at each iteration. Also, since there is no counter value, we need to increase an integer by 1 in the code.
Sub FillSerialNumbers_ForEach() Dim c As Range, i As Integer i = 0 For Each c In ActiveSheet.Range("A1:C8") i = i + 1 c = i Next c End Sub
This is the last example for the For…Next loops of our how to create a VBA loop in Excel guide. Let’s now move on to the Do loops.
Do VBA Loop
A Do loop looks at whether a condition is met to continue cycling through, or stop a loop. Do loops are more flexible than For…Next loops. On the other hand, this flexibility comes with some complexities.
A Do loop starts with Do and finishes with Loop keywords. You can define a condition for one of these statements. If you specify a condition with Do, VBA looks at the condition first; otherwise, the code block in the loop is executed and the condition is evaluated at the end. This flexibility presents 2 syntaxes.
Also, Do loops can use While and Until keywords to specify the action when a condition is met. If you use the While keyword, the loop continues to work if condition is met. On the other hand, the Until keyword stops the loop.
Syntax
Do [{ While | Until } condition ]
[ statements ]
[ Exit Do ]
[ statements ]
Loop
Or, you can use this syntax:
Do
[ statements ]
[ Exit Do ]
[ statements ]
Loop [{ While | Until } condition ]
Part | Description |
condition | Optional. Numeric expression or string expression that is True or False. If condition is Null, condition is treated as False. |
statements | One or more statements that are repeated while, or until, condition is True. |
Example 1 – Do While
Do While loop iterates its statements as long as the specified conditions are valid. We can modify our first example to work with a Do loop.
In the following example, the Do loop works as many iterations as the variable i is equal or less than 10.
Sub FillSerialNumbers_DoWhile() Dim i As Integer i = 1 Do While i <= 10 ActiveSheet.Cells(i, 1) = i i = i + 1 Loop End Sub
Caution: If you use a loop like this, remember to add a code to change the value of the variable. Otherwise, the code will be stuck in an infinite loop because the variable i will always remain less than 10.
Example 2 — Do Until
This time the loop continues «until» the condition is met. Once it does, the loop ends.
Sub FillSerialNumbers_DoUntil() Dim i As Integer i = 1 Do Until i > 10 ActiveSheet.Cells(i, 1) = i i = i + 1 Loop End Sub
Example 3 – Loop While
You can use conditions after Loop as well. In this scenario, you ensure that the statements are executed at least once before condition validation.
Loop While iterates the loop if the supplied condition is met.
Sub FillSerialNumbers_DoLoopWhile() Dim i As Integer i = 1 Do ActiveSheet.Cells(i, 1) = i i = i + 1 Loop While i <= 10 End Sub
Example 4 – Loop Until
Use Loop Until statement when you need to check the condition after the statements, and want to continue the loop «until» the condition is met.
Sub FillSerialNumbers_DoLoopUntil() Dim i As Integer i = 1 Do ActiveSheet.Cells(i, 1) = i i = i + 1 Loop Until i > 10 End Sub
That’s all! You can now create your own VBA loop to automate your Excel tasks in no time.
Циклы в VBA Excel предназначены для повторения одного и того же блока операторов. Количество итераций может быть задано явно, зависеть от условия или количества элементов, содержащихся в обрабатываемом объекте.
Цикл For… Next
Цикл For… Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное счетчиком — специальной переменной цикла. После выполнения каждой итерации значение счетчика увеличивается или уменьшается на единицу или на число, указанное с помощью оператора Step. Предусмотрен принудительный выход из цикла с помощью оператора Exit For. Перейти к подробному описанию …
Цикл Do While… Loop
Цикл Do While… Loop в VBA Excel предназначен для повторения блока операторов до тех пор, пока выполняется заданное условие (возвращается значение True). Этот цикл позволяет проверять условие как до, так и после выполнения операторов. Предусмотрен принудительный выход из цикла с помощью оператора Exit Do. Перейти к подробному описанию …
Цикл While… Wend
Цикл While… Wend в VBA Excel предназначен для выполнения блока операторов до тех пор, пока выполняется заданное условие (возвращается значение True). Этот цикл позволяет проверять условие только до выполнения операторов. Принудительный выход из цикла с помощью оператора Exit Do не предусмотрен. Перейти к подробному описанию …
Цикл Do Until… Loop
Цикл Do Until… Loop в VBA Excel предназначен для повторения блока операторов пока не выполняется заданное условие (возвращается значение False). Этот цикл позволяет проверять условие как до, так и после выполнения операторов. Предусмотрен принудительный выход из цикла с помощью оператора Exit Do. Перейти к подробному описанию …
Цикл For Each… Next
Цикл For Each… Next в VBA Excel предназначен для выполнения блока операторов по отношению к каждому элементу из группы элементов (диапазон, массив, коллекция). Предусмотрен принудительный выход из цикла с помощью оператора Exit For. Перейти к подробному описанию …
Циклы в VBA
Смотрите также Long For i Then If shName столбце К чисто синтаксически?… или .Item(a(i, 1))) >: так ничего не Then c(i, 1)только ещё (кстати по большейSETT.PRICE нахожу наКак это сделать
ячейку?
- в конкретном квартале.
- напр AZ1 )
- + iStep i
значений для переменной-счётчика,Встречаются ситуации, когда от = 1 To
Оператор цикла «For» в Visual Basic
= «BPP» OriLastrow = .Cells(Rows.Count, где ещё?.. и 0 Then c(i, даёт, но хоть = FUTSEAT -ругается на End With половине нач данных листе ..С и в ExcelВ реальной задаче
Цикл «For … Next»
В принципе этоВ1=ЕСЛИ (A1<>C1;ТДАТА ();B1) = i + цикл программы VBA требуется 10 Step 2 shName = «ECP» 11).End(xlUp).Row он(макрос) путается… 1) = FUTSEAT без ошибок работает!…
.Item(a(i, 1)) Else: и на Next удалила с листов) кидаю на ..РПолосатый жираф алик
в столбце A1 я уже начинаюС1=ЕСЛИ (B1;A1) 1 Loop EndFor Each совершить несколько раз ActiveSheet.Range(«A» & i).Value Then Arr(i, 1)И еще вопрос:!! упс… перевложила — .Item(a(i, 1))надо в столбце N If (FUTSEAT - — в которые — листы с (по евре ЕС..: Да, ну! И будет 64 значения,
умничать и придираться,Столбец «В» - Subвыполняет набор действий подряд один и = i Next = FUTSEAT -Если вы делаете файл с модулем3 Else: If (FUTSEAT раскинуть цифры как .Item(a(i, 1))) < заворачиваю обработку листов… окончанием Р считаются и фунту ВР..)… без VBA можно в B1=32, C1=64, для решения данной имеет формат «Дата»
В приведённом примере условие для каждого объекта тот же набор i End Sub ArrStr(j, 1) ElseIf
цикл по листам в пост №17… — .Item(a(i, 1))) в столбце(последнем) ITM 0 Then c(i,(периодически пишет что по одной формуле, но его ещё обойтись. В А1 D1=16. проблемы можно вручную
Общий недостаток дляiFib_Next < 1000 из указанной группы действий (то есть
Balbasochka shName = «BPC»For n =ArrSeat- через k, ArrStr- < 0 Then
(ну с учётом 1) = 0 нет начала цикла листы с окончанием надо умножить на пишем начальное значение.Знаю, что на изменить диапазон массива,
Цикл «For Each»
всех всех циклическихпроверяется в начале объектов. В следующем повторить несколько раз: Добрый день! Or shName = 0 To UBound(ArrSh) через j, Arr c(i, 1) = условий-надо ли выводить End If End — как я ..С — по 1000 (это делаю В В1 - лист весь вывод что не так формул: цикла. Поэтому если
примере при помощи один и тотПомогите, пожалуйста, с «ECC» Then Arr(i, ‘запускаем цикл по через i
Оператор прерывания цикла «Exit For»
0 End If и что)… загвоздка If End If только не пыталась другой… цифра FUTSEAT(которая потом) чтобы использовать формулу (зависимость от не поместится, поэтому, долго,должны быть включены бы первое значение цикла же блок кода). формулой. 1) = 0 листам shName =ошибок вроде не End If End в цикле видимо… If shName = зациклить… листы… нужны futures seattle price*1000)
в расчётах… А1) -(это минус) либо буду использоватьно если в итерации.iFib_NextFor Each Это может бытьЕсть таблица с End If Exit ArrSh(i) With Sheets(shName)
выдаёт, но результата If If shName после такого With «BPP» Or shName именно эти, в разная для листоввобщем 3 варианта
Цикл «Do While» в Visual Basic
А1. Для большей в колонке A1 формулу еще заложитьно иногда, прибыло бы большевыполняется перечисление всех сделано при помощи определенной структурой. For End If то зачем внутри тоже не выдаёт… = «BPP» Or CreateObject(«Scripting.Dictionary») обязательно цикл = «ECP» Then
рабочем файле есть ЕС и ВР… пыталась придумать… а точности результат можно каждый раз по механизм просмотра массива запуске файла, интерация 1000, то цикл листов в текущей циклов VBA.Нужно определить для Next j Else: этого цикла идетJeyCi shName = «ECP» по листу указать?… If IsNumeric(a(i, 7)) и другие) столбец-условие, чтобы узнать,проблемы то с With, умножить на 1000. 2 значения (получится по определенному критерию, принимает значение по бы не выполнялся рабочей книге Excel:К циклам VBA относятся: каждой позиции подгруппу, Arr(i, 1) = проверка: да…, видимо, с Then If IsNumeric(a(i, или можно ДО Then If (.Item(a(i,Hugo что бросать/и надо то с Next Стоя в В1 как раз 65536), то это будет умолчанию ( т. ни разу.Dim wSheet AsЦикл For в которую она » » EndIf shName = номерами и яблоками 7)) Then If ЭТОГО цикл по 1)) — FUTSEAT): Тоже глянул файл ли/ — это
. (может с чем выбираем — Меню либо попрошу опять очень замечательно! :) е. выкл)Другой способ реализовать цикл Worksheet For EachЦикл Do While входит. Код уровня If ‘ не
«BPP» Or shName я погорячилась… номера (.Item(a(i, 1)) - листу указать?.. или > 0 Then — аж два options (call или ещё).. а может — Сервис - же здесь помощи,kim
и тогда машинаDo While wSheet in WorksheetsЦикл Do Until для наименования подгруппы
надо Next k = «ECP» Then — совсем не
Цикл «Do Until» в Visual Basic
FUTSEAT) > 0 2 раза (цикл c(i, 1) = раза. Что нужно put) seattle_bs - и с лексикой Подбор параметра. Ячейка чтобы реализовать переход: =ЕСЛИОШИБКА(ПРОСМОТР(2;1/((X2=$D$2:$W$2)*($D4:$W4<>»»));$D4:W4);»») начинает ругаться и– поместить условие MsgBox «Найден лист:Далее мы подробно рассмотрим всегда один и Next iJeyCi номера, а яблоки Then c(i, 1) в цикле)? .Item(a(i, 1)) - сделать — не столбец К не и с многоплановостью… уже высветится, результат
на другой листYurasha выскакивать сообщение о не в начале, » & wSheet.Name каждый из этих тот же, кодKuzmich
: потому что в в моих проблемах = .Item(a(i, 1))или 3 раза FUTSEAT Else If понял, нужно вникать от начала(а от уж больно много нужен 0, изменяя с помощью такого: Здравствуйте!
циклических ссылках. а в конце Next wSheet циклов. уровня для номенклатуры: В формулах для зависимости от названия не причём, похоже… — FUTSEAT Else (цикл в цикле)? (.Item(a(i, 1)) - — что сложно шапки)… ребята я условий надо вложить
значение в А1 макроса (вычитал на
Я здесь новичокПрийдется вручную включать
цикла. В этом
Оператор
Структура оператора цикла
office-guru.ru
Excel. Как в Excel сделать циклическую формулу? И будет ли «работать» формула?
тоже всегда один столбца ITM вы
листа — выбирается можно бы напрячься If (.Item(a(i, 1))For n =
FUTSEAT) < 0Но вот тут просто не расписываю,
др в др — ОК. Все. одном из форумов): и это мой
итерации.
случае цикл будетExit For
For и тот-же. Количество
проверяете =ЕСЛИ(ЕЧИСЛО(D84);ЕСЛИ(($K$4*1000-D84)>0;$K$4*1000-D84;0);»») 1 из 2х
поискать ключи для — FUTSEAT) < 0 To UBound(ArrSh) Then c(i, 1) (где словарь): что откуда куда
— может я
Макс пушкарев
200?’200px’:»+(this.scrollHeight+5)+’px’);»>set ws = activesheet первый пост.
Demetry выполнен хотя быприменяется для прерывания
в Visual Basic строк в каждой
столбец D на формул (что от большей убедительности макросу, 0 Then c(i, shName = ArrSh(i)
= 0 EndWith CreateObject(«Scripting.Dictionary») ‘данные и ПОЧЕМУ - что где недоглядела
: ну это делаетсяIf ws.cols.count =
Помогите пожалуйста составить: Насчет формулы как-то раз, не зависимо цикла. Как только может быть организована
подгруппе неопределенное, количество число, а в чего отнимается- (FUTSEAT
чтобы брал именно 1) = 0
With Sheets(shName) ‘??????????????? If End If
в массив With
просто специфика формул
или не так через VBA скорее 65… then цикл.
можно ли задать цикл в одной формуле?
не уверен, а от того, выполняется
в коде встречается
в одной из подгрупп тоже может макросе проверяете столбец от STRIKE) или то, что надо… End If End … With CreateObject(«Scripting.Dictionary») End If Next Sheets(shName) iLastrow = и расчётов и сказала в макросе?? васего! Alt+F11set ws =Думаю, что правильнее
функцию можно. Например, ли условие. этот оператор, программа двух форм: как отличаться. К. Где правда? (STRIKE от FUTSEAT)
но, кажется мне, If End If ‘ With Sheets(shName) End With ‘выгрузка .Cells(FR.Rows.Count, 1).End(xlUp).Row a файла такая - (хоть одном изКоличество повторений цикла
activeworkbook.sheets.add будет через макрос, такая:Схематично такой цикл
завершает выполнение цикла
циклИмеем:
Все три массиваЦитатаKuzmich пишет: Может
что не поможет Next End With ‘?????????????????????? iLastrow =
всего собранного массива = .Range(FR.Offset(1, 0), чтобы не усложнять них — чтобы связано с некоторыми
end if но, можно иFunction CYCLE(m_start As
Do While и переходит кFor … Next
Код уровня группы
ArrStr, ArrSeat и вам нужна последняя это макросу… подход
‘выгрузка всего собранного
.Cells(FR.Rows.Count, 1).End(xlUp).Row a Range(FR.Offset(1, 3), FR.Offset(lr, FR.Offset(lr, 7)).Value ‘в просто просчитала формулой
хоть какой-нибудь заработал)… условиями. В VBAБуду благодарен если через формулу. В Integer, m_end As
с проверяемым условием выполнению операторов, находящихсяили как цикл
| Наименование | Arr у вас строка в столбце словарей тут видимо массива Range(FR.Offset(1, 3), = .Range(FR.Offset(1, 0), 3)) = c словарь номера и в последнем столбце, может ваш светлый предусмотрено несколько разновидностей поможете реализовать идею, них, к сожалению,
Integer) в конце будет в коде сразуFor Each Подгруппа имеют одинаковую размерность, Кпоследняя из К не пройдёт
FR.Offset(lr, 3)) = FR.Offset(lr, 7)).Value … End If Next «яблоки» For i как надо считать, взгляд, чистый ум
циклов: и объяснить принцип
planetaexcel.ru
Построить формулу с циклом для перебора вариантов сочетаний. (Формулы/Formulas)
не силен, опытFor i =
выглядеть вот так: после данного цикла..
2 | Подгруппа поэтому,
или из Dподход массивов остаётся, c End If End With n With Application = 1 To НО если в и кристальная речьFor…Next действия конкретного макроса. нулевой. Похожие темы m_start To m_endDo … Loop
Это можно использовать,Цикл A |я думаю, не (по сути она
после всех внесённых
Next n WithJeyCi .ScreenUpdating = True UBound(a) .Item(a(i, 1))
столбце К -
смогут дать жизнь
For Each…Next
Прикрепил сам файл
читал на этомCYCLE = CYCLE While iFib_Next <
например, для поискаFor … Next1 | товар1
надо циклов по одна), но все подсказок…
Application .ScreenUpdating =: простите, где? .Calculation = xlCalculationAutomatic
= a(i, 7) слово САВ(пометила жёлтым) хоть кому-нибудь из
Do…Loop
с задачей, а форуме, есть очень + i
1000
определённого значения в
использует переменную, которая
|
i, j и
массивы будут браться
проблемой кажется число FUTSEAT
True .Calculation =
…(в каком из
.DisplayAlerts = True
Nextкак видите -
или пусто -
трёх вложенных??..
Также есть 2
то строки таблицы
похожие решения, ноNextЦикл массиве. Для этого последовательно принимает значения1 | товар2 k, достаточно одного.
от шапки, а
, которое пытаюсь задать,
xlCalculationAutomatic .DisplayAlerts = модулей?)… с ходу End With End
.Item(a(i, 1))берётся не то в столбцеЗаранее спасибо, если
вида циклических структур: съезжают… доработать их не
End FunctionDo Until при помощи цикла
из заданного диапазона. |Исправьте выгрузку
не от 1-ой…
а макрос не True End With не совсем нахожу SubНо что именно
у словаря, а итогов — тоже появится несколько минут,1. Циклы сСветлый могу, вседствие малоопытности.суммирует в циклеочень похож на просматривается каждый элемент С каждой сменой
1 | ………..FR.Offset(1, 3).Resize(UBound(Arr)) = напомнило мне это понимает и никак End Sub
JeyCi делает, и правильно у листа. оставлять пусто… чтобы хотя бы выставленным числом повторений: Макросы (VBA) в Итак… все целые в цикл массива. Как только значения переменной выполняются | Arr ‘выгружаем массив ту ситуацию (из
не считает, возможно...
JeyCi: упс, одной буквы
ли - неВообще эту задачу
3) Таким образом
прочитать в файле2. Циклы с другом разделе. Или…Требуется подобрать текстовые
диапазоне от m_startDo While искомый элемент найден, действия, заключённые в
2 | Подгруппа (ITM) полученный в знакомого вам макроса)If shName =
: постаралась подправить (см не хватает… SEATTLE_bs… знаю..
я когда-то уже
… просмотреть можно первый
о чём я…
неопределенным числом повторений переименуйте тему. сочетания содержимого ячеек, до m_end включительно.
: блок кода в
просматривать остальные нет теле цикла. Это
B | столбец N (отKuzmich «BPC» Or shName вложение) по логике sorryJeyCi
видел… И кажется лист: там в
sorry что многоJeyCi
А формульное решение но не всеalexfa88 теле цикла выполняется
необходимости – цикл
легко понять из
excelworld.ru
Как создать цикл перебирающий значения клеток в Excel?
1 | товар1 слова «EXERCISE»): iLastrow = .Cells(Rows.Count, = «ECC» Then
своих расчётов -
Set Rng =: , действительно, словарь фраза последнем столбце просчёты писанины там -: господа планетяне, мой Вашей задачи во возможные, а подчиняющиеся: Доброго времени суток! раз за разом прерывается. простого примера: |Цикл 11).End(xlUp).Row Set FUT = по вашему совету Range(«K1:K20») Set FR всегда пытаюсь делать’в словарь номера руками, которые надо но может там креатив довёл меня
вложенном файле. порядковому чередованию:
Есть следующая задача: до тех пор,Применение оператораFor i =1 | товар5For…NextArrStr = .Range(FR.Offset(1, .Range(«K1:K10»).Find(«SETT.PRICE») FUTSEAT = «как надо» (всегда = Rng.Find(«SEATTLE_bs») по вашим примерам
CyberForum.ru
Как сделать цикл в Excel
и «яблоки»моя? посчитать без доп какая-нибудь небольшая ошибка, до трёх макросов200?’200px’:»+(this.scrollHeight+5)+’px’);»>=СМЕЩ(A$1;ОТБР((СТРОКА()-1)/32/64/16);)&СМЕЩ(B$1;ОСТАТ(ОТБР((СТРОКА()-1)/64/16);32);)&СМЕЩ(C$1;ОСТАТ(ОТБР((СТРОКА()-1)/16);64);)&СМЕЩ(D$1;ОСТАТ(СТРОКА()-1;16);)A1+B1+C1+D1существует ряд предприятий, пока заданное условиеExit For 1 To 10 |используется когда необходимо -7), FR.Offset(iLastrow -
FUT.Offset(1, 0).Value * спасибо за дельный
PowerBoy (если надо)!… обычноHugo столбца макросом и которую если поправить, (с разных сторонИ универсальная:Дано: 4 столбца по которым в выполняется (результат условногопродемонстрировано в следующем Total = Total1 | …….. | повторить действия заранее FR.Row, -7)).Value ‘массив 1000 ‘если лист совет!)…: Module3 больше негде подсмотреть,
: Словарь работает без результат выкинуть в то макрос (любой!) одного вопроса)… и
Что такое циклы?
Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>=СМЕЩ(A$1;ОСТАТ(ОТБР((СТРОКА()-1)/СЧЁТЗ(B:B)/СЧЁТЗ(C:C)/СЧЁТЗ(D:D));СЧЁТЗ(A:A));)&СМЕЩ(B$1;ОСТАТ(ОТБР((СТРОКА()-1)/СЧЁТЗ(C:C)/СЧЁТЗ(D:D));СЧЁТЗ(B:B));)&СМЕЩ(C$1;ОСТАТ(ОТБР((СТРОКА()-1)/СЧЁТЗ(D:D));СЧЁТЗ(C:C));)&СМЕЩ(D$1;ОСТАТ(СТРОКА()-1;СЧЁТЗ(D:D));) с текстовыми значениями, начале квартала устанавливается выражения равен примере. Здесь цикл
+ iArray(i) Next
2 | Подгруппа
заданное кол-во раз.
страйков D столбец ..С задаём FUTSEAT*1000
но он (макрос)Hugo
кроме как на ошибок:
excelworld.ru
VBA Цикл(ы) в цикле(ах) и несколько (непростых) условий
столбец N, только заработает??.. или почему до отсутствия результатов…А эту формулу количество строк во лимит задолженности, потомTrue перебирает 100 записей
i С |ЦиклArrSeat = .Range(FR.Offset(1, число которое подставляется End With говорит: Вариант словаря - ваши светлые строки…Скрытый текст Sub надо при просчётах циклы и условия и наличия ошибок… можно протянуть по всех столбцах разное. в течение квартала). В следующей процедуре массива и сравниваетВ этом простом цикле
1 | товар1For…Nex 0), FR.Offset(iLastrow - далее в формулу
что without With уже что-то выводит:я вот и DictITM() Dim a,
посматривать на столбец сбоят и каквысказаться сложно - столбцам и получимПример: эти лимиты могутSub
каждую со значениемFor … Next |t имеет следующий синтаксис: FR.Row, 0)).Value ‘массив ElseIf shName = — всё таСкрытый текст Sub пыталась брать у c, lr As K (если он их привести в но нужен очень все 64*32*64*16 сочетаний:______________ пересматриваться, частота ипри помощи цикла переменной
используется переменная1 | товар2For i = Start условие K столбец «BPP» Or shName
же проблема с DictITM() Dim a, листа (!) - Long Dim i%, IsNumeric — то порядок? свежий взгляд -Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>=СМЕЩ($A$1;ОТБР(((СТРОКА()-1)+(СТОЛБЕЦ(A1)-1)*65536)/32/64/16);)&СМЕЩ($B$1;ОСТАТ(ОТБР(((СТРОКА()-1)+(СТОЛБЕЦ(A1)-1)*65536)/64/16);32);)&СМЕЩ($C$1;ОСТАТ(ОТБР(((СТРОКА()-1)+(СТОЛБЕЦ(A1)-1)*65536)/16);64);)&СМЕЩ($D$1;ОСТАТ(СТРОКА()-1;16);)| -|A1|B1|C1|D1| периодичность пересмотров не
Do UntildVali | To End [Step (значения CAB или = «ECP» Then циклом по листам…
c, lr As а по словарю j%, n%, shName$, считать по формуле,vikttur и я попробуюYurasha|——————- устанавливаются, т.е. могутизвлекаются значения из. Если совпадение найдено,, которая последовательно принимает
1 | ……… | StepSize] Not IsNumeric - FUTSEAT = .[K1].Value имхо… вложу Long Dim i%, просто посмотреть a(i, FUTSEAT As Long если получается >0,: Пока нет помощи, — в надежде: Спасибо большое, Светлый!!!|1 | A пересматривать часто в всех ячеек столбца то цикл прерывается: значения 1, 2,Надо получить://операторы// будут в новом * 1000 ‘еслиPowerBoy j%, n%, shName$, 7) — если
Dim Rng As то вставлять результат несколько надоедливых вопросов на ваши отзывчивыеВсе супер, работает! | 1| a| одном квартале, вAFor i = 3, … 10,Код уровня группыNext [i] массиве пустыми значениями) лист ..Р задаём: Все Ваши ошибки FUTSEAT As Long
он IsNumeric… то Range, FR As расчёта, если просто (модератор, сами понимаете, сердца… если вам Сейчас я попробую
X | другом квартале можетрабочего листа до 1 To 100 и для каждого | Наименование |
iKuzmich FUTSEAT*1000 число которое из-за плохого форматирования Dim Rng As брать для расчёта Range, SR As выразила макросу много должность вредная и хватит смелости не
разобрать принцип действия|2 | B обойтись вообще без тех пор, пока If dValues(i) = из этих значений
Подгруппа– численная переменная VBA: Вы задаете новый подставляется далее в
текста кода. Выравнивайте Range, FR As a(i, 1)) - Range Dim ArrStr условий и завернула приставучая): ругаться на 3 этих формул. «Универсальная»
| 2| b| пересмотров. в столбце не
dVal Then IndexVal выполняется код VBA,2 | Подгруппа (счетчик) массив
формулу End If условия и циклы Range, SR As или его отнимать As Variant Dim всё это в- три кода кода (вложенных) - решила эту задачу Y |Каким образом можно встретится пустая ячейка: = i Exit находящийся внутри цикла. A |StartReDim Arr(1 To(FUTSEAT As Long и все будет Range Dim ArrStr от FUTSEAT (для ArrSeat As Variant циклы (так пришлось)…
об одном и знаю что много на все 100|3 | C на определенный срезiRow = 1 For End If Таким образом, данный1 | товар1– численное выражение, определяет UBound(ArrSeat), 1 To изначально)… правильно ли хорошо видно. As Variant Dim листов ..С), или Dim ArrSh As а он ругается, том же или условий для каждого процентов. | _| c| (например на последний Do Until IsEmpty(Cells(iRow, Next i цикл суммирует элементы | A начальное значение для 1) ‘задаём массив так сказать кодом??..If Not FR ArrSeat As Variant FUTSEAT отнимать от Variant With Applicationто на Next, то есть желание несколько значения массива -Спасибо еще раз! Z | день квартала) в
1)) ‘Значение текущейЦикл массива1 | товар2 переменной выгрузки, куда просчитываем чтобы потом использовать Is Nothing ThenВот Dim ArrSh As него (для листов .ScreenUpdating = False на End With. разных вопросов решить это слишком напрягает Удачи!!! =)|4 | D одном столбце сразу ячейки сохраняется вDo WhileiArray | AEnd по формулам ниже FUTSEAT в формулах у этой конструкции Variant With Application ..Р)… FUTSEAT - ‘отключение обновление экрана то на If в одной теме? сам макрос… ноСветлый | _| d| подтянуть все самые массиве dCellValues dCellValues(iRow)выполняет блок кодав переменной1 | ………..– это также численное (и с учётом типа везде нету закрывающего .ScreenUpdating = False это фиолетовое число .Calculation = xlCalculationManual (может я Else- почти 70 пролистать их своим: Пожалуйста. _ |
последние пересмотренные лимиты? = Cells(iRow, 1).Value до тех пор,Total | A выражение, определяет конечное столбца-условий по-разному дляArr(i, 1) = Endif ‘отключение обновление экрана в файле *1000 ‘отключение пересчёт формулнеправильно синтаксисом выражаю)?… кБ информации - зорким оком, чтобы
Но тему всё-таки|5 | EПрилагаю файл, в iRow = iRow пока выполняется заданное.
2 | Подгруппа значение для переменной. листов ..С и
ArrStr(j, 1) -JeyCi .Calculation = xlCalculationManual … для листов вручную .DisplayAlerts =
вобщем буду искать, так ли нужен хоть что-нибудь заработало…
надо переименовать. Вместо | _| _| нем же есть + 1 Loop
условие. Далее приведёнВ приведённом выше примере B |Цикл по счетчику ..Р) ……….. но
FUTSEAT: For i = ‘отключение пересчёт формул ВР.. и ЕС.. False ‘отключение предупреждающих 20-30 строчек не такой объем дляпо сути хочу
«макрос с циклом» _ | предложение, какой именноВ приведённом выше примере пример процедуры шаг приращения цикла1 | товар1
выделяется ключевыми словами дальше у вас
или на 1000 1 To UBound(a) вручную .DisplayAlerts = — оно разное… сообщений End With получилось — т решения проблемы? 20-30 сделать ювелирно кратко: написать «формулу».——————— цикл нужно использовать, условие
Sub не указан, поэтому | B
For и Next. нет задания начального умножать в самой .Item(a(i, 1)) =
False ‘отключение предупреждающих на листе ЕСС
‘……………………………………… Set Rng к строчек мало? Вы
(хотя ТЗ многомерноеИ почитайте правила.Хочу в итоговой но, к сожалениюIsEmpty(Cells(iRow, 1)), в которой при для пошагового увеличения1 | товар5 После начального For значения i=1 и формуле? a(i, 7) Next сообщений End With не фиолетовое, но = ThisWorkbook.Sheets(«BPC»).Range(«k1:k10») Setпроблема тут, действительно, в ведь невольно заставляете моё)…Успехов! колонке получить массив не догадываюсь, какнаходится в начале помощи цикла переменной | B указывается имя переменной, изменения этого параметраили надо1) да кстати ‘……………………………………… Set Rng тоже на ячейку SR = Rng.Find(«SETT.PRICE») общей картине и помогающих тратить времяв столбец NDiSco данных: его реализовать в конструкцииDo Whilei1 | …….. данная переменная (i) для Arr(i,1) приset подправлю свой комментарий = ThisWorkbook.Sheets(«BPC»).Range(«k1:k10») Set вниз от SETT.PRICE, SR.Offset(1, 0).Copy ThisWorkbook.Sheets(«BPP»).[K1] структуре на просмотр этих — разложить как: Как создать цикл1 A1aX одной формуле.Do Untilвыводятся последовательно числаот 1 до | B будет счетчиком, после заполнении массиваFUTSEAT = .[K1].Value ( SR = Rng.Find(«SETT.PRICE») который нахожу методом Set Rng =… если найду то данных. в столбце U перебирающий значения клеток?2 A1aYПожалуйста, если есть, следовательно цикл будет Фибоначчи не превышающие 10 по умолчанию2 | Подгруппа знака равенства идётJeyCi * 1000?мои номера и яблоки SR.Offset(1, 0).Copy ThisWorkbook.Sheets(«BPP»).[K1] Find… имхо… ThisWorkbook.Sheets(«ECC»).Range(«k1:k10») Set SR тоже отпишусь… как-тоKuzmich просчитано руками - Например: A1,A2…A100?3 A1aZ какие либо варианты выполнен хотя бы 1000: используется приращение С | начальное значение счетчика,: но ведь массивчтобы уж точно): Set Rng =p.s. их сначала = Rng.Find(«SETT.PRICE») SR.Offset(1, так … а: Каждая конструкция If1) формулы разныеЧто-то вроде:4 A1bX — помогите пожалуйста, один раз, если’Процедура Sub выводит11 | товар1 а после ключевого заполняется значениями просчитанными увидев результат, поверить’ в словарь ThisWorkbook.Sheets(«ECC»).Range(«k1:k10») Set SR просто перекидываю на
0).Copy ThisWorkbook.Sheets(«ECP»).[K1] ‘………………………………………. может там и ……. Then должна для листов ..РSet myRange =5 A1bY буде очень благодарен! первая взятая ячейка
числа Фибоначчи, не. Однако, в некоторых | С слова To - по формуле… многовато что мы циклыseattle опционов = Rng.Find(«SETT.PRICE») SR.Offset(1, соотв. лист ..Р, ArrSh = Array(«BPC», условий и циклов заканчиваться End If и ..С ( ActiveSheet.Range(‘A1:A100’) For Each…Спасибо! не пуста. превышающие 1000 Sub случаях требуется использовать1 | товар2 конечное значение счетчика. условий, но Arr(i,1) правильно расставили… ??(столбец К) - 0).Copy ThisWorkbook.Sheets(«ECP»).[K1] ‘………………………………………. чтобы потом взять
«BPP», «ECC», «ECP») то можно подсократить (у вас нев 3-ем модуле я c In myRange.Cells12 A1dZGuestОднако, как было показано Fibonacci() Dim i
другие значения приращения | С По умолчанию счётчик
задаётся… т е
Kuzmich чтобы знать «считать, ArrSh = Array(«BPC», в расчёты на For n = на VBA - так) откомментировала логику ‘ … Next13 A2aX
: =ПРОСМОТР(9E+307;$D4:W4) в примерах цикла As Integer ‘счётчик для цикла. Это1 | ……… работает с шагом надо ещё как-то: JeyCi 0 или пусто
«BPP», «ECC», «ECP») листе (умножив на 0 To UBound(ArrSh)
не знаю- поэтомуIf shName =… на остальные cНет, это не…GuestDo While для обозначения позиции можно сделать при | С
равным единице. Можно обернуть это всёВ модуле3 .Range(FR.Offset(1, ставить» и
For n = 1000)… ну, и shName = ArrSh(i) пришлось обратиться за «BPC» Or меня не хватило) подходит. Он просто24 A2dZ: ., в некоторых ситуациях элемента в последовательности помощи ключевого словаЯ попробовала через задавать другое значение в счётчик -7), FR.Offset(lr, -7)).Valueстрайки 0 To UBound(ArrSh) всё в цикл(ы) ‘With Sheets(shName) If помощью… но по
shName =2) при этом работает с выделеным25 B1aXalexfa88 нужно, чтобы цикл Dim iFib AsStep=ЕСЛИ(И(A37=1;СМЕЩ(A37;-1;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-1;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-2;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-2;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-3;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-3;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-4;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-4;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-5;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-5;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-6;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-6;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-7;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-7;1;1);1);»»))))))) (StepSize), на котороеFor i=1 To Ubound(Arr)…
= ArrStr ‘массив(столбец D) - shName = ArrSh(n) и с условиями shName = «BPC»
логике условия как»ECC» Then результаты надо закинуть диапазоном. А мне
…: Спасибо! все отлично был выполнен хотя
Integer ‘хранит текущее, как показано в
Но строк может будет изменяться «i», Next i
страйков D столбец которые в формулу(ы) If shName =PowerBoy Or shName = описала выше -The_Prist в столбец N нужно чтобы он… работает! бы один раз, значение последовательности Dim следующем простом примере. быть очень много… включая необязательное ключевое?? … а.Range(FR.Offset(1, 0), FR.Offset(lr,2) добавила в «BPC» Or shName: Условия надо писать «ECC» Then Set однозначно такие -: Не совсем так. в зависимости проверял условие в120 E2dZне знал про не зависимо от iFib_Next As IntegerFor d = можно задать какой-то слово Step. При ведь идея-то ваша 0)).Value = ArrSeat Dim FUT As = «ECC» Then так: FUT = Range(«K1:K10»).Find(«SETT.PRICE») на VBA ищу Прочитайте хотя быот столбца K каждой строке отКонец. эту функцию, ВПР, первоначального результата условного ‘хранит следующее значение 0 To 10 цикл? Если ЛОЖЬ, включении ключевого слова — ооочень справедливое ‘массив условие K Range… видимо когда-то Set FUT =было FUTSEAT = FUT.Offset(1, способ правильно оформить… справку. Если в( 1 до 100.НуДля упрощения решения ГПР, ИНДЕКС и выражения. В таком последовательности Dim iStep Step 0.1 dTotal то минус 1 Step необходимо задавать замечание :!: столбец (значения CAB по ошибке удалила(когда Sheets(shName).Range(«K1:K10»).Find(«SETT.PRICE») FUTSEAT =If shName = 0).Value ElseIf shName имхо… блоке не предусматриваетсяесли CAB или пусто так какие проблемы, могу предложить добавить ПОИСКПОЗ использую давно,а случае условное выражение As Integer ‘хранит = dTotal + строка к предыдущему значение для изменениятеперь хоть я или Not IsNumeric правила код)… FUT.Offset(1, 0).Value ElseIf «BPP» Or «ECP» = «BPP» OrJeyCi использование Else, то- то ничего, вставь проверку условия в каждый исходный эту не знал нужно поместить в размер следующего приращения d Next d и т.д. переменной «i». правильно вкладываю все — будут в3) в формулах shName = «BPP» Then Arr(i, 1) shName = «ECP»: , — спасибо допускается запись весли число в том цикле, столбец количество символов
а в синтаксисе конце цикла, вот ‘инициализируем переменные iТак как в приведённомVBA совсем неПример №1:условия в условия новом массиве пустыми
везде добавила: умножение Or shName = = ArrStr(j, 1) Then FUTSEAT = большое! что не одну строку:, то считать по
который написал Comanche. для равного значения 9Е+307 — что так: и iFib_Next i выше примере задан знаю. Помогите, пожалуйста!
В нижеуказанном примере,обернув правильными строчками значениями) FUTSEAT на 1000… «ECP» Then FUTSEAT
— FUTSEAT Else: [K1].Value End If испугались посмотреть наIf 1>0 Then столбцу D и
А если не строк в каждом означает?Do … Loop = 1 iFib_Next
шаг приращения равный_Boroda_ на активном листе, и синтаксисом? …не определена переменная lr хотя можно и = [K1].Value End If shName = Set Rng =
файл Msgbox «Один больше одной цифре (которую подходит то опиши столбце:
справку прочитал, но Until IsEmpty(Cells(iRow, 1)) = 0 ‘цикл0.1: Так пойдет? по ячейкам А1:А10 правильно ли я и , каккогда задаём FUTSEAT= If Set Rng «BPC» Or «ECC»
Range(«K1:K20») Set FR- respect … нуля»
беру с листа задачу, может какие| | A1|B1|C1|D1| все равно медленно
Урок подготовлен для Вас Do While будет, то переменная=ЕСЛИ(A20=2;ПСТР(B20;11;99);C19) проставляется значение от мыслю в этом мне кажется, должнаэто сделать(*1000)… = Sheets(shName).Range(«K1:K20») Set Then Arr(i, 1)
= Rng.Find(«SETTLE_bs») If и за квалифицированныеТак что код …С и кидаю другие варианты есть.Почти|——————- пока что доходит командой сайта office-guru.ru выполняться до техdTotal
Или так (если одного до десяти. куске? (под спойлером)… быть точка передкажется, что он у FR = Rng.Find(«SEATTLE_bs»)
= 0 End Not FR Is советы!.. буду искать
в файле рабочий, на лист ..Р получилось, он пербирает|1 | AСпасибо!Источник: http://www.excelfunctions.net/VBA-Loops.html пор, пока значениедля каждого повторения с пропусками)Sub example1 ()подправила Range меня именно это If Not FR Ifнадо Nothing Then With загвоздку… только ещё как я полагаю.
изначально, чтобы на значения, Но у | 1| a|GuestПеревел: Антон Андронов ‘текущего числа Фибоначчи цикла принимает значенияКод=ЕСЛИ(A20=2;»»;ЕСЛИ(A19=2;ПСТР(B19;11;99);D19))
Dim i AsСкрытый текст ReDimJeyCi: вот пробую вот и не понимает… Is Nothing ThenIf shName = CreateObject(«Scripting.Dictionary») ‘данные в одна неуверенность у Синтаксически, по крайней листе всё было меня следубщая задача: X |: Если больше нравитсяАвтор: Антон Андронов не превысит 1000 0.0, 0.1, 0.2,Balbasochka Long For i Arr(1 To UBound(ArrSeat),
так поэтому и считает With CreateObject(«Scripting.Dictionary») ‘данные «BPP» Or «ECP» массив With Sheets(shName) меня есть -
мере. под рукой…)Есть клетка A1,
|2 | B ГПР, то:Ampersand
Do While iFib_Next 0.3, … 9.9,: Не работает, возможно = 1 To
1 To 1)lr = Cells(FR.Rows.Count, не совсем то в массив With
Then Arr(i, 1) iLastrow = .Cells(FR.Rows.Count,
можно ли вотJeyCiпрохожусь циклом D1 и E1.
| 2| b|=ГПР(9E+307;$D4:W4;1): ЦИКЛИЧЕСКИЕ ФОРМУЛЫ < 1000 If 10.0. я описала в 10 ActiveSheet.Range(«A» & For i =
FR.Column).End(xlUp).Row ‘?????? .Range(FR.Offset(1,p.s. что-то странное Sheets(shName) lr = = ArrStr(j, 1) 1).End(xlUp).Row a =
так прямым текстом: 1) 3 кода
по листамЕсли значение A1 Y |9E+307 — максимальноЧтобы формулы работали i = 1Для определения шага цикла тексте не очень i).Value = i 1 To UBound(Arr)
-7), FR.Offset(lr, -7)).Value пока что в
.Cells(.Rows.Count, 1).End(xlUp).Row a — FUTSEAT ElseIf .Range(FR.Offset(1, 0), FR.Offset(lr, использовать значения массива
об одном изаданным (в оригинальном
Как сделать?For i|3 | C возможное (ну или в цикле - Then ‘особый случай
в VBA можно точно. Next i End
‘ ненадо For = ArrStr .Range(FR.Offset(1,
результатах… покручу код
= .Range(FR.Offset(1, 0), shName = «BPC»
7)).Value End With в формуле том же сейчас файле имею и = 1 To | $| c| почти максимально) число должны быть включены
для первого элемента использовать отрицательную величину,В ячейку C
Sub k = 1 0), FR.Offset(lr, 0)).ValueJeyCi: я кстати это FR.Offset(lr, 7)).Value End Or «ECC» Then ‘в словарь номераIf ArrStr(j) > -2 попытки завернуть
др листы)… 100 If Cells(i, Z | в Excel. итерации. последовательности iStep = например, вот так: нужно проставить значениеПример №2: To UBound(ArrSeat) If = ArrSeat ReDim и попыталась сделать With ‘в словарь
Arr(i, 1) = и «яблоки» For FUTSEAT * 1000
через массив ии в зависимости 1) < 10|4 | D
не найдя данноеЯчейка выполняет действия 1 iFib =For i = из столбца BВ следующем примере IsNumeric(ArrSeat(k, 1)) Then Arr(1 To UBound(ArrSeat),
в новом вложенном файле номера и «яблоки» 0 End If
i = 1 Then Arr(j) = 1 попытка разглядеть от названия листа Then Cells(i, 4) | $| d| число, или число со своими же 0 Else ‘сохраняем 10 To 1 и его надо скрываются первый и For j = 1 To 1)… (для модуля 3)
For i =Hugo To UBound(a) .Item(a(i, ArrStr(j) — FUTSEAT и просчитать то применяю = Cells(i, 1) $ | больше данного, формула значеними размер следующего приращения Step -1 iArray(i) найти снизу вверх. второй листы книги. 1 To UBound(ArrStr)
‘ ошибка Typeа про End 1 To UBound(a): А не так 1)) = a(i, * 1000 Else что надо черезту Else Cells(i, 5)
|5 | E возвращает значение изВ ячейку D2 перед тем, как = i NextЕсли была бы Sub example2 () ‘STRIKE-FUTSEAT=ITM PUT If mismatch If — я .Item(a(i, 1)) = ли нужно: 7) Next ‘пустой Arr(j) = 0?? словарь… надо чтобы(FUTSEAT-arr(столбца D)) для = Cells(i, 1) | $| $| последней заполненной ячейки вволите значение и перезаписать ‘текущее значение i другая структура файла Dim i As ArrStr(j, 1) >Redim — ‘ почему-то верю в a(i, 7) NextIf shName = массив для результатаили из словаря заработал хоть один!.. листа ..С End If Next $ |alexfa88 ячейка A2 сама последовательности iStep =Здесь шаг приращения равен можно было бы Long For i FUTSEAT Then If ошибка Type mismatch… пост №4… если ‘пустой массив для
«BPP» Or shName ReDim c(1 To брать в расчёты господа светлые головы
или иную i———————: есть правда один
себя пересчитывает iFib iFib =-1 ВПР использовать с = 1 To
shName = «BPP»a lr - у меня проблема результата ReDim c(1
= «ECP» Then
UBound(a), 1 To таким макаром: — чтобы у(arr(столбца D)-FUTSEAT) дляЗадача есть 2 формулы
planetaexcel.ru
Цикл For…Next
Впоследствии я смогу нюанс:B2=ABS(B2-D2) iFib_Next End If, поэтому переменная
незакрепленным диапазоном. 2 Sheets(i).Visible = Or shName =
так правильно задать? с To UBound(a), 1
я так в
1) ‘из словаря
Else: If (FUTSEAT вас выбор был листа ..Р
1 в первую удалить из итоговойесли в одномВ ячейку А1
‘выводим текущее число iBalbasochka False Next i
«ECP» Then Arr(i, помню я задавалиEnd With To 1) ‘из коде исправил - в массив c — .Item(a(i, 1)))-формулу подставляется число X. ячейки результаты, содержащие квартале лимит не вводим любую информацию Фибоначчи в столбцес каждым повторением: Ух-ты, ух-ты! А End Sub 1) = ArrStr(j, мы как-то lastColumn… имхо… но на словаря в массив но он правда (c расчётами по < 0 Then
в каком коде лучше
… подглядывая на В конце расчёта символы «$». устанавливался вовсе (такоеАвтоматически в В1
A активного рабочего цикла принимает значения у Вас работает!Пример №3: 1) — FUTSEATRAN всякий случай поставила c (c расчётами вообще до этих
ходу) For i c(i, 1) = понятна логика, тотстолбец К (условие получаем число XИ сразу вопрос: тоже может быть), зафиксируется время листа ‘в строке 10, 9, 8,Сейчас попробую.
Рассмотрим вариант цикла ElseIf shName =: — в конце… по ходу) For проверок не доходит, = 1 To 0?? и посмотрите please- не участвует но другое. Теперь можно ли создать но при этомИнтересное решение предложил
excelworld.ru
Цикл в формуле — проверка условий и подстановка значений (Формулы/Formulas)
с индексом i … 1.
Боже…какая она красивая с Step (шагом)
«BPC» Or shNameKuzmich
может я размерность i = 1 т.к вот тут UBound(a) If shNamep.s.и нужно ли- может какие в расчёте, а надо подставить это такой макрос, который лимит был в Michael_S Cells(i, 1).Value =Цикл и простая! Как
через одну ячейку,
= «ECC» Then: JeyCi, Вы лучше массивов неверно задала
To UBound(a) If ничего не находится:
= «BPC» Or двоеточие после Else
ремарки найдутся- комменты см If IsNumeric)…
число в начало не будет зависеть
предыдущем квартале, тоНо этот способ
iFib ‘вычисляем следующееFor Each
же мозг так в данном случае
Arr(i, 1) =
напишите словами, какую там как-то? в
shName = «BPC»Set Rng =
shName = «ECC» (vba сам поставил)…
сделала только для
иначе в новом
и так до от фиксированного числа =ПРОСМОТР(9E+307;$D4:W4) вытянет просто
требует дополнителный столбец число Фибоначчи и
похож на цикл заточен? Короткие запросы…красотища!
будут заполнены ячейки 0 End If
строку вы хотите циклах
Or shName = Range(«K1:K20») Set FR
Then If IsNumeric(a(i,иногда ругался на
3-го… но по массиве пустое значение
тех пор пока строк в столбце,
самое последнее значение (который можно закрыть
увеличиваем индекс позицииFor … Next
А мой мозг через одну (А1,А3,А5,А7,А9).
Exit For ‘FUTSEAT-STRIKE=ITM найти этим выражением?
For k = 1 "ECC" Then If
= Rng.Find(«SETTLE_bs»)далее не 7)) Then If End If - сути: (п3) ставлю… верхнее и нижнее а будет запускать
из всего массива, или расположить на
элемента на 1, но вместо того,
куда-то пошел...в какие-то
Sub example3 () CALL ElseIf ArrStr(j,
Может вам нужна
To UBound(ArrSeat) IsNumeric(a(i, 7)) Then вникал, некогда… (FUTSEAT — .Item(a(i, поэтому и убрала
2) 70кБ -при этом значения X не очередной цикл, когда а не то
«далеких » адресах. iFib_Next = iFib чтобы перебирать последовательность дебри… Dim i As
1) < FUTSEAT последняя строка ви им подобных,
If (FUTSEAT -
JeyCi 1))) > 0 там где ругался… для максимальной реальностиизначально совпадут. «наткнется» на пустую
excelworld.ru
что было именно
На чтение 13 мин. Просмотров 26.6k.
Рамакришна, Источники индийской мудрости
Сейчас … мы идем по кругу
Эта статья содержит полное руководство по VBA Do While и VBA While Loops. (Если вы ищете информацию о циклах VBA For и For Each, перейдите сюда)
Цикл VBA While существует, чтобы сделать его совместимым со старым кодом. Однако Microsoft рекомендует использовать цикл Do Loop, поскольку он более «структурирован и гибок». Оба этих цикла рассматриваются в этом посте.
Для быстрого ознакомления с этими циклами перейдите к таблице быстрого руководства ниже.
Если вы ищете что-то конкретное, вы можете посмотреть содержание ниже.
Содержание
- Краткое руководство по VBA While Loops
- Введение
- Цикл For против цикла Do While
- Условия
- Формат цикла Do
- Цикл Exit Do
- While Wend
- Бесконечный цикл
- Использование функций Worksheet вместо циклов
- Резюме
Краткое руководство по VBA While Loops
Формат цикла | Описание | Пример |
Do While … Loop | Запускается 0 или более раз, пока условие выполняется | Do While result = «Верно» Loop |
Do … Loop While | Запускается 1 или более раз, пока условие выполняется | Do Loop While result = «Верно» |
Do Until … Loop | Запускается 0 или более раз, пока условие не будет выполнено | Do Until result <> «Верно» Loop |
Do … Until Loop | Запускается 1 или более раз, пока условие не будет выполнено | Do Loop Until result <> «Верно» |
While … Wend R |
Запускается 0 или более раз, пока условие истинно. Примечание: этот цикл считается устаревшим. |
While result = «Верно» Wend |
Exit the Do Loop | Завершает Do | Do While i < 10 i = GetTotal If i < 0 Then Exit Do End If Loop |
Введение
Если вы никогда ранее не использовали циклы, тогда вы можете прочитать «Что такое циклы и зачем они вам нужны» из моего поста в журнале For Loop.
Я собираюсь сосредоточиться в основном на Do Loop в этой статье. Как я упоминал выше, мы видели, что цикл While Wend считается устаревшим. Для полноты информации я все равно его включил в эту статью.
Итак, во-первых, зачем нам нужны циклы Do While, когда у нас уже есть циклы For?
Цикл For против цикла Do While
Когда мы используем цикл For Loop, мы заранее знаем, сколько раз мы хотим его запустить. Например, мы можем захотеть запустить цикл один раз для каждого элемента в коллекции, массиве или словаре.
В следующем примере кода мы видим в начале каждого цикла, сколько раз он будет выполняться.
' запускается 5 раз For i = 1 To 5 ' запускается один раз для каждого элемента коллекции For i = 1 To coll.Count ' запускается один раз для каждого элемента в arr For i = LBound(arr) To coll.lbound(arr) ' запускается один раз для каждого значения от 1 до значения в lastRow For i = 1 To lastRow ' запускается один раз для каждого элемента в коллекции For Each s In coll
Цикл Do другой. Он работает:
- В то время как условие верно
- Пока условие не будет выполнено
Другими словами, количество циклов в большинстве случаев не имеет значения.
Итак, что такое условие и как мы их используем?
Условия
Условие — это утверждение, которое оценивается как истинное или ложное. Они в основном используются с операторами Loops и If. При создании условия вы используете такие знаки, как >, <, <>,> =, =.
Ниже приведены примеры условий
Условие | Истина, когда… |
x < 5 | x меньше 5 |
x <= 5 | x меньше либо равен 5 |
x > 5 | x больше 5 |
x >= 5 | x больше либо равен 5 |
x = 5 | x равен 5 |
x <> 5 | x не равен 5 |
x > 5 And x < 10 | x больше 5 И меньше 10 |
x = 2 Or x >10 | x равен 2 ИЛИ больше 10 |
Range(«A1») = «Иван» | Ячейка A1 содержит текст «Иван» |
Range(«A1») <> «Иван» | Ячейка A1 не содержит текст «Иван» |
Вы могли заметить x = 5 как условие. Его следует путать с х = 5, при использовании в качестве назначения.
Например
' означает: значение 6 будет храниться в х x = 6 ' означает: х равен 6? If x = 6 ' означает: х равен 6? Do While x = 6
В следующей таблице показано, как «=» используется в условиях и назначениях.
Использование «=» | Тип | Имеется в виду |
Loop Until x = 5 | Условие | x равен 5? |
Do While x = 5 | Условие | x равен 5? |
If x = 5 Then | Условие | x равен 5? |
For x = 1 To 5 | Присваивание | Установите значение x = 1, затем = 2 и т.д. |
x = 5 | Присваивание | Установите значение x=5 |
b = 6 = 5 | Присваивание и условие |
Присвойте b результату условия 6 = 5 |
x = MyFunc(5,6) | Присваивание | Присвойте х значение, возвращаемое функцией |
Формат цикла Do
Цикл Do можно использовать четырьмя способами, и это часто вызывает путаницу. Однако в каждом из этих четырех способов есть только небольшая разница.
Do всегда в начале первой строки, а Loop всегда в конце последней строки.
Мы можем добавить условие после любой строки.
Do [условие] Loop Do Loop [условие]
Условию предшествует While или Until, которое дает нам эти четыре возможности
Do While [условие] Loop Do Until [условие] Loop Do Loop While [условие] Do Loop Until [условие]
Давайте посмотрим на некоторые примеры, чтобы прояснить это.
Примеры цикла Do
Представьте, что вы хотите, чтобы пользователь ввел список элементов. Каждый раз, когда пользователь вводит элемент, вы печатаете его в «Immediate Window». Когда пользователь вводит пустую строку, вы хотите, чтобы приложение закрывалось.
В этом случае цикл For не подойдет, поскольку вы не знаете, сколько элементов будет вводить пользователь. Пользователь может ввести пустую строку первым или с сотой попытки. Для этого типа сценария вы бы использовали цикл Do.
Следующий код показывает это
Dim sCommand As String Do ' Получить пользовательский ввод sCommand = InputBox("Пожалуйста, введите элемент") ' Печать в Immediate Window (Ctrl + G для просмотра) Debug.Print sCommand Loop While sCommand <> ""
Код входит в цикл и продолжается до тех пор, пока не достигнет строки «Loop While». На этом этапе он проверяет, оценивается ли условие как истинное или ложное.
Если условие оценивается как ложное, то код выходит из цикла и продолжается.
Если условие оценивается как истинное, то код возвращается к строке Do и снова проходит через цикл.
Разница между наличием условия на линии Do и на линии Loop очень проста.
Когда условие находится в строке Do, цикл может вообще не работать. Так что он будет работать ноль или более раз.
Когда условие находится на линии Loop, цикл всегда будет запущен хотя бы один раз. Так что он будет запущен один или несколько раз.
В нашем последнем примере условие находится в строке Loop, потому что мы всегда хотим получить хотя бы одно значение от пользователя. В следующем примере мы используем обе версии цикла. Цикл будет выполняться, пока пользователь не введет букву «н».
Sub GetInput() Dim sCommand As String ' Условие в начале Do While sCommand <> "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 1") Loop ' Условие в конце Do sCommand = InputBox("Пожалуйста, введите элемент для цикла 2") Loop While sCommand <> "н" End Sub
В приведенном выше примере оба цикла будут вести себя одинаково.
Однако, если мы установим для sCommand значение «н» до запуска цикла «Do While», код не войдет в цикл.
Sub GetInput2() Dim sCommand As String sCommand = "н" ' Цикл не будет работать, поскольку команда "н" Do Whilel sCommand <> "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 1") Loop ' Цикл все равно будет запущен хотя бы один раз Do sCommand = InputBox("Пожалуйста, введите элемент для цикла 2") Loop While sCommand <> "н" End Sub
Второй цикл в вышеприведенном примере (то есть Loop While) всегда будет запускаться хотя бы один раз.
While против Until
При использовании Do Loop условию должно предшествовать Until или While.
Until и While, по сути, противоположны друг другу. Они используются в VBA аналогично тому, как они используются в английском языке.
Например:
- Оставьте одежду, пока не пойдет дождь
- Оставь одежду, пока не идет дождь
Другой пример:
- Оставайся в постели, пока не станет светло
- Оставайся в постели, пока темно
Еще один пример:
- повторять, пока число не станет больше или равно десяти
- повторить пока счет меньше десяти
Как видите, использование Until и While — это просто противоположный способ написания одного и того же условия.
Примеры Until и While
Следующий код показывает циклы «While» и «Until» рядом. Как видите, единственная разница в том, что условие полностью изменено.
Примечание: знаки <> означают «не равно».
Sub GetInput() Dim sCommand As String ' Условие в начале Do Until sCommand = "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 1") Loop Do While sCommand <> "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 1") Loop ' Условие в конце Do sCommand = InputBox("Пожалуйста, введите элемент для цикла 2") Loop Until sCommand = "н" Do sCommand = InputBox("Пожалуйста, введите элемент для цикла 2") Loop While sCommand <> "н" End Sub
- Первый цикл: запускается только в том случае, если sCommand не равен ‘н’.
- Второй цикл: запускается только в том случае, если sCommand не равен ‘н’.
- Третий цикл: будет запущен хотя бы один раз перед проверкой sCommand.
- Четвертый цикл: будет запущен хотя бы один раз перед проверкой sCommand.
Пример: проверка объектов
Примером использования Until и While является проверка объектов. Когда объект не был назначен, он имеет значение Nothing.
Поэтому, когда мы объявляем переменную книги в следующем примере, она имеет значение Nothing, пока мы не назначим ее Workbook.
Противоположностью Nothing не является Nothing, что может сбить с толку.
Представьте, что у нас есть две функции: GetFirstWorkbook и GetNextWorkbook, которые возвращают некоторые объекты книги. Код будет печатать имя рабочей книги до тех пор, пока функции больше не вернут действительную рабочую книгу.
Вы можете увидеть пример кода здесь:
Dim wrk As Workbook Set wrk = GetFirstWorkbook() Do Until wrk Is Nothing Debug.Print wrk.Name Set wrk = GetNextWorkbook() Loop
Написание этого кода с использованием Do While было бы более запутанным, так как условие Not Is Nothing
Dim wrk As Workbook Set wrk = GetFirstWorkbook() Do While Not wrk Is Nothing Debug.Print wrk.Name Set wrk = GetNextWorkbook() Loop
Это делает код более понятным, и наличие четких условий — всегда хорошо. Честно говоря, разница маленькая, и выбор между «While» и «Until» действительно сводится к личному выбору.
Цикл Exit Do
Мы можем выйти из любого цикла Do с помощью оператора Exit Do.
Следующий код показывает пример использования Exit Do
Do While i < 1000 If Cells(i,1) = "Найдено" Then Exit Do End If i = i + 1 Loop
В этом случае мы выходим из цикла Do Loop, если ячейка содержит текст «Найдено».
While Wend
Этот цикл в VBA, чтобы сделать его совместимым со старым кодом. Microsoft рекомендует использовать циклы Do, поскольку они более структурированы.
Из MSDN: «Оператор Do… Loop обеспечивает более структурированный и гибкий способ выполнения циклов».
Формат цикла VBA While Wend
Цикл VBA While имеет следующий формат:
While <Условие>
Wend
While Wend против Do
Разница между циклами VBA While и VBA Do заключается в следующем:
- While может иметь условие только в начале цикла.
- While не имеет версии Until.
- Не существует оператора для выхода из цикла While, как Exit For или Exit Do.
Условие для цикла VBA While такое же, как и для цикла VBA Do While. Два цикла в приведенном ниже коде работают точно так же.
Sub GetInput() Dim sCommand As String Do While sCommand <> "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 1") Loop While sCommand <> "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 2") Wend End Sub
Бесконечный цикл
Даже если вы никогда не писали код в своей жизни, я уверен, что вы слышали фразу «Бесконечный цикл». Это цикл, в котором условие никогда не будет выполнено. Обычно это происходит, когда вы забыли обновить счетчик.
Следующий код показывает бесконечный цикл
Dim cnt As Long cnt = 1 'это бесконечный цикл Do While cnt <> 5 Loop
В этом примере cnt установлен в 1, но он никогда не обновляется. Поэтому условие никогда не будет выполнено — cnt всегда будет меньше 5.
В следующем коде cnt обновляется каждый раз, поэтому условие будет выполнено.
Dim cnt As Long cnt = 1 Do While cnt <> 5 cnt = cnt + 1 Loop
Как вы можете видеть, использование For Loop безопаснее для подсчета, поскольку оно автоматически обновляет счет в цикле. Ниже приведен тот же цикл с использованием For.
Dim i As Long For i = 1 To 4 Next i
Это явно лучший способ сделать это. Цикл For устанавливает начальное значение, условие и счет в одну строку.
Конечно, можно использовать бесконечный цикл, используя For — это потребует немного больше усилий 🙂
Dim i As Long ' Бесконечный цикл For i = 1 To 4 ' i никогда не достигнет 4 i = 1 Next i
Работа с бесконечным циклом
Когда у вас бесконечный цикл — VBA не выдаст ошибку. Ваш код будет продолжать работать, а редактор Visual Basic не будет отвечать.
Раньше вы могли выйти из цикла, просто нажав Ctrl и Break. В настоящее время разные ноутбуки используют разные комбинации клавиш. Полезно знать, как это настроено в вашем ноутбуке, чтобы в случае возникновения бесконечного цикла вы могли легко остановить код.
Вы также можете выйти из цикла, убив процесс. Нажмите Ctrl + Shift + Esc. На вкладке Процессы найдите Excel / Microsoft Excel. Щелкните правой кнопкой мыши по этому и выберите «Завершить процесс». Это закроет Excel, и вы можете потерять часть работы — так что гораздо лучше использовать Ctrl + Break или его эквивалент.
Использование функций Worksheet вместо циклов
Иногда вы можете использовать функцию листа вместо цикла.
Например, представьте, что вы хотите добавить значения в список ячеек. Вы можете сделать это с помощью цикла, но было бы более эффективно использовать функцию таблицы Sum. Это быстрее и экономит много кода.
Использовать функции рабочего листа очень просто. Ниже приведен пример использования Sum и Count.
Sub WorksheetFunctions() Debug.Print WorksheetFunction.Sum(Range("A1:A10")) Debug.Print WorksheetFunction.Count(Range("A1:A10")) End Sub
В следующем примере используется цикл для выполнения того же действия. Как видите, это гораздо более длинный способ достижения той же цели.
Sub SumWithLoop() Dim total As Long, count As Long Dim rg As Range For Each rg In Range("A1:A10") ' Total total = total + rg ' Count If rg <> "" Then count = count + 1 End If Next rg Debug.Print total Debug.Print count End Sub
Резюме
Цикл Do While
- Цикл Do можно использовать 4 способами.
- Его можно использовать в начале или в конце, Do While .. Loop, Do … Loop While
- Может использоваться с Until в начале или в конце, Do Until .. Loop, Do … Loop Until
- While и Until используют противоположные условия друг к другу.
- Бесконечный цикл происходит, если ваше условие выхода никогда не будет выполнено.
- Иногда использование функции рабочего листа более эффективно, чем использование цикла.
Цикл While Wend
- Цикл Wend Wend устарел, и вы можете вместо этого использовать цикл Do.