○第15回目 データ処理マクロの基礎2-3
続きです。
今回は3*3のブロックで検査を行なう部分です。
これはホネがあります。
9個のコマを動かすのに今までのものが使えません。
最初の3つはは、
(4,3)、(5,3)、(6,3)
次の3つは、
(4,4)、(5,4)、(6,4)
最後の3つは、
(4,5)、(5,5)、(6,5)
(4,3)を基準にすると
(0,0)、(1,0)、(2,0)
(0,1)、(1,1)、(2,1)
(0,2)、(1,2)、(2,2)
となります。
1-9の数字でこれを表すには、少々工夫が必要です。
毎回ごと、0,1,2の繰り返し
3回ごとに0,1,2に固定する。
この仕組みを表すには、
コマの数(0-8)を、3で割り、余りと商にするのです。
商はj ¥ 3、余りはj mod 3となります。
数値1で考えてみると
ii=1
flag=1
for j=0 to 8
if cells(4+(j mod 3),3+(j \ 3)) = ii then
flag=9
exit for
end if
next j
検査結果を入れる場所は、U17なのでcells(15,17)=cells(14+ii,17)となります。
if flag=9 then
cells(14+ii,17)=9
else
cells(14+ii,17)=1
end if
iiを動かすと
for i=0 to 8
ii=i+1
flag=1
for j=0 to 8
if cells(4+(j mod 3),3+(j \ 3)) = ii then
flag=9
exit for
end if
next j
検査結果を入れる場所は、U17なのでcells(15,17)=cells(14+ii,17)となります。
if flag=9 then
cells(14+ii,17)=9
else
cells(14+ii,17)=1
end if
next i
となります。
それほど複雑ではないのですが、余りと商を使うという点が新しいことです。
そして、ブロックを動かすということを追加すると、出来上がりです。
ただ、ブロックを追加した時、検査する範囲が3個の単位で、横に3つづれるので、その分を考慮します。
基本位置から、0-2は下に3つづつ動かし、3-5は3つ横に下に3つづつ動かし、6-8は6つ横に下に3つづつ動かし、ということになります。
これを表すと、+(k mod 3)*3、+(k \ 3)*3となります。
該当する所は、次のようになります。
For k = 0 To 8
For i = 0 To 8
ii = i + 1
flag = 1
For j = 0 To 8
If Cells(4 + (j Mod 3) + (k Mod 3) * 3, 3 + (j \ 3) + (k \ 3) * 3) = ii Then
flag = 9
Exit For
End If
Next j
' 検査結果を入れる場所は、U17なのでcells(15,17)=cells(14+ii,17)となります。
If flag = 9 Then
Cells(14 + ii + k * 9, 17) = 9
Else
Cells(14 + ii + k * 9, 17) = 1
End If
Next i
Next k
これを今までのプログラムの最後の追加すると出来上がりです。
Sub a19数独数値の有無のチェック()
'ある数値が、ブロックごとに入れるかどうかをチェックする
'列単位の検査
For k = 0 To 8
For i = 0 To 8
ii = i + 1
flag = 1 '=⇒フラッグの初期化はここでいいのか
For j = 0 To 8
If Cells(4 + j, 3 + k) = ii Then '=⇒3を動かす必要がある。
flag = 9
Exit For
End If
Next j
If flag = 9 Then
Cells(14 + ii + k * 9, 13) = 9
Else
Cells(14 + ii + k * 9, 13) = 1
End If
Next i
Next k
'行単位の検査
For k = 0 To 8
For i = 0 To 8
ii = i + 1
flag = 1
For j = 0 To 8
If Cells(4 + k, 3 + j) = ii Then
flag = 9
Exit For
End If
Next j
If flag = 9 Then
Cells(14 + ii + k * 9, 15) = 9
Else
Cells(14 + ii + k * 9, 15) = 1
End If
Next i
Next k
'3*3ブロックの検査
For k = 0 To 8
For i = 0 To 8
ii = i + 1
flag = 1
For j = 0 To 8
If Cells(4 + (j Mod 3) + (k Mod 3) * 3, 3 + (j \ 3) + (k \ 3) * 3) = ii Then
flag = 9
Exit For
End If
Next j
' 検査結果を入れる場所は、U17なのでcells(15,17)=cells(14+ii,17)となります。
If flag = 9 Then
Cells(14 + ii + k * 9, 17) = 9
Else
Cells(14 + ii + k * 9, 17) = 1
End If
Next i
Next k
End Sub

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