Excel更改条件格式公式

时间:2012-04-20 11:47:48

标签: excel excel-vba 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'是当前格式化的行的编号,根据手术室计算。 “宽度”现在通常为300,但一般为60 *显示的小时数(因此只是当时的分钟数)。

这整件工作没有错误,它产生正确的格式化字符串(我在调试模式下检查了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。

我希望我清楚地说明了整个过程的运作方式;否则,只需要更多代码或需要的任何信息。感谢您的任何提示,我已经坚持了一个星期,现在已经没有想法...

1 个答案:

答案 0 :(得分:2)

(感谢Tim Williams)

问题似乎与活动单元的位置有关,在此过程中会发生变化。以下代码可以使用(我还更正了之前看不到的另一个错误):

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)