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

第8話 数独列判定・行判定の完成

入門
解答例
Private Sub CommandButton1_Click()
      ・
      ・
      ・

  Dim v As Long
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(7 + i, 9))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(16, 9) = "○" Else Cells(16, 9) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(7 + i, 10))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(16, 10) = "○" Else Cells(16, 10) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(7 + i, 11))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(16, 11) = "○" Else Cells(16, 11) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(7 + i, 12))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(16, 12) = "○" Else Cells(16, 12) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(7 + i, 13))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(16, 13) = "○" Else Cells(16, 13) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(7 + i, 14))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(16, 14) = "○" Else Cells(16, 14) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(7 + i, 15))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(16, 15) = "○" Else Cells(16, 15) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(7 + i, 16))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(16, 16) = "○" Else Cells(16, 16) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(7 + i, 17))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(16, 17) = "○" Else Cells(16, 17) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(7, 9 + i))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(7, 18) = "○" Else Cells(7, 18) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(8, 9 + i))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(8, 18) = "○" Else Cells(8, 18) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(9, 9 + i))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(9, 18) = "○" Else Cells(9, 18) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(10, 9 + i))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(10, 18) = "○" Else Cells(10, 18) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(11, 9 + i))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(11, 18) = "○" Else Cells(11, 18) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(12, 9 + i))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(12, 18) = "○" Else Cells(12, 18) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(13, 9 + i))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(13, 18) = "○" Else Cells(13, 18) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(14, 9 + i))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(14, 18) = "○" Else Cells(14, 18) = "×"
  v = 1
  For i = 0 To 8
    v = v * CLng(Cells(15, 9 + i))
  Next
  If v = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) Then Cells(15, 18) = "○" Else Cells(15, 18) = "×"
End Sub
Private Sub CommandButton2_Click()
  Range("A13:F16").Select
  Selection.ClearContents
  Range("G7:G12,I16:Q16,R7:R15").Select
  Selection.ClearContents
  Range("A1").Select
End Sub

参考ファイル

最後から2番目のの課題です。
For文を使いブロックの判定をしてください。
入門
これも2次元ループを使った方が簡単なのですが、
入れ子式でないFor文(1次元ループ)でも工夫すれば判定できます。
ヒントなしだと難しいと思いますので、
ヒントを入れておきましょう。
For文に関しては1行目は同じ
  For i = 0 To 8
で良いのです。
ただし、Byte型の変数を2つa、s加えておきます。
VBA
初心者基礎
1つ目の変数は、iを3で割ったときの余りを収納します。
iを3で割った余りは、i Mod 3で求められます。
sの方は、iを3で割った整数を収納します。
3で割った整数にするためにはInt(i / 3)を使えば良いのです。
この2つの変数aとsを使えば、
1次元のFor文でも2次元の動きをさせることができます。
ただし、動く順番は

1 2 3
4 5 6
7 8 9

です。皆さん考えてみてください。
尚、今回はエクセルシートの方もいじってください。
数独
第1ブロックが入力されているセルは、
配置を標準に戻しています。


7話へ 第9話へ


トップ


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

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