Vba excel объединение таблиц

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#1

17.11.2016 21:59:29

Доброго вечера, уважаемые форумчане!
Прошу вашей помощи в организации связи «один-ко-многим» между двумя таблицами через макрос. От создания сводных по нескольким таблицам (это также решило бы проблему) пока отказался, ввиду слабого знания материала и опасений «накосячить», а макрос есть макрос — из созданной им таблицы я всегда смогу отличную сводную построить.
Не воспринимайте, пожалуйста, как ТЗ — выложил все мысли по теме, может чем-то поможет…

В посте №24 — рабочий макрос.

Пример такой (описание файла-примера):

Детали по макросу (как примерно я это вижу):

Комментарии:

Примеры похожих проблем:

Инструкция по использованию спойлеров на форуме

Прикрепленные файлы

  • Сложное объединение таблиц.xlsx (15.43 КБ)

Изменено: Jack Famous24.11.2016 09:31:50

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

SuperCat

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

Опять ТЗ строчим?

There is no knowledge that is not power

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#3

17.11.2016 22:47:53

SuperCat, так и знал)))) да вот как ни напишу — всё как ТЗ выглядит))))

Вот то, что смог по теме в VBA)))

Изменено: Jack Famous18.11.2016 00:10:27

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

С.М.

Пользователь

Сообщений: 936
Регистрация: 22.12.2012

#4

18.11.2016 02:51:45

Тренировка скрывания под спойлер

Изменено: С.М.18.11.2016 02:55:06

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

С.М., наконец-то первый вариант по теме))))) спасибо вам большое — как обращаться с этим зверем?))) выделял и 1 и 2 таблицу, запускал макрос — ничего(((

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#6

18.11.2016 12:11:34

Доброе время суток

Цитата
Сложное объединение двух таблиц.

Несколько щелчков мышкой… в Power Query. И выясняется, что в результате есть ошибочка :)
Успехов.

Прикрепленные файлы

  • Копия Копия Сложное объединение таблиц.xlsx (26.85 КБ)

Изменено: Андрей VG18.11.2016 12:12:23
(Файл не той системы приложил.)

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Андрей VG, здравствуйте!))) спасибо за пример, но пишет «указанного файла не существует»
По поводу Power Query — знаю, что так можно, но пока что боюсь DAX-формул (писал в шапке темы). Жду уроков от Николая Павлова…

Изменено: Jack Famous18.11.2016 12:15:52

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#8

18.11.2016 12:15:38

Цитата
Jack Famous написал:
«указанного файла не существует»

Вы слишком быстро пришли за примером. Обнаружил, что не ту версию файла прикрепил. Переложил, и тут вы — качать… Накладка, однако :)

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Андрей VG, спасибо большое)))) есть возможность рассказать, как эту динамическую связку организовывать? Я бы в динамике всё построил…

Изменено: Jack Famous18.11.2016 12:19:51

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#10

18.11.2016 12:29:23

Цитата
Jack Famous написал: По поводу Power Query — знаю, что так можно, но пока что боюсь DAX-формул

не делайте непроверенных выводов!.. в PQ — язык другой (M-language), язык DAX в PP
p.s. см.  

#14 —> Расширенный редактор

Изменено: JeyCi18.11.2016 12:32:33

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Максим Зеленский

Пользователь

Сообщений: 4646
Регистрация: 11.06.2014

Microsoft MVP

#11

18.11.2016 12:31:51

Можно чуть подсократить:

Код
let
    Источник = Excel.CurrentWorkbook(){[Name="помещения"]}[Content],
    #"Объединенные запросы" = Table.NestedJoin(Источник,{"№ типа"},типы,{"№ типа"},"NewColumn",JoinKind.LeftOuter),
    #"Развернутый элемент NewColumn" = Table.ExpandTableColumn(#"Объединенные запросы", "NewColumn", {"Формула"}, {"Формула"}),
    #"Сортированные строки" = Table.Sort(#"Развернутый элемент NewColumn",{{"№ пом.", Order.Ascending}, {"Формула", Order.Ascending}}),
    #"Переименованные столбцы1" = Table.RenameColumns(#"Сортированные строки",{{"Формула", "Материал"}}),
    #"Changed Type" = Table.TransformColumnTypes(#"Переименованные столбцы1",{{"№ пом.", Int64.Type}, {"№ типа", Int64.Type}})
in
    #"Changed Type"

F1 творит чудеса

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#12

18.11.2016 13:05:09

Цитата
Максим Зеленский написал: Можно чуть подсократить:

Конечно!

