Доброго вечера, уважаемые форумчане! Прошу вашей помощи в организации связи "один-ко-многим" между двумя таблицами через макрос. От создания сводных по нескольким таблицам (это также решило бы проблему) пока отказался, ввиду слабого знания материала и опасений "накосячить", а макрос есть макрос - из созданной им таблицы я всегда смогу отличную сводную построить. Не воспринимайте, пожалуйста, как ТЗ - выложил все мысли по теме, может чем-то поможет…
В посте №24 - рабочий макрос.
Пример такой (описание файла-примера):
есть так называемые "пироги" - типы отделки, которые представляют собой совокупность одного и более слоёв. Набор слоёв типа уникален, отличие хоть в 1 слое, или в их количестве - это уже другой тип. Так вот в 1 таблице эти самые типы расписаны по составу, а во 2 каждому помещению назначен свой тип. Напишите, пожалуйста макрос, который бы связывал эти 2 таблицы в 1 общую по ключевому полю (в примере ключевые поля выделены жёлтым). Сейчас решаю эту задачу с помощью сцепки по условию в справочнике, потом ВПРом эту сцепку в таблицу назначения, потом расцепка обратно с вставкой пустых строк - очень долго получается…
Детали по макросу (как примерно я это вижу):
1. выберите ключевое поле (диапазон) таблицы-справочника - KEY_DICT 2. выберите поле (диапазон) таблицы-справочника, значения из которого будут вставлены в таблицу назначения - LAYERS 3. выберите ключевое поле (диапазон) таблицы назначения - KEY_FILL (в таблице назначения, справа от ключевого поля создаётся столбец с именем того поля из таблицы-справочника, откуда брались LAYERS для заполнения
Комментарии:
Заполнить пустые ячейки значениями из верхних не прошу, т.к. в реальной "умной" таблице будет куча столбцов с формулами, а автозаполнить константы где нужно я всегда быстро смогу отдельным макросом. Создавать отдельный лист с новой таблицей также не нужно (вставлять в таблицу назначения) - если что, перед запуском макроса сам задублирую лист)) А пока сам попарюсь - может хоть что-то дельное напишу в коде))
Примеры похожих проблем:
Нашёл вот тут пример похожей проблемы. Решить с помощью этой надстройки не получилось - да и громоздкая она такая, основательная.
Инструкция по использованию спойлеров на форуме
1. переключиться в режим BB CODE 2. выделить код и нажать тэг кода на панели — <…> . Или просто выделить текст. 3. выделить всё, что нужно спрятать под спойлер и нажать тэг спойлера на панели — SP 4. если нужно задать имя спойлеру, то между [SPOILER и ] написать ="Текст заголовка спойлера" В режиме BB CODE должно получиться так: {/SPOILER="Заголовок спойлера"}Текст внутри спойлера{/SPOILER} Заменить фигурные скобки квадратными
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
С.М., наконец-то первый вариант по теме))))) спасибо вам большое - как обращаться с этим зверем?))) выделял и 1 и 2 таблицу, запускал макрос - ничего(((
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Андрей VG, здравствуйте!))) спасибо за пример, но пишет "указанного файла не существует" По поводу Power Query - знаю, что так можно, но пока что боюсь DAX-формул (писал в шапке темы). Жду уроков от Николая Павлова…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
С.М., огромное спасибо!!! Буду разбираться с кодом))) если можно закомментируйте, пожалуйста код - хочу понять, какие переменные участвуют, чтобы запихнуть их в диалоговые окна при запуске макроса… JeyCi, благодарю за подсказку и коррекцию))) Андрей VG и Максим Зеленский, благодарою за вариант решения через PQ - в перспективе этот вариант, скорее всего станет основным, а пока буду учить матчасть))))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
, поэтому и пришлось делать "лишнюю" операцию. Причём, если соединение по двум и более столбцам, тогда без вопросов - отрабатывает как и должно быть. Один из глюков PQL - может в последних и поправили.
An Expression.Error is thrown if a column with the same name to appear in both tables of the join unless the column is selected by both key1 and key2 and the join is an inner join.
Максим Зеленский, Андрей VG, подскажите, а эти формулы только руками вбивать или есть что-то вроде мастера функций, как в Excel - тогда дело за синтаксисом и практикой))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: а эти формулы только руками вбивать или
Jack Famous вы кнопки в надстройке нажимайте и смотрите, что получается, а в расширенном редакторе - весь код целиком увидеть можно... вопрос в том в какой последовательности какие кнопки (в зависимости от того, какие шаги по коду совершить хотите)... последовательность - это уже вопрос алгоритмизации... для получения нужного на выходе... вы не стесняйтесь знакомиться с надстройкой , если чётко себе представляете алгоритм, который вам надо закодировать [решение порождает человек, простые шаги может пройти по кнопкам на ленте PQ]... сложные моменты придётся править руками, когда захотите выполнять ювелирную работу (как с макрорекодером)...- что вызвало проблему, чтобы самому прийти к такому выводу?? - особенно после прохождения по моему линку в #10 и ответа Максима там...
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi, надо пробовать - спасибо за напутствие!)) С.М., большое спасибо вам!)) Попробую что-нибудь сделать с этим наверняка куча вопросов будет
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
С.М., посидел, посмотрел - из переменных, которые смог: разглядеть только типы, помещения и таблица. Первые 2 - в виде именованных диапазонов, а таблица и есть таблица)) не могли бы вы изменить сам принцип работы макроса? Сейчас он решает одну конкретную задачу - ни влево, ни в право, к тому же он вставляет не значения столбца, а самостоятельно индексирует третий столбец справочника. То есть, если мне нужно вставлять какой-либо другой столбец - это очень замороченная процедура получится… Прошу вас попробовать сделать нечто похожее, как я начал в #3. То есть, выбираем ключевые поля в обоих таблицах через диалоговые окна, выбираем, какой столбец справочника переносить в целевую таблицу (размножением строк) и всё. Номеров типов и слоёв ведь тоже может не быть, поэтому макрос должен считать всё самостоятельно, ориетируясь не на числа, а только на то, сколько строк переносимого столбца справочника соответствуют одному и тому же значению ключа справочника
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Доброго утра, уважаемые форумчане! АлександрС.М.согласился помочь с макросом и вот, что мы получили в итоге (выкладываю файл с макросом и отдельно модуль и класс для замечаний и предложений по оптимизации):
IfI > 1 ThenHisItems.Add NewValue, Key, , I - 1 ElseHisItems.Add NewValue, Key, I
Else
HisKeys.Remove Key
EndIf
EndProperty'Item'
PropertyGetItems()
SetItems = HisItems
EndProperty
PropertyGetKeys()
SetKeys = HisKeys
EndProperty
PropertyGetCount() AsLong
Count = HisItems.Count
EndProperty
Инструкция к макросу
1. Для работы макроса нужно 2 "умные" таблицы, условно называемые далее "справочник" и "целевая" (макрос не привязан ни к чему) 2. в "справочнике" нужно 2 столбца: "КЛЮЧ справочника" - условное обозначения объекта, расписанного по составу и "заполнение" - непосредственно состав ключа, который мы хотим перенести в "таблицу назначения" 3. в "таблице назначения" нужен только столбец, обозначающий "КЛЮЧ назначения" - по которому, собственно и будет производиться "подтягивание" состава из "справочника" 4. макрос выдаёт 3 диалоговых окна, в которых необходимо указать только 3 ЯЧЕЙКИ трёх вышеуказанных полей (КЛЮЧ и ЗАПОЛНЕНИЕ в "справочнике" и КЛЮЧ в "таблице назначения" 5. присутствует проверка на соответствие КЛЮЧЕЙ и вывод конфликтов в MsgBox с возможностью продолжить или отменить выполнение: 5.1. не все КЛЮЧИ словаря найдены в таблице назначения 5.2. не все КЛЮЧИ таблицы назначения представлены в словаре
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Отдельная благодарностьАндрей VG, Максим Зеленский и JeyCi - с их подсказок удалось довольно простым способом осуществить подобную связь в динамически обновляемом виде через запросы в Power Query - теперь, связав 2 и более таблицы через запросы по ключевым полям и удалив в этих запросах всё лишнее, можно готовый итоговый запрос выгрузить в книгу и строить сводную по нему. При изменении/дополнении/удалении данных в справочниках - всё динамически обновляется и в сводной. Теперь я серьёзно настроен на изучение Power BI в целом - спасибо, мастера!
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Максим Зеленский, да - добавить в модель данных и готово))) подскажите, пожалуйста аналоги функций СУММЕСЛИМН и СЧЁТЕСЛИМН для Power Query. Или это только через DAX в Power Pivot? А то таблички посвязывал по ключевым полям (6 штук), а этого капец как не хватает…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Андрей VG, доброй ночи! Вы мне всегда подсказывали по поводу сводных и Power Pivot - надеюсь, что и тут поможете… Прикрепил файл-пример со связкой 3х таблиц через Power Query - как вышло и чего не хватает. ЖЁЛТЫМ выделены ключевые поля ЗЕЛЁНЫМ выделены поля с формулами СИРЕНЕВЫМ выделены пользовательские столбцы с формулами в Power Query ОРАНЖЕВЫМ выделено то, чего не смог достичь внутри запросов в Power Query
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
МОДЕРАТОРАМ: предлагаю (из-за развития темы вне названия) следующее название темы - "Объединение таблиц. Макросы, Power Query и Power Pivot"
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