2007年6月30日土曜日

第16回目 データ処理マクロの基礎2-4

○第16回目 データ処理マクロの基礎2-4

 もう大体のテクニックは網羅していると思いますが、多少付録として続けます。
 いま、M、O、Q列にそれぞれ、列、行、3*3ブロックの中を検査し結果が入っています。
 9は、すでにそのブロックの中には該当する数字が入っていて、もういれられない。
 1は、入れることが出来る、
 ということを表しています。
 
 1行目(物理的には15行目)は、1という数値について、1列目と、1行目と1番目の3*3ブロックでの検査結果です。
 2行目は、2という数値について、1列目と、1行目と1番目の3*3ブロックでの検査結果です。
 9行目は、9という数値について、1列目と、1行目と1番目の3*3ブロックでの検査結果です。
 10行目は、
 今度は変わりまして、1という数値について、2列目と、2行目と2番目の3*3ブロックでの検査結果です。
 
 これが、81行目まで続いて、最後は、9という数値について、9列目と、9行目と9番目の3*3ブロックでの検査結果となります。
 
 ですから、56行目はといいますと、9で割ると、商6、余り2となります。
 これは、2という数値について、7番目ブロックに対してのものになります。
 
 では、81行目は…。9で割ると、9余り0だから、0という数値について、10番目ブロックに対してのもの? あれあれということになります。
 
 もう少しいい理解のしかたはないのでしょうか。
 1を引いて考えるのです。
 81は1を引くと80。9で割ると、8余り8となります。
 ここから、8+1という数値について、8+1のブロックに対してのものと理解できます。こちらのほうがスマートでしょう。

 つまり、最初の行を1行目ではなく、0行目と見るのです。
 このへんのあやが、配列変数の添え字が通常は0から始まっていることと繋がっているのではないかと思われます。
 
 さて、解読はこのくらいにして処理のほうに入ります。
 今回の処理は、数値を与えて、その数値がはいらない場所(すでに数値が入っている場所を含む)を色で塗りつぶすということにします。
 
 色の種類を3つもうけます。まずは、列単位でみてここには入らない。次に、行単位でみてここには入らない。最後に、3*3ブロック単位でみてここには入らない、という3種類です。
 
【流れ】
 1.数値を入力する
 2.列単位でみて、入れられないセルに色1をぬる。
 3.行単位でみて、入れられないセルに色2をぬる。
 4.3*3ブロック単位でみて、入れられないセルに色3をぬる。
 5.終了するか、別の数値で調べるかを指定します。
 6.どちらにしても、今ぬった色を消しておく必要があります。
  その上で、1へ戻るか、終了するかです。


 簡単ですので、やって見ましょう。
 
 色の設定は、
 
Cells(a, b).Interior.ColorIndex = xlNone 'クリア
Cells(a, b).Interior.ColorIndex = 13   '1-56のカラーコード

 他の方法としては、
Cells(a, b).Interior.Color = RGB(255,0,0)  '赤明度、緑明度、青明度
 があります。

 後の注意点は、次のブロックに行くところでしょうか。
 最初は、"14+入れた数値"の行です。
 次は、これに9をたし、8回繰り返しますので
i = 0 To 8として
 "14+入れた数値+i*9"の行となります。
 
 表の部分は、Cells(4, 3)からはじまっていますので、(4, 3)にそれなりの数値を足していき、必要な時に色をぬっていけばいいでしょう。

 列の処理のマクロを以下に示します。

 今日はここまで。

【マクロ例】
Sub a19入れられない場所に色をぬる()
'数値を与え、その数値を入れられない場所に色をぬる

Do
suuti = InputBox("1-9までの値を入れてください。", , 1)
If suuti >= 1 And suuti <= 9 Then Exit Do
Loop While 1 = 1

'列の部分
For i = 0 To 8 '横に動かす
If Cells(14 + suuti + i * 9, 13) = 9 Then
For j = 0 To 8 '下に動かす
Cells(4 + j, 3 + i).Interior.ColorIndex = 3
Next j
End If
Next i


MsgBox ("終了します")

Range(Cells(4, 3), Cells(12, 11)).Select
Selection.Interior.ColorIndex = xlNone

End Sub

0 件のコメント: