2

タイム ラインを表す多数のセルを含むテーブル (1 分あたり 1 つのセル、幅が非常に小さい) があり、このテーブルで 3 つのフェーズを含む操作を視覚化したいと考えています。(1 つの手術室を表す 1 つの行に複数の手術がある場合があります)

たとえば、準備が 10:00 に開始され、実際の操作が 10:23 に開始される場合、その間の 23 個のセルすべてが赤くなり、10:23 から 11:18 までの実際の操作を表す次の 55 個のセルが赤くなります。次のように緑色になります。

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

各セルの時間値 (余分な行から取得) が 2 つの開始値と終了値の間にある場合、特殊なケースで午前 0 時前後の数値が書式設定されます。

これを自動化するために(多くの操作があります)、時間の表(3つのフェーズの開始と終了のための4つの時間列と手術室を表す1つ)を実行するマクロを作成し、大きなテーブル (色付きのセル) 3 つの条件付き書式。これは正しく機能するはずです (手動で確認しました)。

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' は、開始/終了時刻を含むテーブルのセルです。 、「データ」と同じ幅)、「データ」は視覚化テーブル、「dline」は現在フォーマットされている行の番号で、手術室に応じて計算されます。'width' は現在通常 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週間立ち往生しており、アイデアが不足しています...

4

1 に答える 1

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)
于 2012-04-23T06:43:46.617 に答える