从多列创建值列表

Create list of values from multiple columns

数据库

   |      A    |          B         |        C         |         D        |
---|-----------|--------------------|------------------|------------------|---
1  |   Flight  |    Crew Member 1   |  Crew Member 2   |   Crew Member 3  |
2  |    F001   |       Michael      |     Katrin       |       Karl       |
3  |    F002   |       Jennifer     |     Peter        |       Karl       |
4  |    F003   |       Peter        |                  |                  |
5  |    F004   |       Karl         |     Michael      |                  |
6  |    F005   |       Jennifer     |     Michael      |       Katrin     |
7  |    F006   |       Peter        |     Karl         |       Michael    |
8  |    F007   |       Karl         |     Jennifer     |                  |

注:

  1. table 中的每个名称都是唯一的。
  2. 每个名字每行只能出现一次。

预期结果

   |      E        |          F         |      
---|---------------|--------------------|--
1  |      Name     |       Flights      |  
2  |    Jennifer   |       F002         |
3  |    Jennifer   |       F005         |
4  |    Jennifer   |       F007         | 
5  |    Katrin     |       F001         |
6  |    Katrin     |       F005         |
7  |    Karl       |       F001         |
8  |    Karl       |       F002         | 
9  |    Karl       |       F004         | 
10 |    Karl       |       F006         | 
11 |    Karl       |       F007         | 
12 |    Michael    |       F001         | 
13 |    Michael    |       F004         | 
14 |    Michael    |       F005         | 
15 |    Michael    |       F006         | 
16 |    Peter      |       F002         | 
17 |    Peter      |       F003         | 
18 |    Peter      |       F006         | 

如您在 data-base 中所见,有一个包含多个航班的列表。
Columns B:D 中显示每个航班的机组人员。


现在我想列出每个机组成员的所有航班。

因此,我想知道我需要什么公式

a)根据在Column B:D中出现的次数列出Column E中的所有剧组成员
b)Column F

中将每个航班分配给他们

你知道如何解决这个问题吗?

在这种情况下,我会选择 PowerQuery。

  • 步骤 1) - Select 您的 table 并将其加载到 PowerQuery 中。
  • 第 2 步) - Select 'Flight' 列和逆透视其余部分。
  • 步骤 3) - 删除包含 Crewmembers 的列。
  • 步骤 4) - 对 'Value' 列进行升序排序并过滤掉空行。

确实只需点击几下,但下面是 M-code 助您一臂之力:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Flight", type text}, {"Crew Member 1", type text}, {"Crew Member 2", type text}, {"Crew Member 3", type text}}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Flight"}, "Attribute", "Value"),
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Attribute"}),
    #"Filtered Rows" = Table.SelectRows(#"Removed Columns", each [Value] <> null and [Value] <> ""),
    #"Sorted Rows" = Table.Sort(#"Filtered Rows",{{"Value", Order.Ascending}})
in
    #"Sorted Rows"

将结果加载回 Excel:

如果需要,您可以更改 headers 等等。

让我从这里的最佳选择 Power Query 开始(由 JvdV 发布)。但我想看看是否可以使用 Office 365 中的公式:

=LET(data,A2:D8,
          data1,INDEX(data,,1),
                     cdata,COLUMNS(data)-COLUMNS(data1),
          data2,INDEX(data,SEQUENCE(ROWS(data)),SEQUENCE(1,cdata,1+COLUMNS(data1))),
                     rdata2,ROWS(data2),
                     cdata2,COLUMNS(data2),
                     seq,SEQUENCE(rdata2*cdata2),
                     mseq,MOD(seq-1,rdata2)+1,
                                x,INDEX(data2,mseq,SEQUENCE(1,cdata2)),
          unpiv,SUBSTITUTE(INDEX(x,mseq,ROUNDUP(seq/rdata2,)),"",""),
          names,INDEX(data1,mseq),
                               a,CHOOSE({1,2},unpiv,names),
                               b,--(INDEX(a,,1)<>""),
SORT(FILTER(a,b=1),{1,2}))

这导致未旋转的 flights/names(没有 headers)按 flight/names 字母顺序排序: