Страницы: 1
RSS
Не обновляется переменная внутри цикла
 
Доброго дня!
Помогите, пожалуйста!
Есть переменная, в которую сохраняется кол-во строк в таблице, определяется эта переменная за циклом.
Цикл работает до окончания строк в таблице. В результате работы этого цикла количество строк в таблице увеличивается, соответственно я считаю строки внутри цикла, каждый раз, когда их количество увеличивается.
Проблема: цикл заканчивается все равно на том значении переменной, которое было посчитано за циклом. Т.е. пересчет этой переменной внутри цикла ничего не дает ((. Почему так получается? Я проверяю эту переменную и вижу, что значение ее становится больше, но цикл все равно заканчивается на начальном значении этой переменной.
Что я делаю не так?
 
Покажите как это выглядит в коде.
Но пока кажется что оно так и должно быть, придётся менять подход к этому циклу.

Т.е. сейчас что-то вроде этого?

Код
Sub primer()
    x = 10
    For i = 1 To x
        x = x + 1
    Next
End Sub
 
Изменено: Hugo - 17.10.2014 18:46:33
 
Цитата
Что я делаю не так?
обращаетесь на форум программистов, а не на форум телепатов
на этом форуме могут найти ошибку, только глянув в код
 
Код выглядит так:
Код
NrowMy = shtMy.Range("A1").CurrentRegion.Rows.Count
    For i = 2 To NrowMy
       If shtMy.Cells(i, p) Like "KOMENTARZ*" Then
            For n = 1 To NrowComm
                If shtComm.Cells(n, 1).Value = shtMy.Cells(i, p).Value Then
                    NrowComm1 = shtComm.Cells(n + 1, 1).CurrentRegion.Rows.Count - 2
                    w = n
                End If
            Next n
            For m = 1 To NrowComm1 - 1
                shtMy.Cells(i + 1, p).EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
                shtMy.Rows(i).Copy
                Rows(i + 1).Select
                ActiveSheet.Paste
            Next m            
       End If
            NrowMy = shtMy.Range("A1").CurrentRegion.Rows.Count
    Next i
NrowMy - это переменная
Изменено: Татьяна Агафонова - 18.10.2014 21:31:21
 
Цитата
Hugo пишет: Т.е. сейчас что-то вроде этого?
Да, по-сути именно так. Поменять подход? (( Не понимаю пока как
 
Я тоже не понимаю. Потому что не знаю задачи - в код вникать без примера файла неохота, есть дела интереснее...
 
И вообще - вечер пятницы, работа заканчивается через 4 минуты!  :)
 
Я понимаю, поэтому сразу задала вопрос - я что-то делаю не так, или это нормальная ситуация, что переменная меняет свое значение, а цикл остается в пределах старого значения? Просто макрос очень большой и это лишь его кусок, уперлась в эту ошибку и не знаю как ее обойти.
 
Это так и должно быть, меняйте алгоритм/подход.
 
Ок, будем думать. Спасибо, что проявили внимание к проблеме страждущего )
 
Трудно понять задачу.
Первое, что бросается в глаза:
1. Работа с ячейками, а не с элементами массива.
2. Пресыщение .Select
3. Нужны ли .Copy - .PasteSpecial Paste
Итог: озвучте задачу.
Может будет проще понять и найти решение
 
вот этот подход не понятен!
Код
For i = 2 To NrowMy
'''''''''''''
    NrowMy = shtMy.Range("A1").CurrentRegion.Rows.Count
Next i
 
Татьяна Агафонова, код следует оформлять соответствующим тегом. Для этого есть специальная кнопочка:

Исправляйте.
 
Цитата
Александр Моторин пишет: вот этот подход не понятен!
Цикл идет от 2 до последней строки таблицы (в NrowMy считается кол-во строк этой таблицы), поскольку во время работы внутреннего цикла в таблице появляются новые строки - в его конце я обновляю переменную NrowMy, считая заново строки в таблице.
Т.е. до начала цикла в таблице было 9 строк, после окончания работы внутреннего цикла в таблице уже 32 строки, я обновляю переменную и иду на следующее значение цикла, и могу видеть что переменная обновилась и она равна 32, но цикл все равно работает только до 9.
Цитата
1. Работа с ячейками, а не с элементами массива.
2. Пресыщение .Select
3. Нужны ли .Copy - .PasteSpecial Paste
Мне нужна в данном случае привязка к ячейкам в конкретной таблице, не думаю, что выделение и вставка как-то влияют на цикл, я могу закомментировать этот кусок, но цикл все равно работает как я описала выше, т.е. не логично, на мой взгляд.
Цитата
Итог: озвучте задачу.
Моя задача, сделать так, чтоб цикл работал до обновленного значения NrowMy.
Изменено: Татьяна Агафонова - 18.10.2014 21:13:28
 
Вы бы упростили немного код, убрав copy/paste (можно заменить заливкой ячеек). и показали бы в файле на небольшом диапазоне данных проблему.
 
Цитата
Юрий М пишет: Вы бы упростили немного код, убрав copy/paste.
Удалила copy/paste
Hugo совершенно верно понял суть моей проблемы
Код
Sub primer() 
    x = 10 
      For i = 1 To x 
     x = x + 1 
      Next i
End Sub
Проще говоря, цикл работает до десяти, а должен бы работать до 20
Изменено: Татьяна Агафонова - 18.10.2014 22:40:49
 
For  To  замените на Do Loop или While Wend.
Віход из цикла по условию. Например условно так:

Код
Do
            For n = 1 To NrowComm
            Next n
            
            For m = 1 To NrowComm1 - 1
            Next m
     
            NrowMy = shtMy.Range("A1").CurrentRegion.Rows.Count

Loop While shtMy.Cells(i, p) Like "KOMENTARZ*"
Изменено: Александр Моторин - 18.10.2014 21:51:46
 
Всё правильно: x меняется до 20, но за 10 итераций - смотрите значение переменной i.
 
Юрий М, ну да, я уже, кажется, поняла, что я не совсем так как надо понимаю саму суть работы цикла, поэтому у меня и получается когнитивный диссонанс ))
Мне казалось, что количество итераций зависит от содержимого х в любой момент времени, а не на начало работы цикла

Цитата
Александр Моторин пишет: ForToзамените на Do Loop или While Wend. Віход из цикла по условию
Ок, сейчас попробую.
 
А почему сразу не присвоить x=20?
 
Цитата
Татьяна Агафонова пишет: Проще говоря, цикл работает до десяти, а должен бы работать до 20
Почему именно до 20?
Если я правильно понял. Вы хотите изменять верхнюю границу до которой должен считать цикл.
Если бы цикл For работал так как Вы хотите, то данный цикл бы никогда не закончился, т.к. переменная i всегда бы была меньше x

Вариант через Do Loop
Код
Sub primer()
    Dim i&, x&
    x = 10
    i = 1
    Do
        If i Mod 2 Then x = x + 1
        Debug.Print i
        i = i + 1
    Loop While i <= x
End Sub
Изменено: MCH - 18.10.2014 22:42:22
 
Цитата
Юрий М пишет: почему сразу не присвоить x=20?
Потому что я не знаю конечного значения х, оно не от меня зависит, кажется, решение с Do While Loop мне подходит, сейчас попробую реализовать
Спасибо всем! )
Изменено: Татьяна Агафонова - 18.10.2014 22:43:17
Страницы: 1
Наверх