Страницы: 1
RSS
Объединение файлов с разными заголовками
 
Здравствуйте!
Прошу совета в реализации следующей задачи
Приходят однотипные отчеты от разных подразделений. При этом в каждом файле могут быть незначительные изменения - добавляться новые столбцы.
Нужно сделать из всех имеющихся заголовков универсальный, с сохранением очередности, чтобы потом все отчеты свести в одну таблицу.
В файле пример того что дано, и что нужно получить
Важно, чтобы столбцы, которые содержаться во всех файлах сохраняли свою очередность
Я пытался для каждого заголовка выбрать максимальный номер столбца, из всех файлов, и в такой последовательности вывести - но такой вариант не подошел. В файле также добавил этот пример и указал, в чем недостаток.
 
Как вариант посмотрите решение с форума (по моему было не совсем давно).
 
 
Спасибо. Посмотрел.
На сколько я понял, здесь за основу берется заголовок верхней таблицы и из всех последующих таблиц выбираются эти заголвоки.
У меня немного сложнее задача.
Т.к. нет "правильного" списка полей. Его нужно создать на основе заголовков всех таблиц и при этом сохранить очередность(чтобы избежать ситуации, которую я привел в строках 14-16 своего примера)
 
СОБРАТЬ ДАННЫЕ С ТАБЛИЦ С ИЗМЕНЯЮЩИМИСЯ СТОЛБЦАМИ В POWERQUERY
http://www.excel-vba.ru/chto-umeet-excel/sobrat-dannye-s-tablic-s-izmenyayushhimisya-stolbcami-v-pow...
 
Спасибо, но хочется обойтись средствами vba...
 
Цитата
qwerty64 написал: Спасибо, но хочется обойтись средствами vba...
OFF И что мешает - у вас нет средств VBA?! Или некогда/лень их осваивать? Тогда раздел "Работа" - для вас один из надежных вариантов... ;)
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Я знаю средства VBA, но не понимаю, как решить эту задачу
Не прошу код, хотя бы идею
 
Идея: собираете в словарь данные о "правильном порядке" заголовков. Ключ: наименование столбца, значение - его номер на листе.
Далее при обращении к каждому файлу считываете заголовок, наименование каждого столбца заголовка ищете в словаре. Если он есть - вставляете столбец в соответствии с их номером в словаре. Если нет - добавляете в конец листа и так же добавляете в столбец.
Идеологически как-то так. Мне лично не очень понятно понятие "правильная очередность" в конкретно данном случае, т.к. у нас нет четкого понимания итоговых столбцов. Но опять же в теории можно сначала пройтись по всем файлам и собрать заголовки, как-то их отсортировать, на основании этого уже создать словарь заголовков и повторно пройтись по всем файлам уже для сбора данных, сверяя так же каждый столбец.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо! Я так и пытался сделать изначально. Собирал в словарь все заголовки, в значение брал максимальный номер столбца этого заголовка во всех таблицах
Но при этом получается ситуация, которая приведена на строках 14-16. (ошибка - Оранжевый должен быть перед Коричневым). Как это можно предусмотреть?

Т,е. нужно как то учесть критерий, что последовательность столбцов, которая есть, не должна нарушаться. (если например синий идет перед черным, то и в итоговом "правильном" списке он не должен быть после него. Между ними могут быть столбцы но очередность их по отношению к друг к другу не должна нарушаться)
Изменено: qwerty64 - 04.11.2017 18:58:07
 
Цитата
qwerty64 написал:
последовательность столбцов, которая есть
Откуда она берется? Я привел алгоритм, в результате которого последовательность не должна нарушиться, если Вы не сделаете это сами. Как запишите - так и будет выводиться на лист. Почему Вы изначально брали самый большой номер заголовка - не знаю. Почему Оранжевый должен быть перед Коричневым - тоже не знаю. Значит о том, чтобы сохранить какой-то требуемый порядок должен позаботиться программист. Притом тот, который владеет информацией о том, какие критерию влияют на нужный порядок столбцов. У меня этой информации нет, поэтому больше вроде как нечего подсказать, к сожалению.
Вы сами пишите:
Цитата
qwerty64 написал:
нет "правильного" списка полей. Его нужно создать на основе заголовков всех таблиц
А как определить какой порядок правильный - Вы уже не пишите...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Попытаюсь еще раз объяснить логику "правильного" порядка
Изначально во всех заголовках расположение всех столбцов (до/после) одинаковое. Т.е. если во всех заголовках есть синий и желтый, то везде синий будет перед желтым. Но между ними могут быть другие столбцы.
И в итоговом "правильном" порядке это правило должно остаться. Расположение (до/после) для всех столбцов относительно друг друга должно сохраниться.

Оранжевый должен быть перед коричневым, т.к. в первом и во втором заголовке они расположены именно так.

Прошу прощения, если опять недостаточно понятно описал суть.
 
