2009年4月26日日曜日

第116回目 計算式をチェックする(その3)

○第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 件のコメント: