如何使用多个表 return 基于 Excel 中的单元格值的列名

How to return column names based on cell value in Excel using multiple tables

我这里有一个简单的例子。我有一个 excel sheet 和两个 table(就像实际的 table)。一个 table 列出应用程序要求,另一个显示硬件要求

A B C D
1 Apps Software Dev Web Dev Games Dev
2 Word x
3 Powerpoint x
4 Excel x x
5 Outlook x x
A B C D
7 Hardware Software Dev Web Dev Games Dev
8 Laptop x x
9 Desktop x x x
10 Mobile x

我有一个单元格,我可以在其中输入职位名称(例如软件开发人员),但我终其一生都无法找出 VLOOKUPS 来获得我想要的显示所有应用程序和硬件的输出。我错过了一个非常简单的解决方案吗?

Enter Job Title Software Dev
Excel
Desktop
Mobile

理想情况下,我希望输出也有一面 headers,例如“应用程序”和“硬件”,但我想先弄清楚这一点

谢谢

您应该重新考虑数据的布局方式以使查询更简单。唯一的东西(记录的唯一 ID,行的键)将是职位。其他一切都基于职位名称,因此将成为专栏。不要使用“x”来指定特定作业是否应分配给特定硬件或软件,而是使用布尔逻辑“True”或值“1”。

我还把上面的内容做了一个聪明的 table(select 所有 table 单元格,转到“插入”选项卡,select “Table”,确保选中“my table has headers”)。我在“Table 设计”下将其命名为 tblJobs,这样公式看起来会更简洁。对于查找 table,我使用数据验证下拉列表(“数据”选项卡 -> “数据验证”)限制了用户输入,这样他们就不能在字段中键入垃圾。否则他们会打错东西并抱怨它“不起作用”,而实际上他们“无法打字”。

O2 中的以下公式已复制到其余部分,用于确定是否应为特定作业分配特定硬件或软件:

  • O2:=IF(INDEX(INDIRECT("tblJobs[" & N2 & "]"), MATCH($O, tblJobs[Job Title], FALSE))=1, TRUE, FALSE)

所有公式都引用 $O$1,因此当您 select 从下拉验证列表中选择不同的作业时,所有单元格都会根据 select 编辑的作业进行更新。最后,如果您愿意,可以向 N 和 O 列添加过滤器,并且只显示“真”值。

如果您要保持电子表格不变,我会创建一个 ADDRESS() 引用,然后使用 INDIRECT() 来 return 地址引用的内容。

其中 G2 = =ADDRESS(MATCH(F2, A:A, FALSE), MATCH($G,A:D,FALSE)) 然后间接换行:=INDIRECT(ADDRESS(MATCH(F2, A:A, FALSE), MATCH($G,A:D,FALSE)))

  • 通过使用 MATCH() 向下搜索 A:A 来查找您要为每个工作寻找的每件事。
  • 通过使用 MATCH() 为您引用的每个职位搜索 A1:D1 来查找列。
  • 以 ADDRESS(row, column) 格式合并 ADDRESS() 函数中的行和列,它 return 是一个地址引用,如 $B$4。
  • INDIRECT() 然后使用地址引用和 return 该位置中存在的内容。

使用数组公式的备选答案
如果您不想更改原始数据而只是在原始数据之外工作,您可以为此目的使用数组公式并结合一些技巧使其工作。

通过使用您的示例数据(我故意更改了第二个 table 的列以证明它们可以位于不同的列或工作表中)。这是基于 this example

Character to spot requirements Job Title Column found in Table 1 Column found in Table 1
x Software Dev =SUBSTITUTE(ADDRESS(1,MATCH(N4,A5:D5,0),4),1,"") =SUBSTITUTE(ADDRESS(1,MATCH(N4,F5:I5,0)+5,4),1,"")
Columns for results =SUBSTITUTE(ADDRESS(1,MATCH("Apps",A5:D5,0),4),1,"") =SUBSTITUTE(ADDRESS(1,MATCH("Hardware",F5:I5,0)+5,4),1,"")
RowTableStarts 3 3
RowTableStarts 10 10

然后在单独的一行中获取与此相同的数组公式(一个用于应用程序,一个用于硬件)

在我的图片中,这是应用程序

=INDEX(INDIRECT("$"&$O&"$"&$O&":$"&$O&"$"&$O), SMALL(IF(ISNUMBER(MATCH(INDIRECT("$"&$O&"$"&$O&":$"&$O&"$"&$O), $M, 0)), MATCH(ROW(INDIRECT("$"&$O&"$"&$O&":$"&$O&"$"&$O)), ROW(INDIRECT("$"&$O&"$"&$O&":$"&$O&"$"&$O))), ""), ROWS($A:A1)))

这是针对硬件的

=INDEX(INDIRECT("$"&$P&"$"&$P&":$"&$P&"$"&$P), SMALL(IF(ISNUMBER(MATCH(INDIRECT("$"&$P&"$"&$P&":$"&$P&"$"&$P), $M, 0)), MATCH(ROW(INDIRECT("$"&$P&"$"&$P&":$"&$P&"$"&$P)), ROW(INDIRECT("$"&$P&"$"&$P&":$"&$P&"$"&$P))), ""), ROWS($A:A1)))

扩展公式并获得所需的结果

示例工作公式

尽管如果您确实需要保留 table 格式(构建一个混合它们的虚拟格式或循环遍历每个格式并附加结果),VBA 解决方案可能会更好)

如果您有 Excel 365,您可以通过应用两个 FILTER 函数然后连接两个溢出范围(如本 Reddit post 中所述)来获得此结果。合并为一个公式,你得到:

=LET(filter1,ROWS(FILTER(Apps[Apps],INDIRECT("Apps"&"["&Selection&"]")="x")),filter2,ROWS(FILTER(Hardware[Hardware],INDIRECT("Hardware"&"["&Selection&"]")="x")),seq,SEQUENCE(filter1+filter2),IF(seq<=filter1,INDEX(FILTER(Apps[Apps],INDIRECT("Apps"&"["&Selection&"]")="x"),seq),INDEX(FILTER(Hardware[Hardware],INDIRECT("Hardware"&"["&Selection&"]")="x"),seq-filter1)))

在这个公式中,第一个table被称为Apps,第二个HardwareSelection 是我用你的三个选项创建下拉列表的单元格的命名范围。

为了在相邻单元格中获取链接的“类别”,我只使用了 INDEX/MATCH。我在 H3 中输入了 above-mentioned 公式,所以:

=IFERROR(IFERROR(IF(MATCH(H3,Apps[Apps],0)>0,"Apps"),IF(MATCH(H3,Hardware[Hardware],0)>0,"Hardware")),"")

这个你应该拖到你溢出结果的最大值(或者超过那个,因为如果没有结果,外面的 IFERROR 会得到你 BLANK)。

结果: