工作表函数中的单元格、列和行自我引用

26
在Excel的工作表函数中,如何自我引用所在的单元格、列或行?

重复的问题,链接为https://dev59.com/v3RA5IYBdhLWcg3w_DDF,该链接中有更多的解决方案。 - Vadzim
10个回答

64

要让一个单元格自我引用:

INDIRECT(ADDRESS(ROW(), COLUMN()))

如果一个单元格要自我引用其所在的列:

INDIRECT(ADDRESS(1,COLUMN()) & ":" & ADDRESS(65536, COLUMN()))

如果一个单元格要自我引用其行:

INDIRECT(ADDRESS(ROW(),1) & ":" & ADDRESS(ROW(),256))
or
INDIRECT("A" & ROW() & ":IV" & ROW())

这些数字是针对2003年及之前的版本,对于2007年及以后的版本,请使用列:XFD和行:1048576。

注意:INDIRECT函数是一种易变函数,只有在有需要时才应使用。


我发现你的第一个代码示例很有用 - 使用OFFSET(ADDRESS(ROW(),COLUMN()),0,-1),我能够定义一个名称,其公式引用了该名称所在单元格左侧的单元格。也许这种方式并不必要,因为Excel可以处理带有绝对或相对引用的拖放或复制公式的方式;但这是一种依赖于附近单元格的公式定义的巧妙方式。 - Matt
1
太棒了,单元格自我引用对于条件格式非常有用!但是它需要本地化。为了在德国版的Excel中测试空单元格,我需要使用=ISTLEER(INDIREKT(ADRESSE(ZEILE();SPALTE()))) - CodeManX
太棒了!这样我就可以通过复制粘贴将相同的条件格式应用于一系列单元格,同时间接地引用每个单元格的值来进行格式化!! - Zecas
我喜欢这个。当您需要在工作表中使用自定义函数查看其所在的单元格时,它非常有用。 - PBeezy

10

我认为没有必要使用间接函数,特别是对于条件格式而言。

自引用单元格、行或列的最简单方式是正常引用它,比如在单元格A1中输入"=A1" 并将引用部分或全部设为相对引用。例如,在条件格式公式中检查各个单元格行的第一列是否存在值时,可以在突出显示的A1单元格中输入以下内容,并根据需要复制。条件格式将始终引用每个单元格所在行的A列:

= $A1 <> ""

1
这对于条件格式设置是正确的,但否则会导致循环引用错误。 - Lance Roberts
1
我刚刚正在编辑我的回答以反映这一点,所以我们在同一频率。CF是您在帖子中提到的唯一具体用途。 - Doug Glancy
1
是的,那似乎是最常见的用法,但我在其他地方也遇到了这种需求。 - Lance Roberts
我非常需要这个,尝试了相对引用但未成功,所以我不确定它什么时候会或不会起作用。 - Lance Roberts
我解决了这个问题,相对引用最终起作用了。谢谢。 - Lance Roberts
显示剩余2条评论

10

其中 F13 是您需要引用的单元格:

=CELL("Row",F13)  yields 13; its row number

=CELL("Col",F13)  yields 6; its column number;  

=SUBSTITUTE(ADDRESS(1,COLUMN(F13)*1,4),"1","") yields F; its column letter

3
在VBA工作表函数UDF中,您使用Application.Caller来获取包含调用UDF的公式的单元格范围。

3

对于一种非易失性解决方案,2007年以后的版本怎么样:

for cell    =INDEX($A$1:$XFC$1048576,ROW(),COLUMN())
for column  =INDEX($A$1:$XFC$1048576,0,COLUMN())
for row     =INDEX($A$1:$XFC$1048576,ROW(),0)

