Объединение таблиц / диапазонов Excel построчно - PullRequest
0 голосов
/ 16 марта 2020

У меня есть два списка. Один содержит имена, а другой содержит информацию о мастерской.

Итак, первый список выглядит так:

Name 1
Name 2
Name 3
.
.
Name X

Этот список является результатом внешнего запроса и форматируется как таблица. Время от времени его содержимое меняется.

Другой выглядит так и просто форматируется как таблица (без базового запроса):

Workshop 1
Workshop 2
Workshop 3
Workshop 4

Я хотел бы объединить эти два списка и результат должен выглядеть следующим образом:

Name 1 | Workshop 1
Name 1 | Workshop 2
Name 1 | Workshop 3
Name 1 | Workshop 4
Name 2 | Workshop 1
.
.
.
and so on.

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

У меня нет подсказки, чтобы решить эту проблему. Все, что я нашел, это о таблицах JOIN, но поэтому мне нужны некоторые общие столбцы, которых у меня нет.

Есть ли способ решить эту проблему с помощью формул / Power Queries? Или я должен использовать VBA?

Жду поддержки,

С уважением, Олаф

Ответы [ 3 ]

2 голосов
/ 16 марта 2020

A Power Query подход.

У вас есть две таблицы, созданные на листе - одна с именем NameTable другая WorkshopTable.

Создать запрос только для соединения для каждой таблицы. Я назвал эти NameTableQuery и WorkshopTableQuery:

let
    Source = Excel.CurrentWorkbook(){[Name="NameTable"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}})
in
    #"Changed Type"  

и

let
    Source = Excel.CurrentWorkbook(){[Name="WorkshopTable"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Workshop", type text}})
in
    #"Changed Type"

Теперь, чтобы создать декартово произведение двух. Начните со ссылки на один, затем добавьте другой в качестве нового столбца, который вы разверните:

let
    Source = WorkshopTableQuery,
    #"Add Names" = Table.AddColumn(Source, "Names", each NameTableQuery),
    #"Expanded Names" = Table.ExpandTableColumn(#"Add Names", "Names", {"Name"}, {"Name"})
in
    #"Expanded Names"  

Ваша финальная таблица будет:

| Workshop   | Name   |
|------------|--------|
| Workshop 1 | Name 1 |
| Workshop 1 | Name 2 |
| Workshop 1 | Name 3 |
| Workshop 1 | Name 4 |
| Workshop 1 | Name 5 |
| Workshop 2 | Name 1 |
| Workshop 2 | Name 2 |
| Workshop 2 | Name 3 |
| Workshop 2 | Name 4 |
| Workshop 2 | Name 5 |
0 голосов
/ 16 марта 2020

Вот другой подход, попробуйте эту формулу:

=OFFSET($A$1,INT((ROW()-ROW($A$1))/4),)&" | "&INDEX($B$1:$B$4,MOD(ROW()-ROW($A$1),4)+1)

enter image description here

Подробное объяснение:

  • INT((ROW()-ROW($A$1))/4) добавит +1 к порядковым номерам после 4 строк
  • MOD(ROW()-ROW($A$1),4)+1 сгенерирует порядковые номера 1,2,3,4,1,2,3,4 ..
  • Окончательное объединение их в смещение и индекс дает желаемый результат
0 голосов
/ 16 марта 2020

Попробуйте код ниже. Я предположил, что названия и семинары находятся в столбце А на соответствующих рабочих листах.

Sub JoinData()
  Dim wsName As Wroksheet, wsWorkshop As Worksheet, wsResult As Worksheet
  Set wsName = Worksheets("Worksheet with names")
  Set wsWorkshop = Worksheets("Worksheet with workshops")
  Set wsResult = Worksheets("Worksheet to put results in")

  Dim lastRowName As Long, lastRowWorkshop As Long, i As Long, j As Long, k As Long
  Dim columnWithNames As Long, columnWithWorkshops
  ' here you mark, which columns hold the data
  columnWithNames = 1
  columnWithWorkshops = 1
  lastRowName = wsName.Cells(Rows.Count, columnWithNames).End(xlUp).Row
  lastRowWorkshop = wsWorkshop.Cells(Rows.Count, columnWithWorkshops).End(xlUp).Row

  k = 1
  For i = 1 To lastRowName
  For j = 1 To lastRowWorkshop
    wsResult.Cells(k, 1) = lastRowName.Cells(i, columnWithNames)
    wsResult.Cells(k, 2) = lastRowWorkshop.Cells(j, columnWithWorkshops)
    k = k + 1
  Next
  Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...