Страницы: 1
RSS
Определение границ цикла for/next
 
При разборе кода возник вопрос и поставил под сомнение то, что границы цикла определяются перед первым шагом и не изменяются.

Удаляем лишние листы (цикл1):
Код
    For i = Sheets.Count To 2 Step -1
        Sheets(i).Delete
    Next i

А вот прямым ходом (цикл2):
Код
    For i = 2 To Sheets.Count
        Sheets(2).Delete
    Next i

Теперь вместо Sheets.Count подставим переменную. Первому циклу все равно, второй, естественно, вывалится в ошибку  (цикл3):
Код
    k = Sheets.Count
    
    For i = 2 To k
        Sheets(i).Delete
    Next i

Вот и вопрос: как работает прямой цикл (цикл2) при уменьшении количества листов? Переопределяется верхний предел?

Ноги растут отсюда
 
Цитата
vikttur написал: А вот прямым ходом (цикл2):
Виктор, а вот поставьте здесь
Цитата
Sheets(i).Delete
Вопрос сам собою снимется
Изменено: Андрей VG - 11.07.2019 00:05:23
 
Не снялся. Или я не понял предложенного.
 
Код
    For i = 2 To k
        Sheets(2).Delete
    Next i

а не
Код
    For i = 2 To k        
        Sheets(i).Delete
    Next i

если листов больше 2 второй цикл упадет по ошибке, а первый удаляет второй лист, столько раз, сколько нужно.
Изменено: Ігор Гончаренко - 11.07.2019 00:26:44
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Похоже, понял. Граница на изменяется. это я цикл3 неправильно записал для проверки. Сам себе сомнений нажил )
Спасибо.
 
Цитата
Не снялся. Или я не понял предложенного.
Пример, для понимания
 
Да, уже понял свою ошибку. Спасибо.
Земля стала на место )

Цитата
логически правильнее удалять листы с последнего до нужного, а не каждый раз лист №2
цикл2 по сравнению с цикл1 проигрывает или это мои придумки? Как правильнее? или одинаково?
 
Насколько я знаю, ничего в теле цикла не переопределяется, границы определяются один раз, поэтому запись 2 и 3 одно и тоже, кроме того, что память заняли под доп. переменную и то, что коллеги отметили в чем был ньюанс.
Цитата

vikttur написал: цикл2 по сравнению с цикл1 проигрывает...?
Вить, а в чем проигрывает? в первом случае удаление с конца, во втором с начала. Количество итераций одинаково (количество листов -1).
Изменено: bedvit - 13.07.2019 13:39:15
«Бритва Оккама» или «Принцип Калашникова»?
 
Эффективнее, наверное, удалять сразу все ненужные листы, как-то так:
Код
Sub sub1()
  Dim a()
  Dim i
  ReDim a(Sheets.Count - 2)
  For i = 0 To UBound(a)
    a(i) = i + 2
  Next i
  Sheets(a).Delete
End Sub
 
Alec Perle, Вы не поняли вопроса темы. Удаление или появление листа  - это только пример действия.
По вопросам из тем форума, личку не читаю.
 
Виталий, переменная - только для демонстрации.
Ни разу не встечал удаления листов прямым циклом. До этого случая я знал (был уверен), что границы цикла определяются один раз. Когда увидел пример удаления листов слева, накидал пример и с удивлением обнаружил, что верхняя граница меняется! Покрутил... Таки меняется! Поэтому и создал тему, чтобы развеять сомнения.
Но, как оказалось, сам себя запутал. В примере (цикл3) не заменил i на 2.
Надо было не спешить с темой, а положить ноут под подушку и переспать с этим :) Утром на свежую голову дурные мысли сами развеялись бы.

А по поводу удаления вверх/вниз... Как для меня, более явно и понято удаление каждого листа, а не все время второго. Хотя, с другой стороны, при обратном цикле нужно обратный шаг отсчитывать...
Похоже, в дальнейшем  буду применять прямое удаление.

Alec Perle, обычно при создании новой книги лишних листов оказывается 1-3, поэтому создание массива нецелесообразно. Но как пример для книг с сотней листов (а такие бывают) - почему бы и нет.
 
Попробовал воссоздать ситуацию с удалением листов с помощью переменных
Во всех примерах граница цикла не изменяется. Т.е. вычисляется один раз.
По сути если бы происходило переопределение, то первый и четвертый коды должны были бы быть бесконечными.
Второй и четвертый должны бы были закончится быстрей чем указано при входе в цикл.
Скрытый текст
Изменено: Nordheim - 12.07.2019 08:34:59
"Все гениальное просто, а все простое гениально!!!"
Страницы: 1
Наверх