Excel对当前单元格的引用


70

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

例如,如果要显示列A的宽度,可以使用以下内容:

=CELL("width", A2)

但是,我希望公式是这样的:

=CELL("width", THIS_CELL)

Answers:


45

创建一个名为THIS_CELL的命名公式

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

  2. 打开Name Manager(Ctl + F3)

  3. 请点击 New...

  4. 输入“ THIS_CELL”(或仅输入“ THIS”,这是我的偏好) Name:

  5. 输入以下公式 Refers to:

    =!A1

    注意:确保已选择单元格A1。此公式相对于ActiveCell。

  6. Scope:选择下Workbook

  7. 单击OK并关闭Name Manager

完全根据需要使用工作表中的公式

=CELL("width",THIS_CELL)

编辑:比使用更好的解决方案INDIRECT()

值得注意的是,我给出的解决方案应该比使用该INDIRECT()函数的任何解决方案都要优先,原因有两个:

  1. 它是非易失性的,而它是INDIRECT()易失性的Excel函数,因此,经常使用它会大大减慢工作簿的计算速度。
  2. 这要简单得多,并且不需要将地址(以形式ROW() COLUMN())转换为对地址的范围引用,然后再转换回范围引用。

编辑:有关工作簿范围的,依赖于工作表的命名范围的更多信息,请参见此问题

编辑:另请参阅下面的@imix答案,以了解这种想法的变体(使用RC样式引用)。在这种情况下,你可以使用=!RCTHIS_CELL命名范围的公式,或者只是使用RC直接。


绝妙的技巧,但我无法在条件公式中使用它(已在Excel 2003和2016中测试)。@imix的答案有效。
rkagerer

@RickTeachy是的,我的意思是条件格式的内部公式。
rkagerer

@rkagerer iirc如果名称的作用域是工作表而不是工作簿,则它起作用。这真是令人b目结舌,因为这意味着您有时必须在多个工作表中重复使用名称,但是确实可以。稍后将尝试记住以确认。
里克

48

几年为时已晚:

为了完整起见,我想再给出一个答案:

首先,转到Excel- Options- > Formulas并启用R1C1引用。然后使用

  =CELL("width", RC)

RC 始终引用当前行,当前列,即“此单元格”。

里克·泰切(Rick Teachey)的解决方案基本上是一种调整,以使A1参考样式也可以做到这一点(另请参见GSerg对Joey的回答的注释,以及对Patrick McDonald的回答的注释)。

欢呼声
:-)


3
顺便说一句。宽度实际上只取决于当前列上,并且也可以被要求与=CELL("width", C)其中C基本上是“当前列”(如R为“当前行”)。
imix

这很棒!爱它。您,我的朋友,得到了赏金。
里克

2
哇,非常感谢,里克!现在,我可以在任何地方写评论,也可以编辑社区Wiki。那真是太好了,这样我就拥有了更多的自由。我会明智地使用原力8
imix

由于您需要更改全局设置,因此我不确定这样做的便携性。但是事实证明R1C1选项也保存在工作簿中,因此,如果其他人使用默认设置打开您的文件,它仍然可以使用。请注意,如果他们关闭该选项,Excel会将所有这些RC转换为普通引用。至少这是我从几次快速测试中得出的结论。如果有人可以证实这种行为,将不胜感激。
rkagerer

@rkagerer:请注意GSergs对Joeys答案的评论。在内部,Excel始终与R1C1样式引用一起使用,因此该选项仅允许用户同时查看和输入它们。在将选项切换回A1参考样式后,它仍然可以工作,只是您不能再输入“ RC”,并且公式代替RC而不是RC,而是显示它们所在的单元格的名称(始终在变化)而不是“常量”。 RC。
imix

35

你可以用

=CELL("width", INDIRECT(ADDRESS(ROW(), COLUMN())))

7
这使公式易变。因此,如果存在非易失性解决方案,请不要使用此解决方案。
Gserg

4
应该注意的是,CELL函数已经是易失性的,因此,用于计算当前单元格的方法是否易失性不会影响函数的易变性(在这种情况下)
Patrick McDonald

1
volatile是什么意思?
乔纳森·多斯·桑托斯


29

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

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


谢谢你 二十年来,我从未有过使用ADDRESS的经历,但是当您有六列(每列500行需要替换基于范围的条件格式)时,与必须重做每一个相比,它确实可以加快速度。
Rich Harding

7

A2 已经是一个相对参考,并且在移动单元格或复制公式时会发生变化。


不用担心样式问题。无论如何,所有公式都在内部使用R1C1。
Gserg

嗯谢谢 现在不费心查找它(通常不很喜欢通过XML
Joey

6
=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列是对还是错,B列包含货币值,C列包含以下公式:= B1

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

= AND(A1 = True,C1> 0)

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


1

@ rick-teachey完全信任最重要的答案,但是您可以扩展该方法以使用条件格式。为了使这个答案完整,我将以摘要形式复制Rick的答案,然后扩展它:

  1. A1在任何工作表中选择单元格。
  2. 创建一个名为的命名范围THIS并将其设置Refers to:=!A1

尝试THIS在条件格式公式中使用将导致错误:

You may not use references to other workbooks for Conditional Formatting criteria

如果要THIS使用条件格式公式:

  1. 创建另一个名为的命名范围,THIS_CF并将设置Refers to:=THIS

现在,您可以THIS_CF用来在条件格式设置公式中引用当前单元格。

您也可以使用这种方法来创建其他相对命名区域,如THIS_COLUMNTHIS_ROWROW_ABOVECOLUMN_LEFT,等。


0

编辑:以下错误,因为Cell(“ width”)返回最后修改的cell的宽度。

Cell("width")返回当前单元格的宽度,因此您无需引用当前单元格。但是,如果需要一个,则cell("address")返回当前单元格的地址,因此,如果需要引用当前单元格,请使用indirect(cell("address"))。请参阅文档:http : //www.techonthenet.com/excel/formulas/cell.php

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.