Код
let
    types = Excel.CurrentWorkbook(){[Name="типы"]}[Content],
    houses = Excel.CurrentWorkbook(){[Name="помещения"]}[Content],
    renHouses = Table.RenameColumns(houses, { {"№ типа", "typeName"} }),
    joined = Table.Join(renHouses, {"typeName"}, types, {"№ типа"})[[#"№ пом."], [#"№ типа"], [Формула]]
in
    Table.RenameColumns(joined, { {"Формула", "Материал"} })
 

С.М.

Пользователь

Сообщений: 936
Регистрация: 22.12.2012

#13

18.11.2016 13:27:25

Цитата
Jack Famous написал #5:
С.М. , как обращаться с этим зверем?))) выделял и 1 и 2 таблицу, запускал макрос — ничего(((

Не надо ничего выделять, жмём кнопку :

Прикрепленные файлы

  • Сложное объединение таблиц.1.xlsb (27 КБ)

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

С.М., огромное спасибо!!! Буду разбираться с кодом)))
если можно закомментируйте, пожалуйста код — хочу понять, какие переменные участвуют, чтобы запихнуть их в диалоговые окна при запуске макроса…
JeyCi, благодарю за подсказку и коррекцию)))

Андрей VG

и

Максим Зеленский

, благодарою за вариант решения через PQ — в перспективе этот вариант, скорее всего станет основным, а пока буду учить матчасть))))

Изменено: Jack Famous18.11.2016 13:45:07

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Максим Зеленский

Пользователь

Сообщений: 4646
Регистрация: 11.06.2014

Microsoft MVP

#15

18.11.2016 15:11:30

Андрей VG, нет предела совершенству  :D

Скрытый текст

Изменено: Максим Зеленский18.11.2016 15:12:10

F1 творит чудеса

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#16

18.11.2016 15:33:34

Максим, у меня PQL через раз ругается, что не может выполнить Join из-за одинаковых названий столбцов

Код
Table.Join(houses, {"№ типа"}, types, {"№ типа"})

, поэтому и пришлось делать «лишнюю» операцию. Причём, если соединение по двум и более столбцам, тогда без вопросов — отрабатывает как и должно быть. Один из глюков PQL — может в последних и поправили.

 

странно, у меня не ругается…

 

Максим Зеленский

Пользователь

Сообщений: 4646
Регистрация: 11.06.2014

Microsoft MVP

#18

18.11.2016 16:46:01

я думаю, в этом дело:

Цитата
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.

F1 творит чудеса

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Максим Зеленский, Андрей VG, подскажите, а эти формулы только руками вбивать или есть что-то вроде мастера функций, как в Excel — тогда дело за синтаксисом и практикой))

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#20

18.11.2016 18:24:47

Цитата
Jack Famous написал: а эти формулы только руками вбивать или

Jack Famous

вы кнопки в надстройке нажимайте и смотрите, что получается, а в расширенном редакторе — весь код целиком увидеть можно… вопрос в том в какой последовательности какие кнопки (в зависимости от того, какие шаги по коду совершить хотите)… последовательность — это уже вопрос алгоритмизации… для получения нужного на выходе… вы не стесняйтесь знакомиться с надстройкой  ;) , если чётко себе представляете алгоритм, который вам надо закодировать [решение порождает человек, простые шаги может пройти по кнопкам на ленте PQ]… сложные моменты придётся править руками, когда захотите выполнять ювелирную работу (как с макрорекодером) — что вызвало проблему, чтобы самому прийти к такому выводу??особенно после прохождения по моему линку в #10 и ответа Максима там…

Изменено: JeyCi18.11.2016 18:30:27

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

С.М.

Пользователь

Сообщений: 936
Регистрация: 22.12.2012

#21

18.11.2016 20:05:07

Цитата
Jack Famous написал:
С.М. , Буду разбираться с кодом)))
если можно закомментируйте, пожалуйста код — хочу понять, какие переменные участвуют

Вот:

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

JeyCi, надо пробовать — спасибо за напутствие!))
С.М., большое спасибо вам!)) Попробую что-нибудь сделать с этим ;)  наверняка куча вопросов будет  :D

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

С.М., посидел, посмотрел — из переменных, которые смог: разглядеть только типы, помещения и таблица. Первые 2 — в виде именованных диапазонов, а таблица и есть таблица)) не могли бы вы изменить сам принцип работы макроса? Сейчас он решает одну конкретную задачу — ни влево, ни в право, к тому же он вставляет не значения столбца, а самостоятельно индексирует третий столбец справочника. То есть, если мне нужно вставлять какой-либо другой столбец — это очень замороченная процедура получится…
Прошу вас попробовать сделать нечто похожее, как я начал в #3. То есть, выбираем ключевые поля в обоих таблицах через диалоговые окна, выбираем, какой столбец справочника переносить в целевую таблицу (размножением строк) и всё. Номеров типов и слоёв ведь тоже может не быть, поэтому макрос должен считать всё самостоятельно, ориетируясь не на числа, а только на то, сколько строк переносимого столбца справочника соответствуют одному и тому же значению ключа справочника

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#24

24.11.2016 09:41:44

Доброго утра, уважаемые форумчане!
Александр С.М. согласился помочь с макросом и вот, что мы получили в итоге (выкладываю файл с макросом и отдельно модуль и класс для замечаний и предложений по оптимизации):

В модуле

В Class1 раздела Class Modules

Инструкция к макросу

Прикрепленные файлы

  • Объединение таблиц.xlsb (24.13 КБ)

Изменено: Jack Famous24.11.2016 10:25:06

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Отдельная благодарность Андрей VG, Максим Зеленский и JeyCi — с их подсказок удалось довольно простым способом осуществить подобную связь в динамически обновляемом виде через запросы в Power Query — теперь, связав 2 и более таблицы через запросы по ключевым полям и удалив в этих запросах всё лишнее, можно готовый итоговый запрос выгрузить в книгу и строить сводную по нему. При изменении/дополнении/удалении данных в справочниках — всё динамически обновляется и в сводной.
Теперь я серьёзно настроен на изучение Power BI в целом — спасибо, мастера!  8)

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Максим Зеленский

Пользователь

Сообщений: 4646
Регистрация: 11.06.2014

Microsoft MVP

#26

29.11.2016 15:40:57

Цитата
Jack Famous написал:
можно готовый итоговый запрос выгрузить в книгу

Можно и не выгружать

F1 творит чудеса

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Максим Зеленский, да — добавить в модель данных и готово))) подскажите, пожалуйста аналоги функций СУММЕСЛИМН и СЧЁТЕСЛИМН для Power Query. Или это только через DAX в Power Pivot? А то таблички посвязывал по ключевым полям (6 штук), а этого капец как не хватает…

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#28

29.11.2016 21:21:22

Доброе время суток

Цитата
Jack Famous написал:
аналоги функций СУММЕСЛИМН и СЧЁТЕСЛИМН для Power Query

Смотря что вы под этим подразумеваете. В общем случае — фильтрация по критериям и группировка (плоская сводная таблица).

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Андрей VG, доброй ночи!
Вы мне всегда подсказывали по поводу сводных и Power Pivot — надеюсь, что и тут поможете… Прикрепил файл-пример со связкой 3х таблиц через Power Query — как вышло и чего не хватает.
ЖЁЛТЫМ выделены ключевые поля
ЗЕЛЁНЫМ выделены поля с формулами
СИРЕНЕВЫМ выделены пользовательские столбцы с формулами в Power Query
ОРАНЖЕВЫМ выделено то, чего не смог достичь внутри запросов в Power Query

Изменено: Jack Famous30.11.2016 00:24:07

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#30

30.11.2016 00:27:28

МОДЕРАТОРАМ: предлагаю (из-за развития темы вне названия) следующее название темы — «Объединение таблиц. Макросы, Power Query и Power Pivot»

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

Содержание

  1. Vba excel объединение таблиц
  2. Слияние двух таблиц Excel (с использованием VBA)
  3. Редактировать:
  4. Vba excel объединение таблиц

Vba excel объединение таблиц

Существует две таблицы с данными:

  • Таблица Goods в которой хранятся товары.
  • Таблица Costs в которой хранятся цены этих товаров.

Нужно связать эти две таблицы в одну, получив, тем самым таблицу, содержащую в себе как товары, так и их цены (разбиты по городам). В обеих таблица существует поле «Номенклатурный номер», по которому и предполагается связывать данные из исходных таблиц. Проще говоря, нужно получить таблицу Result, добавив в таблицу Goods последние четыре столбца из таблицы Costs, на основании эквивалентности поля «Номенклатурного номер».

Excel 2003
Файл с книгой прикрепил.

Вложения

Catalog.rar (352.6 Кб, 63 просмотров)

У Вас там косяк в номере 400019075.
Если последние 4, то отработал код из http://hugo.nxt.ru/CompareFiles.Find.rar
1146 совпадений.

