2007年6月30日土曜日

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

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