2012-04-20 75 views
2

我有含有大量代表一個時間線(每分鐘一個小區,非常小的寬度)的細胞的表,我想可視化操作,包含三個階段,在此表中。 (可以有多個操作在一行,代表一個手術室)Excel中的變化的條件格式式

例如,如果準備開始於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'是可視化table和'dline'是當前格式化的行的計數,calcul視手術室而定。 '寬度'現在通常是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」的價值,「世貿中心」,「X波段雷達」 ...... )。如果我也是相對的,那麼它也是相對的(我得到了163552這樣的數字)。

這似乎是獨立的宏,因爲我第一次嘗試了IronPython中的所有東西,其工作方式相同(我實際上是從該代碼翻譯宏)併產生了相同的錯誤。

我有時甚至得到了相同類型的,當我分配用手測試公式錯誤的,所以我強烈懷疑Excel中是真正的錯誤...

現在,因爲我無法找到anyhing關於類似的錯誤,可能需要與內存?就像太多的細胞一樣?或者特定於我的電腦/安裝/代碼/ ...的東西?

我使用Excel 2007.「數據」表的單元格沒有專門格式化,時間都是hh:mm:ss。

我希望我已經足夠清楚整個東西是如何工作的;否則,只需索取更多代碼或需要的任何信息。感謝您的任何提示,我一直停留在此的一個星期,現在,我運行的想法......

+1

這裏的寬度值是多少?偏移量(0,寬度)。現在還是一大早,但我認爲如果將公式放入單元格中,與在調試器中檢查公式時出現ColumnAbsolute:= False for T可能會產生意外的結果。 – deusxmach1na 2012-04-20 14:29:12

+1

+ 1花費時間來解釋您的問題:) – 2012-04-20 18:21:23

+2

根據當時活動單元格的位置,您可能發現使用VBA應用條件格式時會得到不同/奇怪的結果:請嘗試選擇範圍內的第一個單元格在添加條件之前,應用cf。 http://stackoverflow.com/questions/8316662/conditional-formatting-in-vba-based-on-functions/8318151#8318151 – 2012-04-20 20:54:05

回答

2

(幸得蒂姆·威廉姆斯)

這個問題似乎需要做的與活動細胞的位置有關的東西在過程中發生變化。以下代碼有效並將被使用(我還糾正了另一個我以前無法看到的錯誤):

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)