Настройки:
Файл — приёмник: C:tempVectorCКаталог.xls
Файл — источник: C:tempVectorCКаталог.xls
Столбцы сравнения в приёмнике: a
Столбцы сравнения в источнике: a
Лист — приёмник (№): 1
Лист — источник (№): 2
Столбцы — приёмники данных копирования: O,P,Q,R
Столбцы — источники данных копирования: E,F,G,H

Добиваем первый лист данными второго. Можно сперва на лист Result скопировать данные первого листа и добивать туда.

Спасибо, только у меня почему-то ничего не получилось.
Пишет:

Object doesn’t support this property or method

В чём косяк номера 400019075?

Жаль. Версия Экселя какая у Вас? У меня на 2000 и 2007 работает.
А косяк в том, что 400019075 два раза в таблице — один раз данных больше.

Хотя именно под эту задачу несложно макрос на массиве написать — вечером могу сделать, если раньше не напишут.

Источник

Слияние двух таблиц Excel (с использованием VBA)

Я пытался выяснить, как объединить две таблицы из одной книги в третью, используя VBA. Пример:

Отключенный выход (рабочий лист3):

Мне понадобится решение VBA, так как исходные таблицы занимают около 400 строк, и мне нужно будет выполнить одну и ту же операцию для нескольких книг. Я был бы очень признателен за любое предложение по этой проблеме!

Редактировать:

Если это кому-то интересно, мне удалось создать рабочий код. Worksheet1 был псевдонимом для «Импорт списка», а Worksheet2 — «Экспорт списка». В обоих листах я вставил столбец (C), в котором указаны обе страны. Я использовал этот новый столбец и значения для построения таблицы в Worksheet3 (теперь «Combolist»).

Хотя это можно решить с помощью VBA, вам, вероятно, будет лучше использовать формулы (если вы не должны делать это очень часто). Решение VBA потребует некоторых ноу-хау и даже больше, если вы хотите иметь возможность поддерживать решение.

Формула Excel будет довольно простой. Сначала создайте столбец UniqueID :

