【问题标题】:How to pass addresses to Vlookup based on cell values (Google Sheets)如何根据单元格值将地址传递给 Vlookup(Google 表格)
【发布时间】:2023-07-18 09:34:01
【问题描述】:

这让我很困惑,所以我希望知道正确功能的人可以帮助我。

我正在尝试执行 VLOOKUP,但我想根据列中的值传递范围。

范围与公式所在的工作表不同,我希望通过查找论坛所在列顶部的值来确定范围的起始列。

例如,在附加的图像中,“仪表板”工作表的 A 列作为工作表,顶行的顶行有小部件和链轮。

我希望公式成为搜索键“总计”的查找,并在其旁边的单元格中返回值。我希望 Range 从 A 列中指定的工作表开始,并且 Column 的值与公式所在列顶部的值相匹配。

所以我的公式看起来像

=VLOOKUP("Total",<INSERT RANGE HERE>,2)

我们将不胜感激。

链接到 Google 表格:

https://docs.google.com/spreadsheets/d/1H5At3gHeTQUm6PWqeA7MT5xcm5RJ38NK6LyhSWUeaZY/edit?usp=sharing

感谢 Stack Overflow 社区

【问题讨论】:

    标签: arrays google-sheets google-sheets-formula gs-vlookup addressing


    【解决方案1】:

    我相信这就是您正在寻找的。

    在仪表板工作表上输入以下公式:

    C3:

    =vlookup("Total", indirect($A3&"!C1:D"),2)
    

    D3:

    =vlookup("Total", indirect($A3&"!C1:F"),4)
    

    然后您可以选择 C3:D3 并向下拖动以自动填充。我尝试使用数组公式,但它不起作用,但我可能做错了

    还要确保更改“Position1”和“Position2”以完全匹配工作表名称。

    编辑:我刚看到你的截图。这些公式也可以放入 C2 和 D2 中,我只是将它们放在工作表名称旁边以跟踪我必须做的事情。


    根据评论进行编辑: 这是我能找到的最接近您正在寻找的东西。

    C3:
    =vlookup("Total", indirect($A3&amp;"!C1:"&amp;ADDRESS(ROW(INDIRECT($A3&amp;"!$C50")),COLUMN()+1)),2)

    D3:
    =vlookup("Total", indirect($A3&amp;"!E1:"&amp;ADDRESS(ROW(INDIRECT($A3&amp;"!$E50")),COLUMN()+1)),2)

    同样,这些列可以毫无问题地拖动和自动填充。


    我有以下公式可以粘贴到仪表板 C3 单元格上,然后复制: =address(1,match(C$1,indirect($A3&"!1:1"),0),,, $A3) 这将为我提供我想要引用的工作表中的地址,即 Position01!$C$1 另外,如果我使用以下公式,我会得到我想要的值:=offset(Position01! $C$1,7,1,1,1) 但是,如果我尝试将两者结合起来,我会收到错误“参数必须是一个范围”。 =offset(地址(1,match(C$1,indirect($A3&"!1:1"),0),,,$A3),7,1,1,1)

    您需要在第一个公式之前添加INDIRECT,然后将其放在OFFSET 中,以便它将结果地址读取为范围而不是字符串:
    =offset(INDIRECT(address(1,match(C$1,indirect($A3&amp;"!1:1"),0),,,$A3)),7,1,1,1)

    【讨论】:

    • 感谢您的回复,这几乎正是我所追求的。但是我想要的不是 C1:D,,2 或 C1:F),4 而是... C1:(C1)+1,2) 和 D1:(D1)+1,2)有没有办法将范围的第二部分评估为从第一列开始的下一列?
    • @MightyJimbob 我已经用我能找到的最佳解决方案编辑了我的答案
    • 感谢您的更新。这是我headdesk和道歉的地方。
    • 谢谢,这是我负责和道歉的地方...我忘了在 E8 中添加另一个“Total”。但我认为你给我的东西应该稍微修改一下。非常感谢。
    • 非常感谢,这是完美的。如果我需要将其作为 VLookup 重新执行,我将能够稍后。非常感谢,你是救生员。
    【解决方案2】:

    使用:

    =INDEX({VLOOKUP("Total", Position01!C:F, {2, 4}, 0);
            VLOOKUP("Total", Position02!C:F, {2, 4}, 0)})
    


    更新:

    如果您的项目包含 24 行但列数未知,那么您可以使用范围:

    Position01!C1:24                                   (instead of Position01!C:F)
    

    然后返回您可以执行的每一列:

    COLUMN(Position01!C1:1)-1                          (instead of {2, 4})
    

    或者如果你想返回每第二列:

    FILTER(COLUMN(Position01!C1:1)-2, MOD(COLUMN(Position01!C1:1), 2)=0)  
    
                                                       (instead of {2, 4})
    

    【讨论】:

    • 老兄,这超出了我的理解。你有时间给我解释一下语法吗?
    • @MightyJimbob 当然,我们在名为 Position01 的工作表上范围 C:F 的第一列中查找(查找)单词“Total”。如果在 C 列中找到单词“Total”,则我们从范围 C:F 的第 2 列和第 4 列返回相邻值 - 例如,我们从 D 和 F 列返回值,除 {2,4}。 0 表示“仅在找到完全匹配时才返回”。然后我们通过花括号 {} 将这两个公式放在数组中,其中分号;意思是“彼此之下”。我们正在尝试填充单元格数组(不是单个单元格),所以我们使用 ARRAYFORMULA 很长,所以我们使用较短的索引
    • 嗨,我一直在研究这个问题,但并不是我想要的。我的实际项目(目前)有大约 40 列要检查,还会添加更多。就面向未来而言,每次我插入一列(名称实际上是排序的)时,这个公式都需要大量维护,我正在寻找一个我可以复制和粘贴的公式。如果以后不需要添加列,此解决方案将是完美的。
    • @MightyJimbob 这意味着什么...看起来您不再需要任何进一步的帮助,而且您的原始问题完全具有误导性,毕竟没有意义...