第6講 If文(分岐)を理解しよう

第10話 数独の全ブロックの判定

全ブロック
解答例

Private Sub CommandButton1_Click()
      ・
      ・
      ・

  Dim s As Byte, a As Byte
  v = 1
  For i = 0 To 8
    a = i Mod 3
    s = Int(i / 3)
    v = v * CLng(Cells(7 + a, 9 + s))
  Next
  Cells(17, 9) = "第1ブロック"
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(17, 12) = "○" Else Cells(17, 12) = "×"

  v = 1
  For i = 0 To 8
    a = i Mod 3
    s = Int(i / 3)
    v = v * CLng(Cells(7 + a, 9 + s))
  Next
  Cells(17, 14) = "第2ブロック"
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(17, 17) = "○" Else Cells(17, 17) = "×"
  v = 1
  For i = 0 To 8
    a = i Mod 3
    s = Int(i / 3)
    v = v * CLng(Cells(7 + a, 9 + s))
  Next
  Cells(17, 19) = "第3ブロック"
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(17, 22) = "○" Else Cells(17, 22) = "×"
  v = 1
  For i = 0 To 8
    a = i Mod 3
    s = Int(i / 3)
    v = v * CLng(Cells(7 + a, 9 + s))
  Next
  Cells(18, 9) = "第4ブロック"
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(18, 12) = "○" Else Cells(18, 12) = "×"
  v = 1
  For i = 0 To 8
    a = i Mod 3
    s = Int(i / 3)
    v = v * CLng(Cells(7 + a, 9 + s))
  Next
  Cells(18, 14) = "第5ブロック"
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(18, 17) = "○" Else Cells(18, 17) = "×"
  v = 1
  For i = 0 To 8
    a = i Mod 3
    s = Int(i / 3)
    v = v * CLng(Cells(7 + a, 9 + s))
  Next
  Cells(18, 19) = "第6ブロック"
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(18, 22) = "○" Else Cells(17, 22) = "×"
  v = 1
  For i = 0 To 8
    a = i Mod 3
    s = Int(i / 3)
    v = v * CLng(Cells(7 + a, 9 + s))
  Next
  Cells(19, 9) = "第7ブロック"
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(19, 12) = "○" Else Cells(19, 12) = "×"
  v = 1
  For i = 0 To 8
    a = i Mod 3
    s = Int(i / 3)
    v = v * CLng(Cells(7 + a, 9 + s))
  Next
  Cells(19, 14) = "第8ブロック"
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(19, 17) = "○" Else Cells(19, 17) = "×"
  v = 1
  For i = 0 To 8
    a = i Mod 3
    s = Int(i / 3)
    v = v * CLng(Cells(7 + a, 9 + s))
  Next
  Cells(19, 19) = "第9ブロック"
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(19, 22) = "○" Else Cells(19, 22) = "×"

End Sub
Private Sub CommandButton2_Click()
  Range("A13:F16").Select
  Selection.ClearContents
  Range("G7:G12,I16:
v19,R7:R15").Select
  Selection.ClearContents
  Range("A1").Select
End Sub

参考ファイル

次にすべてが○なら正しい数独ですと表示させて第6講を終了する予定でしたが、
前々話で1次元のFor文で2次元ループをする方法を
解説したときに、このできの悪い(人間が同じことを繰り返している)
コードを改良できることに気がつきました。
2次元ループの講でもちろん再度改良に取り組みますが、
1次元のFor文で2次元ループをする方法を使って、
できの悪いコードの改善に取り組みます。
さらに、配列を学ばないと

  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(19, 22) = "○" Else Cells(19, 22) = "×"
はやむを得ないと話しましたが、
考えてみると皆さんは配列に相当するものをすでに知っています。
しかも、1次元配列の後に学ぶ予定になっている2次元配列を知っているのです。
なんだかお分かりですか。
答えは30行下。


























答え
Cellsです。
CellsはCells(19, 14)のように添え字(この例では19と14)が2つついています。
添え字付き変数を配列といい、
添え字の数が2つであるとき、
2次元配列というのです。
ですから、Long型の変数を用意したり、
CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(19, 22)
などというできの悪いものを使う必要がありませんでした。
(さらに、この話を書いているときに思いついたのですが、
CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(19, 22)
の計算結果をLong型の変数に収納しておけば、
毎回計算させるという愚を犯さず済むことにも気がつきました。
我ながら、あきれるばかりです。)

ですから、この講ではあと3つ課題を出します。
1つ目は1次元のFor文で2次元ループをする方法による改良
(これでコード分量は1/10ぐらいになりかなりコンパクトなものになります。)
2つ目は2次元配列であるCells(*,*)を使って、
列・行・ブロックが数独の条件を満たしているかのどうかの確認を行います。
3つ目は、すべてが○

全ブロック
ならば正しい数独ですと表示させることです。
3つも課題がありますので、第6講は後5,6話は続くことになります。
しばらくのおつきあいをお願いします。

初心者である皆さんに、いきなり1つ目の課題
1次元のFor文で2次元ループをする方法による改良
をやってくださいといっても無理がありますので、
次話では魔方陣の列の部分を私が書き換えてみますので、
それを参考にして魔方陣の行の部分と
数独の部分を是非ともご自分でプログラミングして頂きたいのです。
簡単ではありません。
プログラムには忍耐が必要です。
粘り強く挑んでください。

9話へ 第11話へ


トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