Доброго утра. Циклы For i to... или Do... можно легко зациклить или перенестись к концу цикла изменив переменную i или условие внутри него, это понятно. А можно ли аналогично поступить с циклом по объектам For Each? Для примера, хотелось бы зациклить ниже приведенный пример на последней 10 строке. Пример конечно же не работает(он для визуализации))). Можно ли это как то сделать или это просто не предусмотрено и нарушает саму суть этого цикла?
P.s. GoTo пришел на ум. А как нибудь еще? т.е. именно изменить переменную с ?
Код
Sub test()
Dim c As Range
For Each c In Range("A1:A10")
If Range(c.Address).Row = 10 Then c = Range(c.Address).Offset(-1, 0)
Next c
End Sub
метки позволяют перемещаться куда угодно по телу кода на любом этапе выполнения (см. далее)
Цитата
Shama: хотелось бы зациклить ниже приведённый пример на последней 10 строке
Код
Sub test()
Dim c As Range, n&
For Each c In Range("A1:A10")
rep:
If Range(c.Address).Row = 10 Then
n = n + 1 ' увеличиваем счётчик зацикливания
Debug.Print "Loop #" & n ' печатаем в Immediate номер зайикливания
DoEvents ' чтобы можно было выйти из зацикливания (держать Esc)
GoTo rep ' зацикливаем
End If
Next c
End Sub
'====================================================================================================
Что нужно - непонятно… Объясните практический смысл, что вы хотите сделать и тогда ответов будет больше
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
P.S. пример конечно If Range(c.Address).Row = 10 Then c = Range(c.Address).Offset(-1, 0) вроде это If c.Row = 10 Then c = с.Offset(-1, 0) ну а если хочется зациклить что-то , то внутри For Next делайте Do Loop , хотя на примере тут смысла нет ибо ранее 10 уже быть не может, и проверять на то, не получили ли 10 после присвоения смысла нет
написал: Что нужно - непонятно… Объясните практический смысл
Да просто хотелось понять "механику" For Each, т.е. может ли он сделать "шаг назад" или нет, можно ли повлиять на "с" по ходу работы цикла или нет. Да и действительно от него это и не требуется. В рабочем примере успешно применил метку, а другие практические примеры не придумал.
Цитата
написал: If Range(c.Address).Row = 10 Then c = Range(c.Address).Offset(-1, 0) вроде это If c.Row = 10 Then c = с.Offset(-1, 0)
Дурное влияние примеров из интернета и привычка расписывать ) Спасибо.
Для себя отметил, что если возник такой вопрос - значит что то намудрил с условиями внутри цикла).
Shama: если возник такой вопрос - значит что то намудрил с условиями внутри цикла
обычно так и есть
Для себя разницу (область применения) между циклами я понимаю так:
Не нужно менять элемент + есть вариативная переменная + цикл с переменной будет покороче (легче писать/поддерживать) - For Each Для всего остального - For … To
Нужно также понимать, что в For Each, например, можно ввести счётчик i, чтобы менять элементы цикла elem(i)="newVal" — если это нужно, конечно…
По скорости они обычно не отличаются сколь угодно заметно, но For … To стабильнее и, местами, НЕ МОЖЕТ быть заменён на For Each (пример - цикл по множественным областям диапазона), в то время как For EachВСЕГДА МОЖЕТ (не встречал иного) быть заменён аналогом на For … To
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