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

第6話 魔方陣判定プログラム

c
Private Sub CommandButton1_Click()
  Dim w As Byte, i As Byte, h As Byte
  h = 1
  w = 0
  For i = 0 To 5
    w = w + Cells(7 + i, 1)
  Next
  If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(13, 1) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(7 + i, 2)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(13, 2) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(7 + i, 3)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(13, 3) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(7 + i, 4)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(13, 4) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(7 + i, 5)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(13, 5) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(7 + i, 6)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(13, 6) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(7, 1 + i)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(7, 7) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(8, 1 + i)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(8, 7) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(9, 1 + i)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(9, 7) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(10, 1 + i)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(10, 7) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(11, 1 + i)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(11, 7) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(12, 1 + i)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(12, 7) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(7 + i, 1 + i)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(14, 3) = "右下がり対角線合計 "
  Cells(14, 6) = w
  w = 0
  For i = 0 To 5
    w = w + Cells(7 + i, 6 - i)
  Next
  If h = 1 Then If w <> Int(6 * (6 * 6 + 1) / 2) Then h = 0
  Cells(15, 3) = "右上がり対角線合計 "
  Cells(15, 6) = w
  If h = 1 Then Cells(16, 4) = "この方陣は魔方陣です。" Else Cells(16, 4) = "この方陣は魔方陣ではありません。"
End Sub
Private Sub CommandButton2_Click()
  Range("A13:F16").Select
  Selection.ClearContents
  Range("G7:G12").Select
  Selection.ClearContents
  Range("A1").Select
End Sub

参考ファイル

さて、それではいよいよ
魔方陣?
例2が正しい数独であるか検証するプログラムの開発に着手しましょう。
手始めに、今回のプログラムをさらに改良して、
I列が数独の条件(1から9までが一つずつ入っている)を満たしていたら、
数独
とI16に○と表示させるようにしましょう。
条件判定にはI7からI15までの積が
1×2×3×4×5×6×7×8×9
に等しいかを調べれば良いわけです。
ただし、この積の答え362880はInteger型の範囲を超えるので、
用意する変数は、Long型です。
さらに、その変数にCells(7, 9)などをかけていくわけですが、
セルの数字をLong型にキャストしておく必要があります。
Long型へのキャストはCLng(*)を使います。
CLng(*)で*がLong型にキャストされるのです。
さらに、If文の条件式に1*2*3*4*5*6*7*8*9も出てきますが、
大変面倒ですが、一つ一つをCLng(1)などとLong型にキャストして、
CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9)
としないと、
オーバーフローします。
実は第7講で学ぶ配列を使えば、
Long型の変数など用意しないで、
Byte型の変数で容易に判定できるのですが、
配列を学んでいない現段階では、
次善の策といえます。
 

5話へ 第7話へ


トップ


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

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