Страницы: 1
RSS
Некорректная работа цикла в цикле
 
Добрый день форумчани!
Помогите пожалуйста разобраться с работой циклов. Бьюсь второй день(.

Суть вопроса: Есть 2 цикла, основной и вспомогательный, внутри основного. Основной пробегает по строкам исходной таблицы забирая составной ключ по которому должны копироваться данные из вспомогательной таблицы (она создается на основе основной на предыдущем "этапе").

Вспомогательный цикл призван проверить наличие ключа во всех строчках вспомогательной таблицы (порядок строк разный в 2 таблицах), и если ключ найден, то копирует основные значения табличной части в основную таблицу, если нет, оставляет поля по новому ключу пустыми (доступными для заполнения). Ключ копируется из внешнего источника ХД через одноименный лист.

Проблема: Когда устанавливаю чек поинт и делаю отладку по шагам, все отрабатывает корректно, но когда запускаю макрос (проблемная часть с 181 строки кода), копирование происходит без выполнения логических условий проверки ключа, тупо подряд строки из временной таблица в основную копируются.

В файле с примером целевой вид после выполнение макроса на листе "Ввод данных_Целевой", то, что получается сейчас при запуске на листе "Ввод данных_Ложный".
Помогите разобраться, почему так отрабатывает макрос при обычном запуске, в то время, как при отладке по шагам, все работает корректно?

Файл с примером https://yadi.sk/i/DWr0986fqn42b
Password - 123
Изменено: AlekseyF - 09.04.2016 21:57:25
 
Ну во-первых Вы неправильно указываете диапазоны, вот это:
Код
 ActiveWorkbook.Sheets(SheetName_Goal_tmp).Range(Cells(i, 6), Cells(i, 8)).Copy

надо писать так:
Код
Range(ActiveWorkbook.Sheets(SheetName_Goal_tmp).Cells(i, 6), ActiveWorkbook.Sheets(SheetName_Goal_tmp).Cells(i, 8)).Copy

И так везде. Дальше смотреть не стал.
Я сам - дурнее всякого примера! ...
 
Прошу прощения, изначально прикрепил не тот файл. Сейчас ссылка в первом сообщении темы корректная!
Изменено: AlekseyF - 06.04.2016 13:10:40
 
Попробуйте выполнить макрос с листа Ввод данных и сразу увидите где. Кстати при попытке выполнить с другого листа выброс идет на следующей строке и по той же причине.
Я сам - дурнее всякого примера! ...
 
М-да. Чего-то не тот пример скачался.
Та да. Вы его сменили.
Изменено: kuklp - 06.04.2016 13:20:56
Я сам - дурнее всякого примера! ...
 
Цитата
kuklp написал: Чего-то не тот пример скачался
Тот, просто автор поменял файл )
 
Возможно что-то не замечаю, подскажите на что обратить внимание поподробнее?
 
Я уж понял, Юр. Жулье вокруг.
Я сам - дурнее всякого примера! ...
 
Cells(i, 6) берутся либо с активного листа, либо с листа, в модуле котрого расположен код. И не факт что это ActiveWorkbook.Sheets(SheetName_Goal_tmp)!
P.S. файлы не смотрел :)
Изменено: Hugo - 06.04.2016 13:25:33
 
Коллеги, ниже код с двумя циклами. Вопрос именно в том, почему при отладке, последовательно выполняется код правильно, но при запуске целиком, копирует без соблюдения логического условия проверки по ключу.
Код
    '##########################################
    '####  КОПИРОВАНИЕ ИЗ ВРЕМЕННОГО ЛИСТ  ####
    '##########################################

        Dim Sh_Goal As Worksheet, Sh_Goal_tmp As Worksheet

        SheetName_Goal = "Ввод данных"
        SheetName_Goal_tmp = "Ввод данных (2)"

        Set Sh_Goal = ActiveWorkbook.Worksheets(SheetName_Goal)
        Set Sh_Goal_tmp = ActiveWorkbook.Worksheets(SheetName_Goal_tmp)

        Dim i As Long
        Dim h As Long

        
        With Sh_Goal
        Count_Copy = .Cells(.Rows.Count, 3).End(xlUp).Row
        Count_Copy_tmp = Sh_Goal_tmp.Cells(.Rows.Count, 3).End(xlUp).Row
        
        For i = 3 To Count_Copy
        
            If .Cells(i, 4) = Sh_Goal_tmp.Cells(i, 4) Then
                .Cells(i, 5) = 1
                .Cells(i, 12).Resize(1, 83) = Sh_Goal_tmp.Range("L" & i).Resize(1, 83).Value
                .Cells(i, 93).Resize(1, 1) = Sh_Goal_tmp.Range("CO" & i).Resize(1, 1).Value
                .Cells(i, 96).Resize(1, 1) = Sh_Goal_tmp.Range("CR" & i).Resize(1, 1).Value
                .Cells(i, 98).Resize(1, 1) = Sh_Goal_tmp.Range("CT" & i).Resize(1, 1).Value
                .Cells(i, 101).Resize(1, 1) = Sh_Goal_tmp.Range("CW" & i).Resize(1, 1).Value
                .Cells(i, 103).Resize(1, 1) = Sh_Goal_tmp.Range("CY" & i).Resize(1, 1).Value
                .Cells(i, 106).Resize(1, 1) = Sh_Goal_tmp.Range("DB" & i).Resize(1, 1).Value
                .Cells(i, 108).Resize(1, 1) = Sh_Goal_tmp.Range("DD" & i).Resize(1, 1).Value
                .Cells(i, 111).Resize(1, 1) = Sh_Goal_tmp.Range("DG" & i).Resize(1, 1).Value
                .Cells(i, 113).Resize(1, 1) = Sh_Goal_tmp.Range("DI" & i).Resize(1, 1).Value
            Else
                Sh_Goal.Cells(i, 5) = 0
                For h = 3 To Count_Copy_tmp
            
                    If .Cells(i, 4) = Sh_Goal_tmp.Cells(h, 4) Then
                        .Cells(i, 5) = 1
                        .Cells(i, 12).Resize(1, 83) = Sh_Goal_tmp.Range("L" & h).Resize(1, 83).Value
                        .Cells(i, 93).Resize(1, 1) = Sh_Goal_tmp.Range("CO" & h).Resize(1, 1).Value
                        .Cells(i, 96).Resize(1, 1) = Sh_Goal_tmp.Range("CR" & h).Resize(1, 1).Value
                        .Cells(i, 98).Resize(1, 1) = Sh_Goal_tmp.Range("CT" & h).Resize(1, 1).Value
                        .Cells(i, 101).Resize(1, 1) = Sh_Goal_tmp.Range("CW" & h).Resize(1, 1).Value
                        .Cells(i, 103).Resize(1, 1) = Sh_Goal_tmp.Range("CY" & h).Resize(1, 1).Value
                        .Cells(i, 106).Resize(1, 1) = Sh_Goal_tmp.Range("DB" & h).Resize(1, 1).Value
                        .Cells(i, 108).Resize(1, 1) = Sh_Goal_tmp.Range("DD" & h).Resize(1, 1).Value
                        .Cells(i, 111).Resize(1, 1) = Sh_Goal_tmp.Range("DG" & h).Resize(1, 1).Value
                        .Cells(i, 113).Resize(1, 1) = Sh_Goal_tmp.Range("DI" & h).Resize(1, 1).Value
                        Exit For
                    End If
                Next

            End If
        Next
        End With
 
AlekseyF, а зачем у Вас: .Resize(1, 1) кругом понатыкано? Вы понимаете что оно значит? У меня такое ощущение, что Вы нарочно нам головы морочите. Меняете примеры на ходу, выкладываете файлы по 8мб. Зачем? Зачем нам файл 8мб по ссылке, с кучей листов по 2000 строк? Нельзя удалить все лишнее, поменять формулы на значения и выложить файл здесь?
Цитата
AlekseyF написал:
(проблемная часть с 181 строки кода)
еще и вручную строки считать. Вот потому и помогают так "охотно". :(
Я сам - дурнее всякого примера! ...
 
Прошу прощения, замечание обоснованно

Ошибка наиболее вероятна в коде "Application.Calculation = xlCalculationManual", при включении автоматического пересчета, все работает корректно.

Скорее всего ключ не обновляется формулой, думаю причина в этом =)
Изменено: AlekseyF - 06.04.2016 17:04:59
 
Коллеги предположение оказалось верным, действительно ключ, который был необходим для копирования рассчитывался по формуле, а так как расчет формул в начале макроса был отключен для оптимизации, то он и не обновлялся при новой загрузке, что привело к ошибке. Всем спасибо! Ура! =)
 
Цитата
kuklp написал: еще и вручную строки считать
Серж, в редакторе видно номер строки )) Но в остальном с тобой согласен.
 
Цитата
Юрий М написал: редакторе видно номер строки
Гы) сейчас только увидел, где. Никогда раньше не нужно было. :D
Я сам - дурнее всякого примера! ...
Страницы: 1
Наверх