在 Excel 的工作表函数中,如何自引用所在的单元格、列或行?
9 回答
让单元格自我引用自身:
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 年及以上,使用 column:XFD 和 row:1048576。
注意:INDIRECT 函数是不稳定的,只应在需要时使用。
我认为不需要间接,尤其是条件格式。
自引用单元格、行或列的最简单方法是正常引用它,例如,单元格 A1 中的“=A1”,并使引用部分或完全相对。例如,在用于检查各个单元格行的第一列中是否有值的条件格式公式中,输入以下内容并突出显示 A1 并根据需要进行复制。对于每个单元格的行,条件格式将始终引用 A 列:
= $A1 <> ""
其中 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
对于非易失性解决方案,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)
在 VBA 工作表函数 UDF 中,您使用 Application.Caller 来获取包含调用 UDF 的公式的单元格范围。
有一种更好的方法更安全,不会减慢您的应用程序。Excel是如何设置的,一个单元格可以有一个值或一个公式;公式不能引用自己的单元格。否则,您最终会陷入无限循环,因为新值会导致另一个计算...。
使用辅助列根据您在另一个单元格中输入的内容计算值。
例如:
A 列是 True 或 False,B 列包含货币值,C 列包含以下公式:
=B1
现在,要计算只有当 A 列为真且 B 列大于零时,B 列才会以条件格式突出显示为黄色......
=AND(A1=True,C1>0)
然后您可以选择隐藏 C 列
我当前的列是通过以下方式计算的:
方法一:
=LEFT(地址(ROW(),COLUMN(),4,1),LEN(地址(ROW(),COLUMN(),4,1))-LEN(ROW()))
方法二:
=LEFT(地址(ROW(),COLUMN(),4,1),INT((COLUMN()-1)/26)+1)
我当前的行是通过以下方式计算的:
=RIGHT(地址(行(),列(),4,1),LEN(行()))
所以间接链接到 Sheet2!My Column 但在我的行的 A 列中指定的不同行是:
方法一:
=INDIRECT("Sheet2!"&LEFT(ADDRESS(ROW(),COLUMN(),4,1),LEN(ADDRESS(ROW(),COLUMN(),4,1))-LEFT(ROW()))&INDIRECT (地址(行(),1,4,1)))
方法二:
=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”的内容
我一直在寻找解决方案,并使用了最初在此页面上找到的间接解决方案,但我发现它对于我想做的事情来说很长而且很笨重。经过一番研究,我发现了一个使用 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 范围中每个单元格(列 -1)左侧的单元格,DATABYCODE 是我正在查找的命名范围。
希望这有点道理?认为值得将其作为解决问题的另一种方法。
仅用于行,但尝试引用所选单元格正下方的单元格并从行中减去一个。
=ROW(A2)-1
产生单元格 A1 的行(此公式将进入单元格 A1。
这避免了所有间接()和索引()的使用,但仍然有效。