Excel更改条件格式公式

标签 excel conditional-formatting vba

我有一个表,其中包含许多代表时间线的单元格(每分钟一个单元格,宽度非常小),我想在该表中可视化包含三个阶段的操作。 (一条线上可以有多个手术,代表一个手术室)

例如,如果准备工作在 10:00 开始,实际操作在 10:23 开始,则这些时间之间的所有 23 个单元格都应变为红色,接下来的 55 个单元格应变为红色,代表 10:23 到 11 之间的实际操作: 18、应该是绿色的,等等,像这样:

   17    18      19    20    21      22     23     00     01      02      03     04
   |      |      |      |     |      |      |      |      |       |       |      |
OR1______________++++=================****______________++=========***____________
OR2______________________+++++======================*****_________________________

如果每个单元格的时间值(取自额外行)介于两个开始/结束值之间,则对每个单元格进行格式化,午夜前后的数字有特殊情况。

为了自动化此操作(有很多操作),我编写了一个宏,它遍历时间表(四个时间列用于三个阶段的开始和结束,一个代表手术室)并分配每一列在大表格(带有彩色单元格)中,三种条件格式应该可以正常工作(我手动检查了它们):

T = time.Address(RowAbsolute:=True, ColumnAbsolute:=False)
Z1 = t1.Address
Z2 = t2.Address
Z3 = t3.Address
Z4 = t4.Address

fnc1 = "=OR(AND(" & Z1 & "<=" & T & ";" & T & "<" & Z2 & ");AND(" & Z2 & "<" & Z1 & ";" & Z1 & "<=" & T & ");AND(" & T & "<" & Z2 & ";" & Z2 & "<" & Z1 & "))"
fnc2 = "=OR(AND(" & Z2 & "<=" & T & ";" & T & "<" & Z3 & ");AND(" & Z3 & "<" & Z2 & ";" & Z2 & "<=" & T & ");AND(" & T & "<" & Z3 & ";" & Z3 & "<" & Z2 & "))"
fnc3 = "=OR(AND(" & Z3 & "<=" & T & ";" & T & "<" & Z4 & ");AND(" & Z4 & "<" & Z3 & ";" & Z3 & "<=" & T & ");AND(" & T & "<" & Z4 & ";" & Z4 & "<" & Z3 & "))"

Dim currentLine As Range
Set currentLine = Range(Cells(dline, data.Column), Cells(dline, data.Column).Offset(0, width))

Set frmt1 = currentLine.FormatConditions.Add(XlFormatConditionType.xlExpression, Formula1:=fnc1)
Set frmt2 = currentLine.FormatConditions.Add(XlFormatConditionType.xlExpression, Formula1:=fnc2)
Set frmt3 = currentLine.FormatConditions.Add(XlFormatConditionType.xlExpression, Formula1:=fnc3)

frmt1.Interior.Color = RGB(255, 0, 0)
frmt2.Interior.Color = RGB(0, 255, 0)
frmt3.Interior.Color = RGB(0, 0, 255)

't1' .. 't4' 是表格中包含开始/结束时间的单元格,'time' 是可视化表格中每列的额外行,其中包含文字时间(10:01、10:02、 ...,与'data'宽度相同),'data'是可视化表,'dline'是当前格式化的行号,根据操作室计算。 'width' 现在通常为 300,但一般为 60 * 显示的小时数(因此只是该时间的分钟数)。

这整个过程没有错误,并且生成了正确的格式字符串(我在 Debug模式下检查了 fnc1..fnc3)。它们看起来像这样,它们应该这样做:

=OR(AND($KR$10<=C$13;C$13<$KS$10);AND($KS$10<$KR$10;$KR$10<=C$13);AND(C$13<$KS$10;$KS$10<$KR$10))

C13是第一个时间单元,KR10和KS10是本次操作的“t1”和“t2”(准备开始、实际操作开始/准备结束)。

但是:一旦格式字符串保存到 Excel(宏完成),它们就不再相同了。通常类似于

