Страницы: 1
RSS
Перенос данных из одной таблицы в другую с необычным преобразованием
 

Добрый день, люди добрые!

Для автоматизации работы хотим с коллегой написать макрос, который будет из листа «Свод» копировать данные в лист «Заявка_test» по следующим критериям:

Из ячейки D1 листа «свод» задается условие (например, ЦФО – «УЭС») [это самая легкая часть], далее из листа «Свод» копируются все строки, в которых по столбцу В «ЦФО» стоит «УЭС», причем, если в строке в столбце О «период» указан январь, февраль, март и т.д., а в столбце N «Сценарий» указан «Прогноз 3+9» или «Бизнес план», то значение из столбца Q копируются на лист «Свод» так, чтобы данные разбегались по столбцам «январь», «февраль», «март» и т.д. и соответственно, в столбец «прогноз» или «план».

Пример как должно получиться в итоге на листе «Заявка_итог». Для примера облегчил таблицу - на самом деле на листе "Свод" порядка 60 тыс.строк.

Пытались с коллегой сделать сами, но никак не можем понять, как так можно сделать. Очень надеюсь на помощь. Спасибо!

Изменено: kaile73 - 02.05.2017 21:17:22
 
Цитата
kaile73 написал:
из листа «Свод» копируются все строки,... копируются на лист «Свод» так, чтобы они разбегалось...
Вы сами-то понимаете, что пишете в форум? Соберитесь, чайку попейте :D
Я сам - дурнее всякого примера! ...
 
Цитата
kuklp написал:
Соберитесь, чайку попейте
Попили) может не то пили?)
 
Не знаю, что вы там пьете, или едите, или еще что, но:
Цитата
kaile73 написал: копируются на лист «Свод» так, чтобы данные разбегались по столбцам «январь», «февраль», «март»
блин, да откройте свой файл и лист Свод! Где там столбцы
Цитата
kaile73 написал: «январь», «февраль», «март» и т.д
?
Изменено: kuklp - 17.07.2017 22:59:20
Я сам - дурнее всякого примера! ...
 
Сделать реально.
Я по традиции пытался бы делать на словарях, т.е. в данном случае "словарь в словаре".
Сперва из источника собираем все данные в словари, затем раскладываем в итоговую таблицу (шапку может для облегчения написания макроса нужно чуть изменить - там где в ячейке месяц интегрировать ещё и год, но год можно не показывать).
Но вот писать этот код особо интереса нет, писал уже такие... И времени лишнего нет.
Поизучайте коды на словарях.
 
Проверяйте. Автофильтр на листе "Свод" установлен по умолчанию.
Изменено: SAS888 - 03.05.2017 09:28:12
Чем шире угол зрения, тем он тупее.
 
Спасибо Вам огромное! Вы Гений! Все работает!
Немного внес правки (в новой версии листа "Свод" изменились столбцы, добавил условия по полям "Категория", "МВЗ"). Вот что получилось в итоге. Единственное, если на листе добавить данные, в которых по столбцу "сценарий" будет стоять "план" получается так, что строки с планом копируются ниже строк с прогнозом (пример во вложении на листе "Заявка_test"). Как можно сделать так, чтобы и значения плана и значения прогноза были друг с другом рядом в соседних столбцах (как на листе "Заявка_как должно")?
 
Цитата
kaile73 написал:
Единственное, если на листе добавить данные, в которых по столбцу "сценарий" будет стоять "план" получается так, что
СРАЗУ нельзя было это обговорить?
 
В моём варианте это не являлось бы проблемой, доработать легко. Про код SAS888 ничего не скажу - слёту не вник...
 
Цитата
kaile73 написал:
а в столбце N «Сценарий» указан «Прогноз 3+9» или «Бизнес план», то значение из столбца Q копируются на лист «Свод» так, чтобы данные разбегались по столбцам «январь», «февраль», «март» и т.д. и соответственно, в столбец «прогноз» или «план».
Юрий М, тут я и имел это в виду) надо было более детально указать, извиняюсь
 
