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