Добрый день форумчани! Помогите пожалуйста разобраться с работой циклов. Бьюсь второй день(.
Суть вопроса: Есть 2 цикла, основной и вспомогательный, внутри основного. Основной пробегает по строкам исходной таблицы забирая составной ключ по которому должны копироваться данные из вспомогательной таблицы (она создается на основе основной на предыдущем "этапе").
Вспомогательный цикл призван проверить наличие ключа во всех строчках вспомогательной таблицы (порядок строк разный в 2 таблицах), и если ключ найден, то копирует основные значения табличной части в основную таблицу, если нет, оставляет поля по новому ключу пустыми (доступными для заполнения). Ключ копируется из внешнего источника ХД через одноименный лист.
Проблема: Когда устанавливаю чек поинт и делаю отладку по шагам, все отрабатывает корректно, но когда запускаю макрос (проблемная часть с 181 строки кода), копирование происходит без выполнения логических условий проверки ключа, тупо подряд строки из временной таблица в основную копируются.
В файле с примером целевой вид после выполнение макроса на листе "Ввод данных_Целевой", то, что получается сейчас при запуске на листе "Ввод данных_Ложный". Помогите разобраться, почему так отрабатывает макрос при обычном запуске, в то время, как при отладке по шагам, все работает корректно?
Попробуйте выполнить макрос с листа Ввод данных и сразу увидите где. Кстати при попытке выполнить с другого листа выброс идет на следующей строке и по той же причине.
Cells(i, 6) берутся либо с активного листа, либо с листа, в модуле котрого расположен код. И не факт что это ActiveWorkbook.Sheets(SheetName_Goal_tmp)! P.S. файлы не смотрел
Коллеги, ниже код с двумя циклами. Вопрос именно в том, почему при отладке, последовательно выполняется код правильно, но при запуске целиком, копирует без соблюдения логического условия проверки по ключу.
Код
'##########################################
'#### КОПИРОВАНИЕ ИЗ ВРЕМЕННОГО ЛИСТ ####
'##########################################
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 строки кода)
еще и вручную строки считать. Вот потому и помогают так "охотно".
Коллеги предположение оказалось верным, действительно ключ, который был необходим для копирования рассчитывался по формуле, а так как расчет формул в начале макроса был отключен для оптимизации, то он и не обновлялся при новой загрузке, что привело к ошибке. Всем спасибо! Ура! =)