工作表函数中单元格,列和行的自引用
在Excel中的工作表函数中,如何自引用您所在的单元格,列或行?
请注意,这对条件格式非常有用。
其中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
对于一个细胞来自我引用:
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 for 2007+。
注意:INDIRECT函数是不稳定的,只能在需要的时候使用。
我不认为需要间接,尤其是条件格式。
自引用单元格,行或列的最简单方法是通常引用它,例如单元格A1中的“= A1”,并使引用部分或完全相对。 例如,在用于检查各个单元格行的第一列中是否存在值的条件格式公式中,input以下内容并高亮显示A1并根据需要进行复制。 条件格式将始终引用每列的行的列A:
= $A1 <> ""
对于非易失性解决scheme,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在1997年变得不稳定):
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)
有一个更好的方法是更安全,不会减慢你的应用程序。 如何设置Excel,一个单元格可以有一个值或一个公式; 该公式不能引用它自己的单元格。 否则,最终会出现无限循环,因为新值会导致另一个计算…。
使用助手列来计算基于你放在其他单元格中的值。
例如:
A列是True或False,B列包含货币价值,C列包含以下公式:
=B1
现在,要计算列B将以条件格式高亮显示黄色,只有列A为真且列B大于零…
=AND(A1=True,C1>0)
您可以select隐藏C列
在VBA工作表函数UDF中,使用Application.Caller来获取包含调用UDF的公式的单元格的范围。
我目前的专栏按以下方式计算:
方法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的!” &LEFT(ADDRESS(ROW(),COLUMN(),4,1),LEN(ADDRESS(ROW(),COLUMN(),4,1)) – LEN(ROW()))间接(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,我的Col是C返回“Sheet2!C3”的内容
所以,如果A7 = 1,我的行是7,我的Col是D返回“Sheet2!D1”的内容
我正在寻找一个解决scheme,最初使用这个页面上find的间接的,但我发现它很长,笨重,我正在试图做的。 经过一番研究,我find了一个更优雅的解决scheme(对我的问题)使用R1C1符号 – 我认为你不能混合使用不同的符号样式,而不使用VBA。
根据你想要用自引用单元格做什么,像这个例子一样,应该得到一个单元格引用它自己的单元格是F13:
Range("F13").FormulaR1C1 = "RC"
然后,您可以在相对位置上引用单元格,例如 – 您的单元格为F13,您需要从中引用G12。
Range("F13").FormulaR1C1 = "R[-1]C[1]"
你基本上告诉ExcelfindF13,然后向下移动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是我正在查找的命名范围。
希望有一点道理? 认为这是值得投入混合作为解决问题的另一种方式。
仅用于行,但尝试引用选定单元格下方的单元格,并从行中减去一个单元格。
=ROW(A2)-1
生成单元格A1的行(此公式将在单元格A1中。
这避免了所有的间接()和索引()使用,但仍然有效。