【问题标题】:How to return column names based on cell value in Excel using multiple tables?如何使用多个表格在 Excel 中根据单元格值返回列名?
【发布时间】:2022-08-20 11:02:53
【问题描述】:

我有一张带有两个表格(如实际表格)的 Excel 表格。一张表列出了应用程序要求,另一张表列出了硬件要求。

例子

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

我希望输出也有像 \"Apps\" 和 \"Hardware\" 这样的侧标题,但我想先弄清楚这个。

    标签: excel vba vlookup


    【解决方案1】:

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

    我还制作了上面的智能表格(选择所有表格单元格,转到“插入”选项卡,选择“表格”,确保选中“我的表格有标题”)。我在“表格设计”下将其命名为 tblJobs,以便公式看起来更清晰。对于查找表,我使用数据验证下拉列表(“数据”选项卡 ->“数据验证”)限制了用户输入,以便他们无法在字段中输入垃圾。否则他们会打错东西,并抱怨当他们真的“不能打字”时它是如何“不起作用”的。

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

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

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

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

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

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

    【讨论】:

    • 非常感谢,是的,我 100% 同意我们的初始布局错误,这使得查询更加困难。然而,我在现实世界中的示例在每一端都有大约 1000 多行,这使得切换布局有点困难。还有更多的“子表”,这意味着我不能将它们组合起来。我原来的问题仍然可以解决吗?我想出了这个可能很接近的? =IF(INDEX(INDIRECT("Table1[ " & B20 & "]", "Table2[ " & B20 & "]"), MATCH($G$1, Table1[#Headers], FALSE))=
    • 添加了“如果您无法修改数据”部分。
    • 这对我来说非常有用,非常感谢!!也很容易直接实施到我的现实世界解决方案中!非常感激
    • 为什么你会建议 INDIRECT(ADDRESS(...)) 用于“如果你不能重新处理数据”部分?只需使用INDEX/MATCH,它会更快。 =IFERROR(INDEX($A$1:$D$5,MATCH(F2,$A$1:$A$5,0),MATCH($G$1,$A$1:$D$1,0)),INDEX($A$7:$D$10,MATCH(F2,$A$7:$A$10,0),MATCH($G$1,$A$7:$D$7,0)))
    • 因为公式更具可读性,两者之间不会有明显的性能提升。如果您想证明它会“更快”,请随意。
    【解决方案2】:

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

    通过使用您的示例数据(我故意更改了第二个表的列,以证明它们可以位于不同的列或工作表中)。这是基于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$5&"$"&$O$6&":$"&$O$5&"$"&$O$7), SMALL(IF(ISNUMBER(MATCH(INDIRECT("$"&$O$4&"$"&$O$6&":$"&$O$4&"$"&$O$7), $M$4, 0)), MATCH(ROW(INDIRECT("$"&$O$4&"$"&$O$6&":$"&$O$4&"$"&$O$7)), ROW(INDIRECT("$"&$O$4&"$"&$O$6&":$"&$O$4&"$"&$O$7))), ""), ROWS($A$1:A1)))
    

    这是针对硬件的

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

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

    示例工作公式

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

    【讨论】:

      【解决方案3】:

      如果您有 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)))
      

      在这个公式中,第一个表称为Apps,第二个表称为HardwareSelection 是单元格的命名范围,我在其中使用您的三个选项进行了下拉。

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

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

      您应该将这个拖到溢出结果的最大值(或超出此范围,因为在没有结果的情况下,外部 IFERROR 会为您提供 BLANK)。

      结果:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        • 2015-02-20
        • 2023-01-25
        相关资源
        最近更新 更多