我有一张表,其中包含许多代表时间线的单元格(每分钟一个单元格,宽度非常小),我想在此表中可视化包含三个阶段的操作。(一条线可以有多台手术,代表一间手术室)
例如,如果准备工作从 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))
出来 - 'time' 单元格的值,这是唯一的相对值,变为奇怪的高值('XCS'、'WTC'、'XBR'...)。如果我也使该行相对,它也会发生变化(我得到了像 163552 这样的数字)。
这似乎与宏无关,因为我首先在 IronPython 中尝试了整个事情,它的工作方式相同(我实际上是从该代码中翻译了宏)并产生了相同的错误。
当我手动分配公式进行测试时,我什至有时会遇到同样的错误,所以我强烈怀疑 Excel 是真正的错误......
现在,由于我找不到有关类似错误的任何信息,这可能与记忆有关吗?比如,细胞太多?或者特定于我的计算机/安装/代码/...的东西?
我使用 Excel 2007。“数据”表的单元格没有特殊格式,时间都是 hh:mm:ss。
我希望我已经足够清楚了整个东西是如何工作的;否则,只需要求更多代码或所需的任何信息。感谢您的任何提示,我已经坚持了一个星期了,我的想法已经用完了......