Вы бы сделали то же самое для обеих таблиц. Затем получите все уникальные уникальные UniqueID . Для этого вы можете использовать Data > Remove Duplicates , просто сделайте копию перед удалением дубликатов, иначе вы удалите записи из вашего источника. Поместите этот список UniqueID в новую Table . Имейте в виду, что все это будет проще, если все ваши данные находятся в формате Table (вы увидите вкладку » Table » в ленте, когда внутри диапазона таблицы.

Если вам нужно отформатировать данные в виде таблицы, перейдите на рабочий лист, нажмите CTRL+HOME (это относится к самой первой ячейке). Если ваша первая ячейка находится в другом месте, просто перейдите туда. Если ваша таблица является единственной информацией на листе, попробуйте использовать CTRL+SHIFT+END чтобы выделить ее для последней используемой ячейки. В противном случае комбинация CTRL+SHIFT+RIGHT и CTRL+SHIFT+DOWN доставит вам то, что вам нужно. Наконец, назовите свой стол для любви ко всему, что превосходит, эта простая привычка экономит массу времени. В моем примере я предполагаю, что у вас есть таблица » Primary и Secondary .

Наша формула в нашей комбинированной таблице будет выглядеть примерно так:

=IfError(Vlookup([UniqueID], Primary, Column(Primary[Value]), False), «»)

Или, если ваша Primary таблица не начинается в первом столбце, используйте это:

=IfError(Vlookup([UniqueID], Primary, 4, False), «»)

Разница здесь в том, что первая изменит индекс при перемещении столбца, последний не будет и должен быть отредактирован при редактировании таблицы.

Сделайте то же самое в следующем столбце для другой таблицы:

=IfError(Vlookup([UniqueID], Secondary, Column(Primary[Value]), False), «»)

=IfError(Vlookup([UniqueID], Secondary, 4, False), «»)

Это «объединит» два набора на основе общего UniqueID и оставит пробелы, если запись не существует. Изучение того, как это сделать, может быть менее удобным, чем изучение того, как это сделать в VBA, но я бы сильно отговорил вас от изучения VBA, если вы не можете использовать такую реализацию.

Чтобы быть ясным, причина, по которой формульный подход является идеальным в этом случае, заключается в том, что задача, которую вы просите о помощи, очень проста, и вы бы лучше развивали свои навыки Excel, поскольку, делая это, позволят вам решать аналогичные задачи гораздо быстрее в будущем. Даже новичок может реализовать это решение в течение 15 минут или около того, где вам легко понадобится время, чтобы изучить масштабируемое решение VBA.

Источник

Vba excel объединение таблиц

Модератор форума: _Boroda_, китин

Мир MS Excel » Вопросы и решения » Excel и другие приложения » Google Docs » Скрипт объединения нескольких таблиц в одну (Формулы/Formulas)

Скрипт объединения нескольких таблиц в одну

Kashimirush Дата: Четверг, 27.02.2020, 15:50 | Сообщение № 1

function supercopy2() <
var app = SpreadsheetApp;
//Указываем ID целевой страницы
var SheetID = ‘Ваш АЙДИ’;
//Задаем начальную строку массива (это заголовок из целевой таблицы)
var DataAll = app.openById(SheetID).getSheetByName(‘Реестр’).getRange(1, 1, 1, 4).getValues();
//Перечисляем мини реестры:
var arrID = [‘Ваш АЙДИ1’,
‘Ваш АЙДИ2’,
‘Ваш АЙДИ3’]
var i = 1;

//Запускаем цикл
while (i

function supercopy2() <
var app = SpreadsheetApp;
//Указываем ID целевой страницы
var SheetID = ‘Ваш АЙДИ’;
//Задаем начальную строку массива (это заголовок из целевой таблицы)
var DataAll = app.openById(SheetID).getSheetByName(‘Реестр’).getRange(1, 1, 1, 4).getValues();
//Перечисляем мини реестры:
var arrID = [‘Ваш АЙДИ1’,
‘Ваш АЙДИ2’,
‘Ваш АЙДИ3’]
var i = 1;

Ответить

function supercopy2() <
var app = SpreadsheetApp;
//Указываем ID целевой страницы
var SheetID = ‘Ваш АЙДИ’;
//Задаем начальную строку массива (это заголовок из целевой таблицы)
var DataAll = app.openById(SheetID).getSheetByName(‘Реестр’).getRange(1, 1, 1, 4).getValues();
//Перечисляем мини реестры:
var arrID = [‘Ваш АЙДИ1’,
‘Ваш АЙДИ2’,
‘Ваш АЙДИ3’]
var i = 1;

//Запускаем цикл
while (i Автор — Kashimirush
Дата добавления — 27.02.2020 в 15:50

Gustav Дата: Четверг, 27.02.2020, 18:13 | Сообщение № 2

ИМХО (ниже всё ИМХО — можно слушать меня, а можно и нет), излишне, ничего не экономится, а с толку при чтении кода сбивает

«.toString()» тут излишне, здесь строка и так «сложится» с числом как надо (как с & в VBA)

Переменная ss практически устойчиво в листингах GAS обозначает объект (s)pread(s)heet. Использовать ss для range — как-то совсем не комильфо (даже ни одной буквы не совпадает). Для диапазона лучше range или rng, для листа — sheet или sht. Помните о потенциальных читателях Вашего кода!

ИМХО (ниже всё ИМХО — можно слушать меня, а можно и нет), излишне, ничего не экономится, а с толку при чтении кода сбивает

«.toString()» тут излишне, здесь строка и так «сложится» с числом как надо (как с & в VBA)

Переменная ss практически устойчиво в листингах GAS обозначает объект (s)pread(s)heet. Использовать ss для range — как-то совсем не комильфо (даже ни одной буквы не совпадает). Для диапазона лучше range или rng, для листа — sheet или sht. Помните о потенциальных читателях Вашего кода! Gustav

ИМХО (ниже всё ИМХО — можно слушать меня, а можно и нет), излишне, ничего не экономится, а с толку при чтении кода сбивает

«.toString()» тут излишне, здесь строка и так «сложится» с числом как надо (как с & в VBA)

Переменная ss практически устойчиво в листингах GAS обозначает объект (s)pread(s)heet. Использовать ss для range — как-то совсем не комильфо (даже ни одной буквы не совпадает). Для диапазона лучше range или rng, для листа — sheet или sht. Помните о потенциальных читателях Вашего кода! Автор — Gustav
Дата добавления — 27.02.2020 в 18:13

anvg Дата: Четверг, 27.02.2020, 21:33 | Сообщение № 3
Kashimirush Дата: Пятница, 28.02.2020, 07:52 | Сообщение № 4
Работа, работа, перейди на Федота.

Ответить

Kashimirush Дата: Пятница, 28.02.2020, 07:55 | Сообщение № 5
Работа, работа, перейди на Федота.

Ответить

Kashimirush Дата: Пятница, 28.02.2020, 07:56 | Сообщение № 6
Работа, работа, перейди на Федота.

Ответить

Kashimirush Дата: Пятница, 28.02.2020, 08:59 | Сообщение № 7
Работа, работа, перейди на Федота.

Ответить

anvg Дата: Пятница, 28.02.2020, 11:09 | Сообщение № 8

разница в подходах: процедурный для for, while и функциональный для forEach, map, filter, reduce и т. д.. По большому счёту — дело вкуса.

разница в подходах: процедурный для for, while и функциональный для forEach, map, filter, reduce и т. д.. По большому счёту — дело вкуса.

разница в подходах: процедурный для for, while и функциональный для forEach, map, filter, reduce и т. д.. По большому счёту — дело вкуса.

Kashimirush Дата: Понедельник, 02.03.2020, 15:29 | Сообщение № 9

это получается такой же массив форматов собирать со всех таблиц, пока воздержусь от нагромождений в коде, задал в общий реестр такие же форматы как в таблицах донорах, всё пока работает.

Вопрос по форматированию задал, потому что время как то не правильно переходило на 26 минут меньше), оказалось таблицы просто в разных часовых поясах были.

это получается такой же массив форматов собирать со всех таблиц, пока воздержусь от нагромождений в коде, задал в общий реестр такие же форматы как в таблицах донорах, всё пока работает.

Вопрос по форматированию задал, потому что время как то не правильно переходило на 26 минут меньше), оказалось таблицы просто в разных часовых поясах были. Kashimirush

Работа, работа, перейди на Федота.

это получается такой же массив форматов собирать со всех таблиц, пока воздержусь от нагромождений в коде, задал в общий реестр такие же форматы как в таблицах донорах, всё пока работает.

Вопрос по форматированию задал, потому что время как то не правильно переходило на 26 минут меньше), оказалось таблицы просто в разных часовых поясах были. Автор — Kashimirush
Дата добавления — 02.03.2020 в 15:29

