如何使用多个表 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
,第二个Hardware
。 Selection
是我用你的三个选项创建下拉列表的单元格的命名范围。
为了在相邻单元格中获取链接的“类别”,我只使用了 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
)。
结果:
我这里有一个简单的例子。我有一个 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
,第二个Hardware
。 Selection
是我用你的三个选项创建下拉列表的单元格的命名范围。
为了在相邻单元格中获取链接的“类别”,我只使用了 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
)。
结果: