Всем, добрый день. Решил сотворить макрос для заполнения таблицы. Но так как только начал познавать тайны VBA, сразу же произошел затык. При проходе вложенного цикла, он просматривает 135 ячеек и возвращается в начало. Т.е. до конца (до 5000 ячеки не доходит). Файл прилагаю. Помогите, подскажите, что не так я делаю. Заранее благодарен за помощь. Исходный файл по ссылке https://www.dropbox.com/s/3tsph2kc6p4oilb/1%D0%91_%D0%9D%D0%B0%D0%BA%D0%BE%D0%BF%D0%B8%D1%82%D0%B5%D...
konstruktornii написал: Но так как только начал познавать тайны VBA
Походу не с того начали познавать. Переменные не объявлены, поэтому в вашем сумбурном коде тяжко разбираться. Да и код не оформлен как требуется. Огромное количество переменных. Предположу, что результата можно добиться более простым способом. Файл бы пример. как есть и как надо.
"Все гениальное просто, а все простое гениально!!!"
Nordheim написал: Ссылка не вариант, у меня на работе политика безопасности не позволяет открыть сайт по ссылке.
по тому что работать надо :-)
konstruktornii, У меня отработало все по полной. Медленно, скрипя, но отработало. не знаю как у вас дальше будет с объемами, но помните столбцов всего 16к в примере последний уже 6678 использован. Скорость будет сильно больше если перебором заниматься не ячеек а загрузив все в массив крутить циклы по нему и только результат выводить в ячейки при этом отключив всякие калькуляции и события, но это другая тема.
БМВ, Да, макрос отрабатывает, но он почему-то видит только три КС с одним номером ЛС. И во все столбцы забивает только эти три. Я проверял по шагам. Доходит до 135 строки в КС2 и опять начинает с 8 строки.
Тут надо еще понимать одну вещь: лист, с которого запускаем макрос и где расположен макрос тоже имеет значение. Т.к. PosStrKS и PosStrLS определяем для конкретных листов, а значения потом просматриваем просто для Cells... Поставьте перед каждым обращением типа Cells() его родителя(т.е. лист): Worksheets("Лист45").Cells() и посмотрите как там чего будет. Или хоть напишите откуда запускаете и как должно быть.
Дмитрий(The_Prist) Щербаков написал: Поставьте перед каждым обращением типа Cells() его родителя(т.е. лист): Worksheets("Лист45").Cells() и посмотрите как там чего будет.
примерно так:
Скрытый текст
Код
Sub Nakopitel_iz_KS()
Dim ws_K As Worksheet, ws_L As Worksheet
Set ws_K = Worksheets("КС2")
Set ws_L = Worksheets("Лист45")
PosStrKS = ws_K.UsedRange.Rows.Count
PosStrLS = ws_L.UsedRange.Rows.Count
ColNumKS = 8
For i = 10 To PosStrLS
NumLS = ws_L.Cells(i, 1).Value
For j = 6 To PosStrKS
NumLSvKS = Worksheets("КС2").Cells(j, 2).Value
If NumLS <> Empty And NumLSvKS <> Empty Then
If NumLS = NumLSvKS Then
NumKS = ws_K.Cells(j - 1, 1).Value
NumKS4 = Left(NumKS, 4)
If NumKS4 = "КС-2" Then
ColNumKS = ColNumKS + 3
ws_K.Cells(2, ColNumKS).Value = NumKS
ws_K.Cells(3, ColNumKS - 1).Value = "По КС"
ws_K.Cells(3, ColNumKS).Value = "По РД"
ws_K.Cells(3, ColNumKS + 1).Value = "Факт"
End If
End If
End If
Next j
Next i
MsgBox j
End Sub
Inexsu, спасибо. Но вопрос остался. Не перебирает все номера ЛС из Лист45. Не могу понять, почему номер ЛС прописывает для каждой строчки. И еще, надо что бы номер ЛС повторялся только в случае изменения номера КС. Дальше надо будет перенести объемы из КС в ЛС в соответствии с шифром. И вывести в ЛС сумму объемов по строкам.
Inexsu, 1. На листе КС2 найти номер КС-2. Записать его на ЛИСТ 45. 2. Под этим номером найти номер локальной сметы (ЛС). Записать его на Лист45. 3. В этой КС по очереди перебираем шифры работы (материала, механизма). 4. По очереди сравниваем шифры КС и ЛС. 5. При совпадении шифров записать объемы из КС в ЛС в соответствующие ячейки (по КС, по РД, Факт) 6. После просмотра всего листа КС2 по-строчно сложить объемы и записать в ЛС в соответствующие ячейки.
Исходный файл большой, поэтому можно посмотреть по ссылке (в начале поста)