Excel公式参照“左侧单元格”

105

我正在尝试进行条件格式设置,以便如果某个单元格的值与其左侧单元格的值不同,则单元格颜色会更改(每列是一个月份,在每行中都有特定对象的费用。我希望轻松监控价格在几个月内的变化)。

我可以对每个单元格进行操作并拖动格式,但我想要一个通用公式来应用于整个工作表。


3
如果有人需要,要将列移到右边:=INDIRECT("RC[1]",0) - prograhammer
这是一个非常好的问题。不幸的是,我不确定我是否正确理解了原帖作者想要实现的功能,即在不进行条件格式化并将格式刷粘贴到每个单元格的情况下更改单元格。假设我们在行中有月份,在列中有香蕉、苹果和橙子。矩阵中是价格。如果我们想要自动地使单元格在当前月份与上个月份之间的价格变化时自动变为红色,我们该如何做呢?如果价格下降,是否也有一种自动着色单元格变为绿色的方法,而价格上涨则变为红色呢? - Bryan
14个回答

112
=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1)

21
使用五个很少使用且需要查找用法的函数,而不是简单的A1或RC[-1]相对引用?这就像从布鲁克林前往布朗克斯,在华拉华拉(Walla Walla)做中途停留一样! - John Machin
8
为什么不用这个呢 =INDIRECT(ADDRESS(ROW(),COLUMN()-1)) - Prometheus
2
“间接引用”存在许多问题,包括(但不限于):(1)单线程和(2)易变性(可能会导致整个工作簿在每次更改时进行级联强制重新计算)。如果性能很重要,请勿使用它。 - John Joseph
在条件格式中,我将规则设置为 ="OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1)=""xyz""" 但是单元格没有被格式化。出了什么问题? - zipper

103

最短、最兼容的版本是:

=INDIRECT("RC[-1]",0)

"RC[-1]" 表示向左移动一列。"R[1]C[-1]" 意味着在左下方。

第二个参数0表示第一个参数使用R1C1符号解释。

其他选项:

=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1)

我认为这个公式太长了,但如果相对值是动态的/从另一个单元格中派生的话,它还是很有用的。例如:

=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0, A1)

最简单的选项:

= RC[-1]

缺点是需要通过选项打开R1C1表示法,而当其他人使用Excel时这是不可取的。


在我的Mac版本的Excel中,语法是=INDIRECT("RC[-1]";0),使用的是分号;而不是逗号, - undefined

13

在创建条件格式时,将其应用范围设置为您想要的范围(整个工作表),然后输入相对公式(删除$符号),就好像您只是为左上角单元格设置格式。

Excel会正确地将格式应用于其余单元格。

在本示例中,从B1开始,左侧单元格将是A1。只需使用它即可--不需要高级公式。


如果您正在寻找更高级的内容,可以尝试使用 column()row()indirect(...) 进行调整。


7

如果你将单元格引用更改为使用R1C1记法(工具|选项,常规选项卡),则可以使用简单的符号表示,并将其粘贴到任何单元格中。

现在你的公式变得简单了:

=RC[-1]

7

不要写很长的句子:

=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1)

您可以简单地写成:
=OFFSET(*Name of your Cell*,0,-1)

因此,例如,您可以写入单元格B2
=OFFSET(B2,0,-1)

引用单元格 B1

还是感谢Jason Young!!没有你的回答,我永远想不到这个解决办法!


6
这并没有什么用处。如果你已经知道你的单元格是B2,你可以直接写入B1来表示左边的单元格,而不需要使用offset函数。重点是完全通用化。 - Matthew Read
1
如果您知道从哪个单元格开始,并且只有要执行的偏移量是动态的,那么使用OFFSET函数会非常方便,例如:= OFFSET(B2,0,A2)。这是我使用它的上下文。 - Sam Fed
这就是我一直在寻找的答案!我希望有人能够选择代表整行的单个单元格,并且所有内容都会自动更改为使用该行中的参数。谢谢! - B T

3
为什么不直接使用以下方式:
=ADDRESS(ROW(),COLUMN()-1)

1

请在A1单元格中填入以下公式:

 =IF(COLUMN(A1)=1;"";OFFSET(A20;0;-1))&"1"

然后自动扩展到右边,你就得到了

 1|  A  |  B  |  C  |  ect ect
 2|    1|   11|  111|  ect ect

如果偏移量超出了可用单元格的范围,您将会收到 #REF! 错误。

希望您喜欢。


1
更简单的说法是:
=indirect(address(row(), column() - 1))

OFFSET返回相对于当前参照的引用,因此如果间接返回正确的引用,则不需要它。


永远不要这样做。INDIRECT会破坏依赖树 - 这是一场灾难。 - Ollie2893
我刚刚发现了这个函数,我认为它对于根据列的第一行进行条件格式化非常有用。不确定RC[]符号是否适用于此。 - narrowtux

0

创建名为“LeftCell”的命名公式

对于那些寻找非易失性答案的人,您可以通过在命名公式中使用INDEX函数来实现。

  1. 选择单元格A2

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

  3. 点击“新建”

  4. 将其命名为“LeftCell”(或您喜欢的任何名称)

  5. 对于“作用域:”,选择“工作簿”

  6. 在“引用:”中输入以下公式:

    =INDEX(!A1:!A2, 1)

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

这告诉Excel始终查看当前单元格左侧的值,并且随着选择不同的单元格而动态更改。如果仅使用名称,则提供单元格的值,但在范围内使用引用。感谢this answer关于单元格引用的想法。


你的方法实际上是针对ABOVE_CELL而不是LEFT_CELL的。 要创建一个LEFT_CELL函数,可以按照相同的步骤进行一些微小的更改:
  1. 选择单元格B1
  2. 输入公式:=INDEX(!A1:A1,,1)
- Rares Oltean

0

我偶然发现了这个帖子,因为我想始终引用“左侧单元格”,但是非常重要的是以非挥发性的方式(没有OFFSET、INDIRECT和类似的灾难)。在网上寻找答案,却没有找到。 (这个帖子实际上也没有提供答案。)经过一些尝试,我偶然发现了最惊人的方法,我想与这个社区分享:

假设E6中有一个起始值为100。假设我在F5中输入一个增量,比如5。然后我们将计算F6中的连续值(105)= E6 + F5。如果您想添加另一个步骤,很容易:只需将列F复制到列G,并在G5中输入新的增量。

这就是我们定期做的事情。每一列都有一个日期,这些日期必须按照时间顺序排列(以帮助匹配等操作)。偶尔会发生我们忘记输入步骤的情况。现在假设您想在F和G之间插入一列(以弥补您的遗漏),并将F复制到新的G中(以重新填充连续公式)。这简直是一场灾难。试试看——H6现在会显示=F6+H5而不是(我们绝对需要的)=G6+H5。(新的G6将是正确的。)

为了使其正常工作,我们可以用最惊人的方式混淆这个平凡的计算:F6=index($E6:F6;1;columns($E1:F1)-1)+F5。复制右侧,您将得到G6=index($E6:G6;1;columns($E1:G1)-1)+G5。

这永远不应该起作用,对吧?循环引用,显然!试试看,你会惊讶的发现Excel似乎意识到,尽管INDEX范围跨越了我们正在重新计算的单元格,但该单元格本身未被INDEX寻址,因此不会创建循环引用。

现在我已经成功了。在F和G之间插入一列,我们就得到了我们需要的东西:旧H中的续值将引用我们在新G中插入的续值。


一个更简单的版本:=INDEX(6:6,1,COLUMN()-1)+F5 - chris neilsen

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