Похоже, реального "сводного" отчета Ваше руководство дождется очень нескоро!
С алгоритмом свода у Вас, однозначно, "заизюмило" на фоне "разукрашек".
Цитата
qwerty64 написал:
Приходят однотипные отчеты от разных подразделений. При этом в каждом файле могут быть незначительные изменения - добавляться новые столбцы.
В Вашей конторе весьма странно рассматривается "однотипный" отчет от подразделений.
Достаточно навести порядок в организации получения электронных "однотипных" отчетов и Ваш "геморрой" в получении Сводного Отчета будет автоматически ликвидирован.
Представьте ситуацию, подобную Вашей, в банке?!  :D  
Изменено: Мотя - 04.11.2017 20:13:31
 
Я вот не понимаю таких товарищей Z, Мотя...
Ну если по теме нечего сказать, зачем что то писать...
Или тут конкурс остроумных
Изменено: qwerty64 - 04.11.2017 20:33:46
 
Цитата
qwerty64 написал:
Или тут конкурс остроумных
Вы потеряли связь с реальной задачей, стоящей перед Вами. :D  
 
Мотя, спасибо! Всего доброго. Пишите, пожалуйста, в других темах свои гениальные мысли... 2416 сообщений.. ужас
 
Цитата
qwerty64 написал:
2416 сообщений.. ужас
Как математик и инженер решают одну и ту же задачу: вытащить из доски наполовину забитый гвоздь.
Инженер вытаскивает гвоздь.
Математик забивает его до конца и затем решает задачу в общем случае.
 
Доброе время суток
Цитата
qwerty64 написал:
что последовательность столбцов, которая есть, не должна нарушаться.
В вашем примере она нарушается. Красный один раз идёт за синим и два раза за жёлтым. Почему в итоговой таблице за жёлтым? Хорошо, пусть статистика наиболее часто красный идёт за жёлтым, тогда считайте ей и по ней сортируйте, что за чем идёт чаще.
Но, допустим у вас две первые таблицы, тогда красный в одной идёт за синим, а в другой за жёлтым, что будет приоритетом?
 
Андрей, имеется ввиду, что красный всегда правее синего. При этом между ними могут быть столбцы
Т.е. не должно быть варианта, что красный идет раньше синего
 
Если гарантировано, что не будет сочетаний в одной таблице серый, зелёный, а в другой - зелёный, серый, то версия на Power Query для размышления.
Успехов.
 
Андрей, спасибо!

Если у кого то еще будут идеи, как это реализовать на vba буду очень признателен:)
 
Цитата
qwerty64 написал:
как это реализовать на vba
Цитата
qwerty64 написал:
Не прошу код, хотя бы идею
Алгоритм, использованный в PQ.
1. Для каждого уникального имени столбца собираем уникальные имена предшествующих ему столбцов в список.
2. Так как возможен случай, как с "голубым" столбцом - упомянут только в одной таблице, то расширяем его список предшествующих столбцов по спискам предшественников этих столбцов, входящих в список предшественников "голубого" столбца. Этот столбец выбран для примера, фактически нужно выполнить эту операцию для всех столбцов и их списков из 1.
3. В результате для каждого столбца имеем количество уникальных имён столбцов, по нему и определяем порядок следования в результирующей таблице. У серого 0, он первый; у фиолетового только 1 предшественник, он второй, у синего два предшественника - следовательно третий, и т. д.
Можно всё это реализовать в VBA, используя, например, структуру словарь словарей.
Успехов.
Изменено: Андрей VG - 05.11.2017 21:10:52
 
Андрей, супер!
Спасибо! Логику понял! Попробую применить со словорями!
 
Хм, а если будет одна таблица с столбцами, которых всех вообще не будет ни в одной другой таблице? Куда их поставит код?
У меня нет  PQ, не могу проверить на готовом решении... А интересно :)
 
Hugo, а Вы бы как делали на vba?
Я Вашими приемами со словарями(вместо впр и суммесли) очень себе жизнь облегчил..))
 
Цитата
Hugo написал:
а если будет одна таблица с столбцами, которых всех вообще не будет ни в одной другой таблице? Куда их поставит код?
Если у двух имён столбцов таблиц слияния ровно по два предшественника, то как алгоритм сортировки расставит, так и будет. Другого-то критерия нет :)
Если одна таблица со столбцами (a, b, c), другая (d, e, f), то в зависимости от порядка слияния или
a, d, b, e, c, f или d, a, e, b, f, c, если алгоритм сортировки сохраняет существующий порядок, при прочих равных. Quick sort, например, не сохраняет, а сортировка в Excel, сохраняет.
 
Я честно говоря алгоритм не придумал, так чуть голову пломал и бросил... Алгоритм Андрея должен сработать, но тогда у всех цветов должно быть пересечение по файлам, потому что если нет - будет типа двух параллельных групп, и как их в итоге выгрузить? Хотя может тогда и всё равно как :)
 
Андрей, Hugo, можно вопрос - есть ли какое то преимущество PQ перед VBA?
Никогда не использовал PQ... Есть ли смысл в его изучении, или VBA полностью может перекрыть все возможности PQ?
 
Цитата
qwerty64 написал:
VBA полностью может перекрыть все возможности PQ?
может, так как более универсален. А C++ ещё более универсален, к тому же быстрее, чем PQ и VBA.
Страницы: 1
Читают тему
Наверх