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

时间:2011-06-13 19:54:21

标签: excel worksheet-function self-reference

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

请注意,这对条件格式非常有用。

9 个答案:

答案 0 :(得分:54)

让细胞自我引用:

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年及之前的数字,使用列:XFD和行:1048576表示2007 +。

注意:INDIRECT函数是易失性的,只应在需要时使用。

答案 1 :(得分:10)

我不认为需要间接,特别是条件格式化。

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

= $A1 <> ""

答案 2 :(得分:8)

其中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 :(得分:2)

对于非易失性解决方案,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上有一个奇怪的错误,它不会接受这些公式的最后一行或列(行1048576和列XFD),因此您可能需要引用这些短文。不确定这对于任何其他版本是否相同,所以感谢反馈和编辑。

和2003年(INDEX在'97年变得非挥发性):

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)

答案 4 :(得分:2)

有一种更安全的方法,不会减慢您的应用程序速度。如何设置Excel,单元格可以有值或公式;公式不能指自己的细胞。否则,你最终会得到一个无限循环,因为新值会导致另一个计算....

使用辅助列根据放在其他单元格中的内容计算值。

例如:

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

=B1

现在,要计算只有当A列为True且B列大于零时,B列才会以条件格式突出显示为黄色...

=AND(A1=True,C1>0)

然后,您可以选择隐藏C列

答案 5 :(得分:1)

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

答案 6 :(得分:1)

我当前的列是按:

计算的

方法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()))

所以间接链接到Sheet2!My Column但是在我的行的A列中指定的另一行是:

方法1:

  

= INDIRECT( “!Sheet2的与” &amp; LEFT(ADDRESS(ROW(),COLUMN(),4,1),LEN(ADDRESS(ROW(),COLUMN(),4,1)) - LEN(ROW ()))及INDIRECT(ADDRESS(ROW(),1,4,1)))

方法2:

  

= INDIRECT( “!Sheet2的与” &amp; LEFT(ADDRESS(ROW(),COLUMN(),4,1),INT((COLUMN() - 1)/ 26)+1)及INDIRECT(ADDRESS( ROW(),1,4,1)))

因此,如果A6 = 3且我的行为6而我的Col为C则返回“Sheet2!C3”的内容

因此,如果A7 = 1且我的行为7且我的Col为D,则返回“Sheet2!D1”的内容

答案 7 :(得分:1)

我一直在寻找解决方案,并且最初使用了本页中的间接解决方案,但我发现它很长很笨拙,我正在尝试做什么。经过一些研究后,我发现了一个更优雅的解决方案(对我的问题)使用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是我正在查找的命名范围。

希望有点意义吗?认为值得投入混合作为解决问题的另一种方式。

答案 8 :(得分:0)

仅适用于行,但请尝试引用所选单元格下方的单元格并从行中减去一行。

=ROW(A2)-1

产生单元格A1的行(此公式将位于单元格A1中。

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