当前单元格的Excel引用

82

如何获取当前单元格的引用?

例如,如果我想显示A列的宽度,可以使用以下代码:

=CELL("width", A2)

然而,我希望公式是这样的:

=CELL("width", THIS_CELL)
13个回答

56

5
顺便提一句,宽度实际上只取决于当前列,并且可以通过=CELL("width", C)来查询,其中 C 基本上就是“当前列”(就像 R 是“当前行”一样)。 - imix
1
太棒了!喜欢它。你,我的朋友,得到了赏金。 - Rick
3
哇,非常感谢,Rick!现在我可以在任何地方编写评论,还可以编辑社区维基。这真的很棒,让我在SO上拥有更多自由。我会明智地使用这种力量8-) - imix
我不确定这个方法有多可移植,因为你需要更改全局设置。但是事实证明,R1C1选项也会保存在工作簿中,所以如果其他人使用默认设置打开你的文件,它仍然可以正常工作。请注意,如果他们关闭该选项,Excel将把所有RC转换为普通引用。至少从我的几次快速测试中推断出来的是这样。如果有人能够证实这种行为,我将不胜感激。 - rkagerer
@rkagerer:请注意GSerg对Joey答案的评论。在内部,Excel始终使用R1C1样式引用,因此该选项仅允许用户查看和输入它们。在将选项切换回A1引用样式后,它仍将正常工作,只是您无法再输入“RC”,而公式将显示它们所在单元格的名称(始终在更改)而不是“常量”RC。 - imix

53

创建名为THIS_CELL的命名公式

  1. 在当前工作表中,选择单元格A1(这很重要!)

  2. 打开“名称管理器”(Ctrl + F3)

  3. 点击“新建…”

  4. 在“名称:”中输入“THIS_CELL”(或者只输入“THIS”,这是我的首选)

  5. 将以下公式输入到“引用:”中:

    =!A1

    注意:一定要选择单元格A1。此公式相对于活动单元格。

  6. 在“范围:”下选择“工作簿”。

  7. 点击“确定”并关闭“名称管理器”

在工作表中按您想要的方式使用该公式

=CELL("width",THIS_CELL)

编辑:使用INDIRECT()的解决方案之外,还有一个更好的解决方案。

值得注意的是,我提供的解决方案应该优先于任何使用INDIRECT()函数的解决方案,原因如下:

  1. 它是不挥发的,而INDIRECT()是一种挥发性的Excel函数,因此当它被大量使用时,它会显著地减慢工作簿的计算速度。
  2. 它更简单,不需要将地址(以ROW()COLUMN()形式)转换为范围引用地址,然后再转换回范围引用地址。

编辑:另请参见此问题,了解更多关于工作簿范围、工作表相关命名范围的信息。

编辑:另请参见@imix的答案,其中介绍了这个想法的变体(使用RC样式引用)。在这种情况下,您可以使用=!RC作为THIS_CELL命名范围公式,或直接使用RC


1
很棒的技巧,但我无法在条件公式中使其工作(在Excel 2003和2016中测试)。@imix的答案有效。 - rkagerer
@RickTeachy 是的,我的意思是在条件格式的公式中。 - rkagerer
如果名称的范围限定在工作表而不是整个工作簿,则可以运行,如果我没记错的话。这很糟糕,因为它意味着有时您必须在多个工作表之间复制名称,但确实可以运行。稍后会尝试记得确认一下。 - Rick
1
@RicksupportsMonica 对于您所断言的CELL不是易失性(即非易失性存储器),实际上它的确是请参考此链接 - chris neilsen
@chrisneilsen 感谢您指出这一点! CELL() 公式只是使用此功能的示例... 我所描述的 THIS_CELL 功能本身不是挥发性的。 不过我应该找到一个不同的非挥发性示例。 有什么建议吗? - Rick

40
你可以使用。
=CELL("width", INDIRECT(ADDRESS(ROW(), COLUMN())))

8
这使得这个公式不稳定。因此,如果有非挥发性的解决方案,请勿使用此方案。 - GSerg
4
应该注意的是,CELL函数本身已经是不稳定的,因此您用来计算当前单元格的方法是否不稳定并不会影响函数的不稳定性(在这种情况下)。 - Patrick McDonald
1
volatile 是什么意思? - Jonathan DS
4
@Jonathan,这里有一个解释:http://www.decisionmodels.com/calcsecretsi.htm - Patrick McDonald

32

=ADDRESS(ROW(),COLUMN(),4)将为我们提供当前单元格的相对地址。 =INDIRECT(ADDRESS(ROW(),COLUMN()-1,4))将为我们提供当前单元格左侧单元格的内容。 =INDIRECT(ADDRESS(ROW()-1,COLUMN(),4))将为我们提供当前单元格上方单元格的内容(非常适用于计算累加总数)。

使用CELL()函数返回有关最后更改的单元格的信息。因此,如果我们输入新行或列,则CELL()引用将受到影响并且不再是当前单元格的引用。


谢谢。在过去的二十年里,我从未有意识地使用过ADDRESS函数,但当你有六列,每列有500行需要替换基于范围的条件格式时,与必须重新做每一个相比,它确实可以加快速度。 - Rich Harding

8

A2已经是一个相对引用,当你移动单元格或复制公式时它会发生改变。


1
不用担心样式问题。所有公式在内部都使用R1C1,这并不重要。 - GSerg
啊,谢谢。我现在没时间查(通常浏览XML并不好玩 :))。 - Joey

7
=ADDRESS(ROW(),COLUMN())
=ADDRESS(ROW(),COLUMN(),1)
=ADDRESS(ROW(),COLUMN(),2)
=ADDRESS(ROW(),COLUMN(),3)
=ADDRESS(ROW(),COLUMN(),4)

6

没有使用 INDIRECT() 函数: =CELL("width", OFFSET($A$1,ROW()-1,COLUMN()-1) )


2
我发现处理这个问题(对我而言)最好的方法是使用以下方法:
Dim MyString as String
MyString = Application.ThisCell.Address
Range(MyString).Select

希望这可以帮到您。

1

在表格内,您可以使用[@],Excel会自动将其扩展为Table1[@],但它确实有效。(我正在使用Excel 2010)

例如,在具有两列[Change][Balance]的情况下,将以下内容放入[Balance]列中:

=OFFSET([@], -1, 0) + [Change]

请注意,这当然取决于行的顺序(就像大多数其他解决方案一样),因此它有点脆弱。

1

有一种更安全且不会拖慢应用程序的更好方法。 Excel的设置方式是,单元格可以具有值或公式; 公式不能引用其自身的单元格。 您最终会得到一个无限循环,因为新值将导致另一次计算...。使用辅助列基于您在其他单元格中输入的内容来计算值。例如:

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

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

=AND(A1=True,C1>0)

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


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