Источник

Adblock
detector

Студворк — интернет-сервис помощи студентам

Добрый день!

Excel’ем приходится пользоваться нечасто, поэтому прошу не пинать

Суть задачи:
Есть несколько таблиц с одинаковыми шапками на разных листах (Время — Событие — прочие данные).

Требуется на отдельном листе создать общую таблицу, которая будет банально объединять в себя все строчки из моих таблиц.
То есть итоговая таблица должна содержать все строки из исходных как если бы мы их копировали вручную. Желательно, при этом, чтобы она была динамической (при изменении/добавлении данных в исходные она должна обновляться).
Консолидация — не то что нужно, как я понял.

Пример:
Таблица 1:
10:30 — Подъём
11:30 — Завтрак

Таблица 2:
10:45 — Зарядка
15:40 — Обед

Итоговая таблица:
10:30 — Подъём
11:30 — Завтрак
10:45 — Зарядка
15:40 — Обед

Заранее спасибо!

Depending on whether or not you have duplicate values on either sheet, I could think of a few ideas, not using SQL though.

  • Get LastRow of SourceSheet1 & SourceSheet2 — Set them as variables lastRow1 & lastRow2
  • Create a row ticker for each sheet. s1Row, s2Row, tRow
  • set tRow = 2 For the TargetSheet’s first line
  • Use For loop to cycle through each row of SourceSheet1. Using something like this
  • When the first part of code is done looping, you will be finished adding every item from SourceSheet1 onto the TargetSheet. Then you will have to check the values from SourceSheet2 to see if any were unique to that list.
  • When that is done, you should have only added the ones that were missing from your initial search. Then the targetSheet will be in the order of SourceSheet1 All Items, then the extra items from SourceSheet2

SET VARIABLES

Private Sub JoinLists()

Dim rng As Range
Dim typeName As String
Dim matchCount As Integer
Dim s1Row As Integer
Dim s2Row As Integer
Dim tRow As Integer
Dim m As Integer
Dim lastRow1 As Integer
Dim lastRow2 As Integer
Dim SourceSheet1 As String
Dim SourceSheet2 As String
Dim TargetSheet As String

SourceSheet1 = "Source1"
SourceSheet2 = "Source2"
TargetSheet = "Target"

tRow = 2

lastRow1 = Sheets(SourceSheet1).Range("A65536").End(xlUp).row
lastRow2 = Sheets(SourceSheet2).Range("A65536").End(xlUp).row

PHASE ONE: Copying every entry from Sheet1 to Target, while grabbing matches from Sheet2

Set rng = Sheets(SourceSheet2).Range("A2:A" & lastRow2)