我在使用Excel 2010时遇到了奇怪的Bug,它无法接受这些公式的最后一行或列(第1048576行和XFD列),所以您可能需要将这些引用一次缩短。不确定其他版本是否存在相同问题,欢迎反馈和修改。
对于2003版本(自97年起INDEX变为非挥发性函数):
for cell    =INDEX($A$1:$IV$65536,ROW(),COLUMN())
for column  =INDEX($A$1:$IV$65536,0,COLUMN())
for row     =INDEX($A$1:$IV$65536,ROW(),0)

3

有一种更安全、不会拖慢应用程序的更好方法。Excel 的设置是,一个单元格可以有一个值或一个公式;公式不能引用其自身的单元格,否则会陷入无限循环,因为新值会导致另一个计算...。

使用一个辅助列基于你在其他单元格中输入的内容来计算值。

例如:

列 A 是 True 或 False,列 B 包含一个货币值,列 C 包含以下公式:

=B1

现在,只有当A列为真且B列大于零时,才会以条件格式突出显示B列的黄色...
=AND(A1=True,C1>0)

您可以选择隐藏C列。

2

我的当前列是通过以下方法计算的:

方法1:

=LEFT(ADDRESS(ROW(),COLUMN(),4,1),LEN(ADDRESS(ROW(),COLUMN(),4,1))-LEN(ROW()))

方法2:

=LEFT(ADDRESS(ROW(),COLUMN(),4,1),INT((COLUMN()-1)/26)+1)

我的当前行是通过以下方法计算的:

=RIGHT(ADDRESS(ROW(),COLUMN(),4,1),LEN(ROW()))

因此,对于指定在我的行中的列A中的不同行,与Sheet2!My Column存在间接链接的内容为:

方法1:

=INDIRECT("Sheet2!"&LEFT(ADDRESS(ROW(),COLUMN(),4,1),LEN(ADDRESS(ROW(),COLUMN(),4,1))-LEN(ROW()))&INDIRECT(ADDRESS(ROW(),1,4,1)))

方法2:

=INDIRECT("Sheet2!"&LEFT(ADDRESS(ROW(),COLUMN(),4,1),INT((COLUMN()-1)/26)+1)&INDIRECT(ADDRESS(ROW(),1,4,1)))

所以,如果A6=3,我的行是6,我的列是C,则返回“Sheet2!C3”的内容。

所以,如果A7=1,我的行是7,我的列是D,则返回“Sheet2!D1”的内容。


2

我一开始在这个页面上找到了间接的解决方案,但是我发现对于我想要做的事情来说,它相当冗长和笨重。经过一番研究,我找到了一种更优雅的解决方案(针对我的问题),使用R1C1符号表示法 - 我认为你不能混合使用不同的表示法而不使用VBA。

根据您尝试使用自引用单元格的目的,像这个示例一样,可以使一个单元格引用其自身,其中单元格为F13:

Range("F13").FormulaR1C1 = "RC"

您可以相对于该单元格引用相对位置的单元格,例如 - 如果您的单元格为F13,并且需要从中引用G12。

Range("F13").FormulaR1C1 = "R[-1]C[1]"

您实际上是在告诉Excel找到F13,然后从那个单元格向下移动1行并向上移动一列。

这如何适用于我的项目是在应用vlookup跨范围进行查找时,查找值相对于范围中的每个单元格而不必单独指定每个查找单元格:

Sub Code()
    Dim Range1 As Range
    Set Range1 = Range("B18:B23")
        Range1.Locked = False
        Range1.FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1],DATABYCODE,2,FALSE),"""")"
        Range1.Locked = True
End Sub

我的查找值是DIM'd范围中每个单元格的左侧单元格(列-1),而DATABYCODE是我要查找的命名范围。

希望这有点意义?认为将其作为解决问题的另一种方法是值得考虑的。


1

只是针对行,但尝试引用所选单元格下方的单元格并从行中减去一个。

=ROW(A2)-1

返回单元格A1的行(此公式应放置在单元格A1中)。

这避免了所有间接(indirect())和索引(index())的使用,但仍然有效。


0
=row() 

或者

=column()

应该足够了(我正在使用365版本)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接