我正在尝试进行条件格式设置,以便如果值与其左侧单元格中的值不同,单元格颜色会发生变化(每列是一个月,每行是某个对象的费用。我想监控几个月内价格很容易发生变化。)
我可以对每个单元格进行格式化并拖动它,但我想要一个适用于整个工作表的通用公式。
谢谢!
我正在尝试进行条件格式设置,以便如果值与其左侧单元格中的值不同,单元格颜色会发生变化(每列是一个月,每行是某个对象的费用。我想监控几个月内价格很容易发生变化。)
我可以对每个单元格进行格式化并拖动它,但我想要一个适用于整个工作表的通用公式。
谢谢!
=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1)
最短最兼容的版本是:
=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 时,这是不行的。
创建条件格式时,将其适用于您想要的范围(整个工作表),然后输入一个相对公式(删除$
符号),就好像您只格式化左上角一样。
Excel 会相应地将格式应用于其余单元格。
在此示例中,从 B1 开始,左侧单元格将是 A1。只需使用它 - 不需要高级公式。
如果您正在寻找更高级的东西,您可以使用column()
、row()
和indirect(...)
。
如果您将单元格引用更改为使用 R1C1 表示法(工具|选项,常规选项卡),那么您可以使用简单的表示法并将其粘贴到任何单元格中。
现在你的公式很简单:
=RC[-1]
而不是写很长:
=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1)
你可以简单地写:
=OFFSET(*Name of your Cell*,0,-1)
因此,例如,您可以写入 Cell B2:
=OFFSET(B2,0,-1)
引用单元格B1
仍然感谢杰森杨!!如果没有您的回答,我永远不会想出这个解决方案!
使用以下公式填充 A1 单元格:
=IF(COLUMN(A1)=1;"";OFFSET(A20;0;-1))&"1"
然后自动向右扩展,你得到
1| A | B | C | ect ect
2| 1| 11| 111| ect ect
如果偏移量超出可用单元格的范围,您将获得#REF!错误。
希望你喜欢。
更简单:
=indirect(address(row(), column() - 1))
OFFSET 返回相对于当前引用的引用,因此如果间接返回正确的引用,则不需要它。
在创建用户定义函数时,我发现其他涉及函数的答案OFFSET
无法INDIRECT
应用。
相反,您必须使用Application.Caller
引用已使用用户定义函数 (UDF) 的单元格。在第二步中,将列的索引转换为相应列的名称。
最后,您可以使用活动工作表的Range 函数来引用左侧单元格。
Function my_user_defined_function(argument1, argument2)
' Way to convert a column number to its name copied from StackOverflow
' http://stackoverflow.com/a/10107264
' Answer by Siddarth Rout (http://stackoverflow.com/users/1140579/siddharth-rout)
' License (if applicable due to the small amount of code): CC BY-SA 3.0
colName = Split(Cells(, (Application.Caller(1).Column - 1)).Address, "$")(1)
rowNumber = Application.Caller(1).Row
left_cell_value = ActiveSheet.Range(colName & rowNumber).Value
' Now do something with left_cell_value
为什么不直接使用:
=ADDRESS(ROW(),COLUMN()-1)
您可以使用 VBA 脚本来更改选择的条件格式(您可能需要相应地调整条件和格式):
For Each i In Selection
i.FormatConditions.Delete
i.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, Formula1:="=" & i.Offset(0, -1).Address
With i.FormatConditions(1).Font
.Bold = True
End With
Next i
我偶然发现了这个线程,因为我想始终引用“左侧单元格”,但以非易失性方式(没有偏移、间接和类似灾难)至关重要。上下浏览网页,没有答案。(这个帖子实际上也没有提供答案。)经过一番修改后,我偶然发现了最令人惊讶的方法,我喜欢与这个社区分享:
假设 E6 中的起始值为 100。假设我在 F5 中输入这个值的增量,比如 5。然后我们将计算 F6 = E6+F5 中的延续值 (105)。如果您想添加另一个步骤,很简单:只需将 F 列复制到 G 列,然后在 G5 中输入一个新的增量。
这就是我们定期做的事情。每列都有一个日期,这些日期必须按时间顺序排列(以帮助 MATCH 等)。我们经常会忘记进入一个步骤。现在假设您想在 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 函数来完成此操作。
选择单元格 A2
打开Name Manager
(Ctrl+F3)
点击New
将其命名为“LeftCell”(或您喜欢的任何名称)
对于Scope:
, 选择Workbook
在Refers to:
中,输入公式:
=INDEX(!A1:!A2, 1)
单击OK
并关闭Name Manager
这告诉 Excel 始终查看当前单元格左侧的值,并且会随着选择不同的单元格而动态更改。如果名称单独使用,它提供单元格的值,但在范围内它使用引用。归功于这个关于单元格引用的答案。
我认为这是最简单的答案。
使用“名称”来引用偏移量。
假设您想将一列(A 列)一直求和,但不包括保存总和的单元格(例如单元格 A100);做这个:
(我假设您在创建名称时使用 A1 引用;随后可以切换到 R1C1)
=SUM(A1:OneCellAbove)
因为这是回答@zipper的唯一方法
你的公式的原因:
="OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1)=""xyz"""
没有条件格式,是因为公式 litteraly 要求 =“THIS PHRASE” 等于“THAT PHRASE”,尝试这样写:
=OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())),0,-1)="xyz"
其中“xyz”是您的文本,“-1”是列数离开你想搜索。
请选择整个工作表和 HOME > Styles - Conditional Formatting, New Rule..., Use a formula to determine which cells to format and Format values where this formula is true: :
=A1<>XFD1
Format..., 选择格式选择, OK, OK.