excel 如何使用两个列表创建第三个使用标识符的列表

lyfkaqu1  于 2023-06-25  发布在  其他
关注(0)|答案(4)|浏览(98)

我想看看是否有一个公式可以从两个使用相似标识符的不同数组中输出一个数组。
有人有什么建议吗?

  • 提供的数组1*

| ID|账户|
| - -----|- -----|
| 一个|一百|
| 一个|一百零一|
| 一个|一百零二|
| B|一百零五|

  • 提供的阵列2*

| 使用者|ID|
| - -----|- -----|
| U1|一个|
| U1| B|
| U2|一个|

  • 所需阵列3输出 *

| 使用者|账户|
| - -----|- -----|
| U1|一百|
| U1|一百零一|
| U1|一百零二|
| U1|一百零五|
| U2|一百|
| U2|一百零一|
| U2|一百零二|
enter image description here
我已经尝试过使用helper列和各种过滤器方法。我能够得到部分,但无法生成像“数组3”这样的输出。
任何帮助是非常感谢!

7qhs6swi

7qhs6swi1#

从2个列表创建列表

=LET(fData,A2:B5,sData,D2:E4,fiCol,1,faCol,2,suCol,1,siCol,2,
    fi,INDEX(fData,,fiCol),fa,INDEX(fData,,faCol),
    su,INDEX(sData,,suCol),si,INDEX(sData,,siCol),
    u,UNIQUE(su),
DROP(REDUCE("",u,LAMBDA(rr,r,LET(
    f,FILTER(fa,ISNUMBER(XMATCH(fi,FILTER(si,su=r))),""),
VSTACK(rr,HSTACK(INDEX(r,SEQUENCE(ROWS(f),,,0)),f))))),1))
ndasle7k

ndasle7k2#

使用Power Query

  • 将两个数组格式化为表
  • 我将它们命名为Array1Array2
  • 选择Array1
  • Data => Get&Transform => from Table/Range
  • PQ编辑器打开时:Home => Advanced Editor
  • 将下面的M代码粘贴到您所看到的位置
  • 阅读评论并浏览Applied Steps以了解算法
//change table names in code below to reflect the actual names in your workbook

let

//Read in first table
    Source = Excel.CurrentWorkbook(){[Name="Array1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", type text}, {"Account", Int64.Type}}),

//Read in second table
    Source2 = Excel.CurrentWorkbook(){[Name="Array2"]}[Content],
    #"Changed Type2" = Table.TransformColumnTypes(Source2,{{"User", type text}, {"ID", type text}}),

//Join the two tables
    #"Joined Tables" = Table.NestedJoin(#"Changed Type","ID",#"Changed Type2","ID","Joined", JoinKind.FullOuter),

//Expand the user column
    #"Expanded Joined" = Table.ExpandTableColumn(#"Joined Tables", "Joined", {"User"}, {"User"}),

//Remove the unneeded ID column
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Joined",{"ID"}),

//Place columns in desired order for output
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"User", "Account"}),

//Sort the results
    #"Sorted Rows" = Table.Sort(#"Reordered Columns",{{"User", Order.Ascending}, {"Account", Order.Ascending}})
in
    #"Sorted Rows"

ws51t4hk

ws51t4hk3#

可能有更简单的方法或更有说服力的方法,但是你也可以使用函数来尝试。
LET()TAKE()DROP()REDUCE()LAMBDA()VSTACK()TOROW()FILTER()TOCOL()TEXTBEFORE()
TEXTAFTER()HSTACK()

·单元格G1中使用的公式

=LET(
       a,A2#,
       b,D2#,
       c,TAKE(a,,1),
       d,TAKE(a,,-1),
       e,TAKE(b,,1),
       f,TAKE(b,,-1),
       g,DROP(REDUCE("",f,LAMBDA(x,y,VSTACK(x,TOROW(FILTER(d,c=y))))),1),
       h,TOCOL(e&"-"&g,3),
       i,TEXTBEFORE(h,"-"),
       j,TEXTAFTER(h,"-"),
       VSTACK({"User","Account"},HSTACK(i,j)))

请注意,根据OP提供的阵列,单元格A2中使用了一个

={"A","100";"A","101";"A","102";"B","105"}

并给出了在单元格D2中使用的阵列二

={"U1","A";"U1","B";"U2","A"}
bihw5rsg

bihw5rsg4#

我不是100%的逻辑生成的基础上提供的信息的问题,但如果这是我认为你可以使用以下的输出。此解决方案不需要通常效率较低的Lambda Helper Function

=LET(AB,A2:B5, DE,D2:E4, A,TAKE(AB,,1), B,TAKE(AB,,-1),
 D,TAKE(DE,,1), E,TAKE(DE,,-1), x,IF(A=TOROW(E),B,NA()),
 ac,TOCOL(x,2,1), user,TOCOL(IF(x=B,TOROW(D),NA()),2,1),
 VSTACK({"User","Account"},HSTACK(user, ac)))

下面是输出:

我们有两个输入范围:ABDE(名称是指范围的列字母),其余的名称是使用TAKE函数从中推导出来的,以提取特定的列。
名称x是一个mxn数组,其中mA的行数,nE的行数,其中元素i,j表示Ai = Ej的比较,因此它返回相应的B值,如果它们相等,否则NA(显然它假设NA不是有效的帐号)。我们稍后通过TOCOL使用NA来删除这些值。下面是x的输出:

100  #N/A   100
101  #N/A   101
102  #N/A   102
#N/A 105    #N/A

注意:如果我们能够将前一个矩阵按列连接在一列中,然后删除NA值,这就是我们要查找的帐户的输出。

名称ac(accounts)使用TOCOL按列(第三个输入参数中的1)连接x矩阵,删除NA值(第二个输入参数中的2)。
对于user,我们应用类似的逻辑,通过TOROWD名称作为单行。它确保按给定行的列进行比较。最后一步是使用VSTACK将header添加到预期输出:HSTACK(user, ac) .

相关问题