В исходном задании Вы не указали то, что кроме "ЦФО" и "Статьи" нужно еще учитывать и "Цех".
Проверяйте. Только добавленные Вами проверки построчных данных массива "a" будут работать только для столбцов, которые я оговорил выше. Для корректного сравнения остальных столбцов потребуется добавить условия сортировки. Но, т. к. остальные столбцы в Вашем файле пустые, то я их не рассматриваю.
Если что-то не так - пишите.
P.S. Также, я подправил (рационализировал) Ваши макросы в программных модулях.
Изменено: SAS888 - 04.05.2017 06:55:37
Чем шире угол зрения, тем он тупее.
 
Я свой код до конца не пилил, но вот думаю "прозрачная" заготовка для первого файла, можно брать доделывать если нужно кому.
Код
Option Compare Text

Private Sub Сформировать_Click()
    Dim a(), i&, Dic As Object, Dic2 As Object

    Set Dic = CreateObject("Scripting.Dictionary")
    Dic.CompareMode = 1

    a = Sheets("Свод").ListObjects(1).DataBodyRange.Value
    For i = 2 To UBound(a)
        If a(i, 2) = Sheets("Заявка_test").[d1] Then
            t = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 8) & "|" & a(i, 11)
            If Not Dic.exists(t) Then Dic.Add t, CreateObject("Scripting.Dictionary")

            Select Case True
                Case a(i, 14) Like "*прогноз*": a(i, 14) = "прогноз"
                Case a(i, 14) Like "*план*": a(i, 14) = "план"
            End Select

            Dic.Item(t).Item(a(i, 14) & "|" & a(i, 15) & "|" & a(i, 16)) = a(i, 17)
        End If
    Next

    For Each el In Dic.keys
        Debug.Print "Добавляем в заявку строку " & el
        Set Dic2 = Dic.Item(el)
        Debug.Print "Тут цикл по шапке, составляем ключ, проверяем его наличие в Dic2"
        For Each col In Dic2.keys
            Debug.Print "В Dic2 по ключу берём данные " & col & "|" & Dic2.Item(col)
        Next
    Next

End Sub

P.S. Кстати - если нужно (или возможны повторения) - во внутреннем словаре данные по ключам можно суммировать. Сейчас запомнится только последнее значение, т.к. там сейчас повторов нет.
Изменено: Hugo - 04.05.2017 10:30:36
 
SAS888, спасибо большое! Все работает!
Hugo, сегодня не смог попробовать Ваш код. Попробую на днях. Если я правильно понял, как работает код на словарях, то знаю, как можно использовать и Ваш вариант) спасибо!
 
В таком варианте строка будет информативнее:
Код
       Debug.Print "В Dic2 по ключу берём данные " & col & " = " & Dic2.Item(col)

Выгрузку можно делать в четыре массива - высота известна по количеству ключей головного словаря, создаём по массиву на каждую заполняемую группу столбцов текстом от A до L, и один массив для сумм по месяцам.
Далее вместо перебора шапки можно перебирать заготовленный массив названий месяцев, а в этом цикле чередовать план/прогноз - и заполнить массив (ещё вероятно нужно в ключ для надёжности подставить год, чтоб лишнего не цепануть).
Затем находим место листа куда этот массив нужно вывалить - ориентиром можно взять позицию значения "2017": Rows(3).Find(2017).Offset(3, 2)
И будет быстро и на 60к строк.
 
SAS888, доброго времени суток!

Подскажите пожалуйста по Вашему коду, никак не могу решить возникшую проблему: как сделать, чтобы данные из листа "Свод" (столбец T) попадали на лист "Заявка" не только по названию месяца, но и по году 2018 и 2019 (в столбцы AV и AW)?
Предполагаю, что вся соль в том, что вот тут указан только тип Month:
Код
   j = Month(DateValue(a(1, 20) & " 1, 2017")): k = InStr(a(1, 22), "Прогноз")
    b(1, 24 + j * 2 - 1 + k) = a(1, 24): m = 1
    For i = 2 To UBound(a, 1)
        j = Month(DateValue(a(i, 20) & " 1, 2017")): k = InStr(a(i, 22), "Прогноз")

Второй вечер ломаю голову, что нужно добавить... только постигаю VBA и теряюсь, как быть
 
Люди добрые, откликнитесь пожалуйста!
Страницы: 1
Наверх