【问题标题】:Proper Use of the Offset Function正确使用偏移功能
【发布时间】:2014-01-08 13:05:58
【问题描述】:

我有以下公式

=IFERROR(IF(FIND(OFFSET($B$2,1,0),$A3,1),VLOOKUP(OFFSET($B$2,1,0),'Keyword list'!B2:E316533,2,FALSE),""),"n/a")

如果找到单词,则查找与单词关联的值,否则返回“n/a”。我已经包含了 OFFSET() 函数,希望这样当我将公式移动到另一列时,比如从 B 列到 C 列,引用仍然不是 $B$2,也不是 C2,而是 B3。实际上,我试图做到这一点,以便当公式被拖过参考行而不是列时,当我向下拖动时,参考保持固定在 $B$2、$B$3 等。是否可以使用偏移功能来做到这一点?我在尝试将其应用于上述公式时是否犯了明显的错误?谢谢!

【问题讨论】:

    标签: excel excel-2010


    【解决方案1】:

    您可以尝试以下方法吗?

    =IFERROR(IF(FIND(OFFSET($B$2,COLUMNS($A:A)-1,0),$A3,1),
     VLOOKUP(OFFSET($B$2,COLUMNS($A:A)-1,0),'Keyword list'!$B$2:$E$31,2,FALSE),""),
     "n/a")
    

    我创建了一个google spreadsheet,以便您可以尝试将公式拖过去。

    该公式的局限性在于它将依赖于公式的列,并且不能在 Excel 中向左拖动,因为这会导致引用 COLUMNS($A:A) 变为 COLUMNS(#REF!)。它可以放在任何列中,然后向右拖动。

    【讨论】:

    • 谢谢,经过一些故障排除后,它运行良好。我要解决的唯一问题是为什么它似乎检查公式所在行下方的一行。有没有办法让它严格检查?
    • @Stopwatch 这是因为相对地址...你能告诉你的实际数据在哪里吗?该公式是可拖动的,这意味着某些引用会根据公式的位置而有所不同,如果您将其插入错误的初始单元格,它就会搞砸:(
    • 嗨,杰瑞,我正要评论说我也意识到了这一点。这是因为我发布的初始公式有误。从 $A3 更改为 $A2 后,一切都井井有条!
    • 我之前赞成你的答案,但我很好奇你为什么说它不能放在 A 列。
    • @DougGlancy 哎呀,不,你是对的。只是一旦放在另一列中,它不应该在Excel中向左拖动,因为COLUMNS()范围变成#REF!。这是真正的原因,我在回答中把那部分搞砸了。
    【解决方案2】:

    这是未经测试的,但我认为它可以满足您的需求,即,对于您向右拖动的每一列,将引用向下移动一行。它使用 COLUMNS 函数,一半锚定在 B 上,另一半锚定相对:

    =IFERROR(IF(FIND(OFFSET($B$2,COLUMNS($B:B),1),$A3,1),VLOOKUP(OFFSET($B$2,COLUMNS($B:B),1),'Keyword list'!B2:E316533,2,FALSE),""),"n/a")
    

    【讨论】:

    • 我刚试了一下,但不幸的是,该行似乎保持不变。
    • 嗯,不知道为什么。这看起来很像 Jerry 建议的,除了他的初始偏移量为 0,我的为 1。
    • 我也不知道为什么。最初 Jerry's 没有工作,直到我意识到我的 VLOOKUP 范围有误,但我会继续排除故障。
    【解决方案3】:

    我会使用 INDIRECT 从计算的字符串中构建引用。

    INDIRECT("B"&(2+COLUMN(<current cell>)-COLUMN($B$1)))
    

    通过这种方式,您的参考将根据 B 列的偏移量进行计算:

    在单元格 D2 中,引用的单元格是 "B"&amp;(2+COLUMN(D2)-COLUMN($B$1)) = "B"&amp;(2+4-2) = "B4" 在单元格 D3 中,引用没有改变,因为只考虑了列。

    单元格 E2 相同:"B"&amp;(2+COLUMN(E2)-COLUMN($B$1)) = "B"&amp;(2+5-2) = "B5"

    如果你的计算是固定的,你甚至可以只用 COLUMN(E2) as 2 和 COLUMN(B1) 相互抵消:INDIRECT("B"&amp;COLUMN(&lt;current cell&gt;)))

    【讨论】:

    • 谢谢,它看起来像这样吗 =IFERROR(IF(FIND(INDIRECT("B"&(2+COLUMN(D8)-COLUMN($B$2))),$A8, 1),VLOOKUP(INDIRECT("B"&(2+COLUMN(D8)-COLUMN($B$2))),'关键字列表'!$A$7:$D$316538,2,FALSE),""), "n/a") 我发现这也没有超出预期,但我可能使用不正确。
    猜你喜欢
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多