For s1Row = 2 To lastRow1
    typeName = Sheets(SourceSheet1).Cells(s1Row, 1)
    matchCount = Application.WorksheetFunction.CountIf(rng, typeName)

    'Set the Row up on the TargetSheet. No matter if it's a match.
    Sheets(TargetSheet).Cells(tRow, 1) = typeName
    Sheets(TargetSheet).Cells(tRow, 2) = Sheets(SourceSheet1).Cells(s1Row, 2)
    Sheets(TargetSheet).Cells(tRow, 3) = Sheets(SourceSheet1).Cells(s1Row, 3)

    'Check to see if there are any matches on SourceSheet2

    If matchCount = 0 Then
    'There are NO matches.  Add Zeros to the extra columns
        Sheets(TargetSheet).Cells(tRow, 4) = 0
        Sheets(TargetSheet).Cells(tRow, 5) = 0
    Else
       'Get first matching occurance on the SourceSheet2
        m = Application.WorksheetFunction.Match(typeName, rng, 0)
        'Get Absolute Row number of that match
        s2Row = m + 1    ' This takes into account the Header Row, as index 1 is Row 2 of the search Range
        'Set the extra columns on TargetSheet to the Matches on SourceSheet2
        Sheets(TargetSheet).Cells(tRow, 4) = Sheets(SourceSheet1).Cells(s2Row, 2)
        Sheets(TargetSheet).Cells(tRow, 5) = Sheets(SourceSheet1).Cells(s2Row, 3)
    End If

    tRow = tRow + 1
Next s1Row

PHASE TWO: Checking SourceSheet2 for Entries NOT on Sheet1

Set rng = Sheets(SourceSheet1).Range("A2:A" & lastRow1)

For s2Row = 2 To lastRow2
    typeName = Sheets(SourceSheet2).Cells(s2Row, 1)
    matchCount = Application.WorksheetFunction.CountIf(rng, typeName)

    If matchCount = 0 Then
    'There are NO matches.  Add to Target Sheet
        Sheets(TargetSheet).Cells(tRow, 1) = typeName
        Sheets(TargetSheet).Cells(tRow, 2) = 0
        Sheets(TargetSheet).Cells(tRow, 3) = 0
        Sheets(TargetSheet).Cells(tRow, 4) = Sheets(SourceSheet2).Cells(s2Row, 2)
        Sheets(TargetSheet).Cells(tRow, 5) = Sheets(SourceSheet2).Cells(s2Row, 3)
        tRow = tRow + 1
    'Not doing anything for the matches, because they were already added.
    End If
Next s2Row
End Sub

Finished Tested Code Results

EDIT: typo correction

Скрипт объединения нескольких таблиц в одну

Kashimirush

Дата: Четверг, 27.02.2020, 15:50 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 240


Репутация:

40

±

Замечаний:
0% ±


Excel 2010

Всем привет!
Набросал скрипт для суммирования 3 дочерних таблиц в 1. Долго боролся с циклом, он не хотел сливать данные из цикла в пустую переменную var DataAll, и пришлось её обозначить как заголовок, как можно это обойти, и в целом какие косяки вы ещё видите в скрипте, вашим опытным взглядом?


Работа, работа, перейди на Федота…

 

Ответить

Gustav

Дата: Четверг, 27.02.2020, 18:13 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

985

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

не хотел сливать данные из цикла в пустую переменную var DataAll, и пришлось её обозначить как заголовок, как можно это обойти

Объявить как пустой массив:
[vba][/vba]

var app = SpreadsheetApp;

ИМХО (ниже всё ИМХО — можно слушать меня, а можно и нет), излишне, ничего не экономится, а с толку при чтении кода сбивает

var i = 1;

//Запускаем цикл
while (i<=arrID.length){

Ну, во-первых, надо привыкать, что счетчик элементов массива в GAS (как и в JS) начинается с 0, а попытка искусственно начать цикл с 1 сразу обрастает лишним утомительным кодом. Тут надо избавляться от привычек VBA (хотя, грешным делом, сам всегда любил, чтобы индекс начинался с 1).

Во-вторых, цикл. При четко известном заранее максимальном i, равным длине массива минус 1, гораздо нагляднее использовать цикл for. В нём всё рядом в одной строке — и начало, и конец, и приращение:
[vba]

Код

for (var i = 0; i < arrID.length; i++) {
}

[/vba]

//Получаем нужные диапазоны
var ss = sss.getRange(‘A2:D’+ sss.getLastRow().toString());

«.toString()» тут излишне, здесь строка и так «сложится» с числом как надо (как с & в VBA)

Переменная ss практически устойчиво в листингах GAS обозначает объект (s)pread(s)heet. Использовать ss для range — как-то совсем не комильфо (даже ни одной буквы не совпадает). Для диапазона лучше range или rng, для листа — sheet или sht. Помните о потенциальных читателях Вашего кода!


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал GustavЧетверг, 27.02.2020, 19:19

 

Ответить

anvg

Дата: Четверг, 27.02.2020, 21:33 |
Сообщение № 3

Группа: Друзья

Ранг: Ветеран

Сообщений: 581


Репутация:

271

±

Замечаний:
0% ±


2016, 365

Доброе время суток.
Ещё один вариант сбора голой (ну, почти) функциональщиной :) без явного цикла.
[vba]