=OR(AND($KR$10<=XCS$13;XCS$13<$KS$10);AND($KS$10<$KR$10;$KR$10<=XCS$13);AND(XCS$13<$KS$10;$KS$10<$KR$10))

出现 - “时间”单元格的值(唯一相对的单元格)更改为奇怪的高值(“XCS”、“WTC”、“XBR”...)。如果我也使行相对,它也会改变(我得到了像 163552 这样的数字)。

这似乎与宏无关,因为我第一次在 IronPython 中尝试了整个过程,它以相同的方式工作(我实际上从该代码翻译了宏)并产生了相同的错误。

当我手动分配公式进行测试时,有时甚至会遇到同样的错误,所以我强烈怀疑 Excel 是真正的错误......

现在,由于我找不到任何有关类似错误的信息,这是否与内存有关?比如,细胞太多?或者特定于我的计算机/安装/代码/...的东西?

我使用Excel 2007。“数据”表的单元格没有特殊格式,时间都是hh:mm:ss。

我希望我已经足够清楚地说明了整个事情是如何运作的;否则,只需索取更多代码或所需的任何信息。感谢您的任何提示,我已经被困在这个问题上一周了,我已经没有想法了......

最佳答案

(归功于蒂姆·威廉姆斯)

该问题似乎与事件单元格的位置有关,并在此过程中发生变化。下面的代码可以工作并将被使用(我还纠正了另一个我以前看不到的错误):

T = time.Address(True, False)
' here I initially forgot to update the row (not related to problem)
Z1 = Cells(tline, t1.Column).Address
Z2 = Cells(tline, t2.Column).Address
Z3 = Cells(tline, t3.Column).Address
Z4 = Cells(tline, t4.Column).Address

fnc1 = "=OR(AND(" & Z1 & "<=" & T & ";" & T & "<" & Z2 & ");AND(" & Z2 & "<" & Z1 & ";" & Z1 & "<=" & T & ");AND(" & T & "<" & Z2 & ";" & Z2 & "<" & Z1 & "))"
fnc2 = "=OR(AND(" & Z2 & "<=" & T & ";" & T & "<" & Z3 & ");AND(" & Z3 & "<" & Z2 & ";" & Z2 & "<=" & T & ");AND(" & T & "<" & Z3 & ";" & Z3 & "<" & Z2 & "))"
fnc3 = "=OR(AND(" & Z3 & "<=" & T & ";" & T & "<" & Z4 & ");AND(" & Z4 & "<" & Z3 & ";" & Z3 & "<=" & T & ");AND(" & T & "<" & Z4 & ";" & Z4 & "<" & Z3 & "))"

Dim currentLine As Range
Set currentLine = Range(Cells(dline, data.Column), Cells(dline, data.Column).Offset(0, width))
currentLine.Select ' <- neccessary change solving the problem

Set frmt1 = currentLine.FormatConditions.Add(XlFormatConditionType.xlExpression, Formula1:=fnc1)
Set frmt2 = currentLine.FormatConditions.Add(XlFormatConditionType.xlExpression, Formula1:=fnc2)
Set frmt3 = currentLine.FormatConditions.Add(XlFormatConditionType.xlExpression, Formula1:=fnc3)

frmt1.Interior.Color = RGB(255, 0, 0)
frmt2.Interior.Color = RGB(0, 255, 0)
frmt3.Interior.Color = RGB(0, 0, 255)

关于Excel更改条件格式公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10245638/

相关文章:

xml - 如何将多个 XML 中的值提取到 Excel 中?

vba - 如何防止 Excel 中出现屏幕伪影

vba - 如何使用 Split 来使用换行符作为分隔符来标记文本文件

vba - 范围内未找到数字时显示 "duplicate Number"

excel - 在 VBA for Mac 中写入具有长名称的文件

excel - Apache POI 有 Scala 包装器吗?

excel - 根据列中的值有条件地设置一个单元格的格式

excel - 在 excel 365 中以数字为中心的两种颜色条件格式

google-sheets - 如果谷歌电子表格的同一列中的值重复,如何突出显示单元格?

sql-server - 使用 VBA 从 Excel 到 SQL Server 表的 INSERT INTO 语句