Страницы: 1
RSS
Возможно ли изменение изменение предела счетчика в цикле For Next
 
Всем здравствуйте.
Подскажите, возможно ли изменение изменение предела счетчика в процессе работы цикла For Next? Т.е. в цикле заданном For i=1 To n, возможно ли изменение величины n в процессе исполнения цикла?
 
cuprum,нет
 
Проверьте:
Код
Sub vik()
Dim i As Long, n As Long
    n = 10
    
    For i = 1 To n
        If i = 5 Then n = 20
    Next i
    
    MsgBox i
End Sub
 
Здравствуйте. Я о таком не слышал. For-Next предусматривает работу именно для известного количества циклов. Возможно, если вы опишете всю задачу можно будет покумекать над другим способом решения (например через циклы Do Loop (While и Until) которые выполняются до выполнения/соблюдения некоего условия.
Кому решение нужно - тот пример и рисует.
 
Anchoret, жаль. Видимо в этом-то и заключается неполноценная работа моего макроса в 12 посте в Перенос текста на следующую строку при заполнении столбца по ширине, оптимизация макроса  :( Я пытался это там провернуть.
 
cuprum, а может сделать наоборот? - назначьте количество итераций ЗАВЕДОМО больше, а потом проверяйте некое условие и по нему досрочный выход из цикла.
 
vikttur, Очень, интересно, в Вашем примере предел не изменился на заданный условием, но в то же время превысил на единицу заданный изначально. Как это можно понять?
 
На единицу ВСЕГДА будет больше )
 
Юрий М, да, я уже думал об этом, но пока не знаю как это реализовать, и поэтому решил прозондировать тему на предмет изменения счетчика.

Это ответ на более ранний пост, на 6. Пока пишу ответы, появляются более новые посты.
Изменено: cuprum - 24.02.2018 23:08:23
 
Нормально понять. После значения 10 цикл увеличил значение на 1, проверил, что вышел за предел и завершил работу. Так всегда происходит.
Напишите простой цикл и проверьте.
 
vikttur, Понятно, просто как-то не задумывался, считал что верхнее значение является конечным.
 
Ну что ж, тогда тему можно считать закрытой. Всем откликнувшимся большое спасибо.
 
Технически в цикле можно принудительно поменять значение переменной счетчика цикла:
Код
Sub Test()
  Dim i As Long
  For i = 1 To 10
    Debug.Print "В цикле i = " & i
    i = 100
  Next
  Debug.Print "После цикла i = " & i
End Sub

Но это плохой стиль, так делать не рекомендуется. Если вместо i = 100 записать, например, i = 2, то цикл будет бесконечным. Для принудительного выхода из цикла есть Exit For.
Изменено: ZVI - 25.02.2018 02:31:29
 
Иногда применяю изменение счетчика в цикле (не выше верхнего предела)
Пример: при определенных условиях нужно перескочить через несколько шагов (число разное).
Код
Sub vik()
Dim i As Long, k As Long
    For i = 1 To 25
        Debug.Print i
        k = i
        
        Select Case k
        Case 5: i = k + 2 ' 7+следующий шаг = 8 (6, 7 перепрыгнули)
        Case 7: i = k + 1 ' 8+следующий шаг = 9, но строка не сработает
        Case 12: i = k + 10 ' 22+следующий шаг = 23 (с 13 по 22 перепрыгнули)
        Case 20: Exit For ' строка не сработает
        End Select
    Next i
End Sub

Пример простейший,  в рабочих вариантах  i никогда не переваливает "выше крыши"
 
Цитата
vikttur написал:
(не выше верхнего предела)
Увы, мне надо было увеличить как раз верхний предел. Выбирается диапазон ячеек, в процессе работы вставляются, при необходимости, новые строки, при этом надо перебрать все тот же диапазон, но уже расширяющийся на количество добавляемых строк.
 
Макрос не может работать, пока Вы колдуете со вставкой/удалением строк.  Переменную n можно определить перед запуском цикла.
Но это уже другая тема.
 
Если использовать правильный инструмент, то никаких "увы".
Код
Sub q()
    Dim i&, n&
    n = 30: i = 1
    Do
        Cells(i, 2) = i
        i = i + 1
        If i = 10 Then Rows("11:15").Insert: n = n + 6
        DoEvents
    Loop While i < n
End Sub
 
RAN, спасибо за подсказку, обмозговываю.
 
Цитата
cuprum написал:
Увы, мне надо было увеличить как раз верхний предел. Выбирается диапазон ячеек, в процессе работы вставляются, при необходимости, новые строки
- обычно в таких случаях идут циклом снизу вверх, и вставляют сразу ниже текущей.
Как кстати и при удалении.
P.S. а ведь было:
Цитата
Пытливый написал:
Возможно, если вы опишете всю задачу можно будет покумекать
Изменено: Hugo - 25.02.2018 14:15:32
 
Цитата
Если использовать правильный инструмент,
а в этом и есть суть программирования:
используя возможности языка собрать команды и операторы в такую последовательность, которая приведет к требуемуму результату.
и процесс составление такого кода гораздо проще,
когда описана задача, которую нужно решить, а не метод, который завел в тупик при попытке найти решение.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Hugo, Ігор Гончаренко, ссылка на мою задачу была приведена в 5 посте, я не стал дублировать её в новой теме с новым вопросом (за несоблюдение правил уже получал по шапке)
Изменено: cuprum - 25.02.2018 19:38:38
 
Вам пишут о постановке задачи, а Вы тему создали по пути решения. Да, на вопрос темы Вы ответ получили. Но обсуждение основной  задачи - уже не эта тема.
Страницы: 1
Наверх