Страницы: 1
RSS
Изменение в коллекции объектов внутри цикла For Each, Можно ли перескочить или зациклить некоторые объекты из коллекции при выполнении цикла For Each?
 
Доброго утра. Циклы 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 - 17.01.2022 09:06:02
Не перестаю удивляться возможностям excel и VBA.
 
Shama, здравствуйте

Цитата
Shama: изменить переменную с
на течение цикла For Each изменение переменной никак не влияет

Цитата
Shama: GoTo пришел на ум
метки позволяют перемещаться куда угодно по телу кода на любом этапе выполнения (см. далее)

Цитата
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
'====================================================================================================
Что нужно - непонятно… Объясните практический смысл, что вы хотите сделать и тогда ответов будет больше
Изменено: Jack Famous - 17.01.2022 10:27:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Shama написал:
не предусмотрено
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 после присвоения смысла нет
По вопросам из тем форума, личку не читаю.
 
Jack Famous, БМВ, Спасибо за комментарии.

Цитата
написал:
Что нужно - непонятно… Объясните практический смысл
Да просто хотелось понять "механику" 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 - 17.01.2022 12:28:50
Не перестаю удивляться возможностям excel и VBA.
 
Цитата
Shama: если возник такой вопрос - значит что то намудрил с условиями внутри цикла
обычно так и есть
Для себя разницу (область применения) между циклами я понимаю так:
По скорости они обычно не отличаются сколь угодно заметно, но For … To стабильнее и, местами, НЕ МОЖЕТ быть заменён на For Each (пример - цикл по множественным областям диапазона), в то время как For Each ВСЕГДА МОЖЕТ (не встречал иного) быть заменён аналогом на For … To
Изменено: Jack Famous - 17.01.2022 12:43:16
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх