For i = 1 To n * n
If g > 0 Then
For j = 0 To g - 1
If i = a(j) Then GoTo tobi
Next
End If
a(g) = i
If g Mod n = n - 1 Then
w = 0
For j = 0 To n - 1
w = w + a(n * Int(g / n) + j)
Next
If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
End If
If Int(g / n) = n - 1 Then
w = 0
For j = 0 To n - 1
w = w + a(n * j + (g Mod n))
Next
If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
End If
If g = n * n - 1 Then
w = 0
For j = 0 To n - 1
w = w + a(n * j + j)
Next
If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
End If
If g = n * (n - 1) Then
w = 0
For j = 0 To n - 1
w = w + a(n * j + n - 1 - j)
Next
If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
End If
If g + 1 < n * n Then
Call f(g + 1)
Else
w = 0
For j = 0 To n - 1
w = w + a(n * j + j)
Next
If w = Int(n * (n * n + 1) / 2) Then Call h
End If
tobi:
Next
End Sub
解説の続き
1
2
3
4
5
6
7
8
9
g = 2 ですから、
i = 1、i = 2 のいずれの場合も重複検査
If g > 0 Then
For j = 0 To g - 1
If i = a(j) Then GoTo tobi
Next
End If
が稼働して、
i = 1 のときは、If 1 = a(0) Then GoTo tobi
のときに、If 1 = 1 Then GoTo tobi となりGoTo文によってtobiに飛ばされ、
i = 2 のときは、If 2 = a(1) Then GoTo tobi
のときに、If 2 = 2 Then GoTo tobi となりGoTo文によってtobiに飛ばされ、
i = 3 となりますがこのときは
If 3 = a(0) Then GoTo tobi
If 3 = a(1) Then GoTo tobi
のそれぞれは
If 3 = 1 Then GoTo tobi
If 3 = 2 Then GoTo tobi
から実行されず、
a(g) = i
によって、セル位置番号2
0
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
9
3が入ります。そして、g = 2ですから、始めて行合計検査
If g Mod n = n - 1 Then
w = 0
For j = 0 To n - 1
w = w + a(n * Int(g / n) + j)
Next
If w <> Int(n * (n * n + 1) / 2) Then GoTo tobi
End If
が起動しますが、1 + 2 + 3 = 6で
Int(n * (n * n + 1) / 2) = Int(3 * (3 * 3 + 1) / 2 = 15
に一致しませんから、GoTo文によってtobiに飛ばされ、
Nextによってiが1つ進み4となり、