Код

 

    const app = SreadsheetApp;
    const dataAll = [
        ‘Ваш АЙДИ1’,
        ‘Ваш АЙДИ2’,
        ‘Ваш АЙДИ3’
    ].reduce(function (combo, nextName) {
        const sheet = app.openById(nextName).getSheetByName(‘Лист1’);
        const sourceRange = sheet.getRange(‘A2:D’ + sheet.getLastRow());
        return combo.concat(sourceRange.getValues());
    }, []); // последнее, можно и заголовком — вдруг надо? [[‘ColA’, ‘ColB’, ‘ColC’, ‘ColD’]]

[/vba]

Сообщение отредактировал anvgЧетверг, 27.02.2020, 21:34

 

Ответить

Kashimirush

Дата: Пятница, 28.02.2020, 07:52 |
Сообщение № 4

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 240


Репутация:

40

±

Замечаний:
0% ±


Excel 2010

Объявить как пустой массив:

Работает, я не верно задавал var DataAll = [[],[]]

гораздо нагляднее использовать цикл for.

Из-за дилетантности знаний, не все фишки знаю, попробую через, for, а с единицы я начал чисто интуитивно, потом еще допереть не мог почему он берет не все таблицы доноры.
Вообще , я 3 часа голову ломал почему код не работает как надо, т.к. изначально задал var i = arrID.length

Честно говоря как этот метод работает я даже не представляю, тупо скопировал из работающего кода, другой таблицы.


Работа, работа, перейди на Федота…

 

Ответить

Kashimirush

Дата: Пятница, 28.02.2020, 07:55 |
Сообщение № 5

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 240


Репутация:

40

±

Замечаний:
0% ±


Excel 2010

var app = SpreadsheetApp;

Тут не понял в чем проблема?


Работа, работа, перейди на Федота…

 

Ответить

Kashimirush

Дата: Пятница, 28.02.2020, 07:56 |
Сообщение № 6

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 240


Репутация:

40

±

Замечаний:
0% ±


Excel 2010

anvg, А есть преимущества/недостатки, в чем разница методов?


Работа, работа, перейди на Федота…

 

Ответить

Kashimirush

Дата: Пятница, 28.02.2020, 08:59 |
Сообщение № 7

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 240


Репутация:

40

±

Замечаний:
0% ±


Excel 2010

И еще вопрос по поводу формата данных, как сохранить формат данных из таблиц исходников?


Работа, работа, перейди на Федота…

 

Ответить

anvg

Дата: Пятница, 28.02.2020, 11:09 |
Сообщение № 8

Группа: Друзья

Ранг: Ветеран

Сообщений: 581


Репутация:

271

±

Замечаний:
0% ±


2016, 365

разница в подходах: процедурный для for, while и функциональный для forEach, map, filter, reduce и т. д.. По большому счёту — дело вкуса.

как сохранить формат данных из таблиц исходников?

Точно также как и со значениями. getTextStyles, getNumberFormats и т. д. сведение в общий массив и обратно setTextStyles, setNumberFormats…

 

Ответить

Kashimirush

Дата: Понедельник, 02.03.2020, 15:29 |
Сообщение № 9

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 240


Репутация:

40

±

Замечаний:
0% ±


Excel 2010

Вот что получилось итоговый скрипт V4.2

Точно также как и со значениями.

это получается такой же массив форматов собирать со всех таблиц, пока воздержусь от нагромождений в коде, задал в общий реестр такие же форматы как в таблицах донорах, всё пока работает.

Вопрос по форматированию задал, потому что время как то не правильно переходило на 26 минут меньше), оказалось таблицы просто в разных часовых поясах были.


Работа, работа, перейди на Федота…

Сообщение отредактировал KashimirushПонедельник, 02.03.2020, 15:34

 

Ответить

Like this post? Please share to your friends:
  • Vba excel общая переменная
  • Vba excel найти все ячейки со значением
  • Vba excel обход ошибок
  • Vba excel найти все значения в диапазоне
  • Vba excel обращение к ячейке по индексу