2012-04-20 2 views
2

시간 표시 줄 (1 분에 1 개의 셀, 매우 작은 너비)을 나타내는 많은 셀이 포함 된 표가 있으며이 표에 3 단계가 포함 된 작업을 시각화하고 싶습니다. 예를 들어, 준비가 10:00에 시작되고 실제 작업이 10:23에 시작되면, 그 시간 사이의 23 개의 셀은 모두 빨간색으로 표시되어야합니다. 그것을위한 시간 값 (취해진 경우 셀 Excel은 조건부 서식 지정 수식을 변경합니다.

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

각 포맷

: 그리고 다음 55, 23 절 11시 18분 사이의 실제 동작을 나타내는 이와 같이, 등, 녹색 및이어야 여분의 행에서)는 시작/끝 값 중 두 자 사이에 있으며 자정 무렵에 숫자가있는 특별한 경우입니다.

이 작업을 자동화하려면 (시간이 많이 걸리는 작업이 많음) 시간의 테이블 (3 단계의 시작과 끝의 4 개의 시간 열과 작업실을 나타내는 1 개의 열)을 실행하는 매크로를 작성하고 각각 제대로 작동합니다 세 조건부 서식, (유색 세포와) 큰 테이블의 컬럼 (I 수동으로 확인) :

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'의 값 'WTC', 'XBR'...). 상대방 행을 상대적으로 만들면 나도 163552와 같은 숫자를 얻을 수 있습니다.

IronPython에서 처음 시도 했으므로 (매크로에서 실제로 해당 코드에서 번역 된) 동일한 방법으로 작업하고 동일한 오류가 발생했습니다. 매크로와는 별개의 것으로 보입니다. 내가 anyhing을 찾을 수 없기 때문에

가 난 가끔, 이제 ... 진짜 오류가되는 I에게

을 강하게 의심 Excel을 내가 테스트를 위해 손으로 공식을 할당하고 오류의 같은 종류를 가지고, 그래서 비슷한 오류에 대해서, 기억력이 있어야 할까? 너무 많은 세포? 또는 내 컴퓨터/설치/코드/...에 특정한 것이 있습니까?

Excel 2007을 사용합니다. '데이터'표의 셀은 특별히 서식이 지정되어 있지 않으며 시간은 모두 hh : mm : ss입니다.

전체 내용이 어떻게 작동하는지 충분히 분명히 알았 으면 좋겠습니다. 그렇지 않으면 더 많은 코드 또는 필요한 정보를 요청하십시오.

+1

여기서 너비의 값은 무엇입니까? 간격 띄우기 (0, 너비). 아직 이른 아침이지만 ColumnAbsolute : = False를 T로 설정하면 셀에 수식을 넣을 때 디버거에서 수식을 확인할 때와 비교할 때 예기치 않은 결과가 발생할 수 있습니다. – deusxmach1na

+1

+ 1 질문에 대한 설명을 위해 :) –

+2

VBA를 사용하여 조건부 서식을 적용 할 때 현재 활성 셀의 위치에 따라 다른/이상한 결과가 발생할 수 있습니다. 범위에서 첫 번째 셀을 선택하십시오. 조건을 추가하기 전에 cf를 적용하십시오. http://stackoverflow.com/questions/8316662/conditional-formatting-in-vba-based-on-functions/8318151#8318151 –

답변

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)