○第116回目 計算式をチェックする(その3)
3.からです。
3.ブロックの中央あたりのセルを選び出し、その後ろの行との列の偏差、行の偏差、定数の偏差(通常は0)を求めます。チェックの基準値とします。
'基準位置(中間地点)において偏差1(列),2(行)を取得します。
ii0 = Int((gyo_cnt + 1) / 2)
For m = 1 To mm1(ii0, 0) 'mm1(**, 0)には項目数が入っています。
hensa1(m) = mm1(ii0 + 1, m) - mm1(ii0, m)
hensa2(m) = mm2(ii0 + 1, m) - mm2(ii0, m)
Next m
4.先頭の次のセルからチェックです。計算式の入っていないセルはチェックしません。計算式なしのセルは最後に色付けをします。
'計算式のチェック。一つでも違いがあれば色をつけます。
For ii = 2 To gyo_cnt '一番最初のセルは、前のセルがないのでチェックできません。
For m = 1 To mm1(ii0, 0) '基準となるセルの項目数までチェックします。
If mm_sh(ii, m) <> mm_sh(ii - 1, m) Then flag = 99: Exit For
If mm1(ii, m) - mm1(ii - 1, m) <> hensa1(m) Then flag = 99: Exit For
If mm2(ii, m) - mm2(ii - 1, m) <> hensa2(m) Then flag = 99: Exit For
Next
'色コード⇒色 20⇒水色、27⇒黄色、46⇒赤色、44⇒オレンジ色
If flag = 99 Then '偏差が異なる
Cells(gyo1 + ii - 1, retu1 + jj - 1).Interior.ColorIndex = 27
flag = 0
End If
If mm1(ii, 0) <> mm1(ii0, 0) Then '項目数が異なる
Cells(gyo1 + ii - 1, retu1 + jj - 1).Interior.ColorIndex = 46
End If
'ここまではある一列の中での処理。終了後、次の列の処理に移ります。
必要な配列変数を初期化して、次の列に処理を移します。
'全部終了後、計算式のないセルに色をつけます。
For j = 1 To retu_cnt
For i = 1 To gyo_cnt
a = Cells(gyo1 + i - 1, retu1 + j - 1).Formula
If InStr(a, "=") = 0 Then
Cells(gyo1 + i - 1, retu1 + j - 1).Interior.ColorIndex = 20
End If
Next i
Next j
7.全部終了したら、ダンプリストを取るか取らないかの指定をします。出力場所はこの時、指定します。配列変数は、当然最後の列の状態しかありません。ダンプリストは、問題があるところに限定し、再度処理を走らせてから、取ってください。
'デバック用内部変数のダンプ出力
Dim セル範囲 As Range
db_flag = InputBox("デバック用ダンプリストを出力しますか。最後の列だけになります。" _
, Default:=9, xpos:=2000, ypos:=3000)
If db_flag = 1 Then
Set セル範囲 = Application.InputBox _
(Prompt:="出力先のセルを選択してください", Type:=8)
AAA = セル範囲.Address
retu21 = Range(AAA).Column
gyo21 = Range(AAA).Row
For i = 1 To gyo_cnt 'チェックした計算式の数は、行数となります。
Cells(gyo21 + (i - 1) * 3, retu21) = mm1(i, 0) '項目数
For m = 1 To mm1(i, 0)
Cells(gyo21 + (i - 1) * 3, retu21 + m) = mm_sh(i, m) 'シート名
Cells(gyo21 + (i - 1) * 3 + 1, retu21 + m) = mm1(i, m) '列の偏差
Cells(gyo21 + (i - 1) * 3 + 2, retu21 + m) = mm2(i, m) '行の偏差
Next
Next
End If
※この変数のダンプをとる処理は使い回しがきくかもしれません。整理して活用度の高いものにしておきましょう。
※チェックマクロは、1.数値を除いてのチェック、2.列偏差、行偏差の同一性のチェックを紹介しましたが、どちらもそれだけでは不十分なところがありますので、この二つを合体させる必要があります。単純につなげればできますとはいえませんが、うまく重複するところと、順番を調整して合体させるといいと思います。
※次回はちょっと力を抜いて、エラー箇所のカウントと、その場所への移動を考えて見ます。

0 件のコメント:
コメントを投稿