' Generates Perfect Pan Magic Squares of order 6, Magic Sum 150
' Based on numbers 1 thru 49, excluding 4, 11, 18, 22 ... 28, 32, 39, 46

' Tested with Office 2007 under Windows 7

Sub MgcSqr6g1()

Dim a(50), b(50), c(50)

''y = MsgBox("Locked", vbCritical, "Routine MgcSqr6g1")
''End

n2 = 0: n9 = 0
m1 = 1: m2 = 49: s1 = 150

'   Generate data

t1 = Timer

For j36 = 1 To 48 ''m2                                           'a(36)
If b(j36) = 0 Then b(j36) = j36: c(36) = j36 Else GoTo 360
a(36) = j36
For j35 = m1 To m2                                               'a(35)
If b(j35) = 0 Then b(j35) = j35: c(35) = j35 Else GoTo 350
a(35) = j35
For j34 = m1 To m2                                               'a(34)
If b(j34) = 0 Then b(j34) = j34: c(34) = j34 Else GoTo 340
a(34) = j34

j33 = 150 - 2 * a(34) - 2 * a(35) - a(36)
If j33 <= 0 Or j33 > 49 Then GoTo 330                            'a(33)
If b(j33) = 0 Then b(j33) = j33: c(33) = j33 Else GoTo 330
a(33) = j33

j32 = -150 + 2 * a(34) + 3 * a(35) + 2 * a(36)
If j32 <= 0 Or j32 > 49 Then GoTo 320                            'a(32)
If b(j32) = 0 Then b(j32) = j32: c(32) = j32 Else GoTo 320
a(32) = j32

j31 = 150 - a(34) - 2 * a(35) - 2 * a(36)
If j31 <= 0 Or j31 > 49 Then GoTo 310                            'a(31)
If b(j31) = 0 Then b(j31) = j31: c(31) = j31 Else GoTo 310
a(31) = j31

For j30 = m1 To m2                                               'a(30)
If b(j30) = 0 Then b(j30) = j30: c(30) = j30 Else GoTo 300
a(30) = j30

a(29) = 100 - a(30) - a(35) - a(36): If a(29) <= 0 Or a(29) > 49 Then GoTo 290
a(28) = a(30) - a(34) + a(36): If a(28) <= 0 Or a(28) > 49 Then GoTo 290
a(27) = -50 - a(30) + 2 * a(34) + 2 * a(35): If a(27) <= 0 Or a(27) > 49 Then GoTo 290
a(26) = 150 + a(30) - 2 * a(34) - 3 * a(35) - a(36): If a(26) <= 0 Or a(26) > 49 Then GoTo 290
a(25) = -50 - a(30) + a(34) + 2 * a(35) + a(36): If a(25) <= 0 Or a(25) > 49 Then GoTo 290
a(24) = 125 - a(30) - a(34) - a(35) - a(36): If a(24) <= 0 Or a(24) > 49 Then GoTo 290
a(23) = -125 + a(30) + a(34) + 2 * a(35) + 2 * a(36): If a(23) <= 0 Or a(23) > 49 Then GoTo 290
a(22) = 125 - a(30) - a(35) - 2 * a(36): If a(22) <= 0 Or a(22) > 49 Then GoTo 290
a(21) = 25 + a(30) - a(34) - a(35) + a(36): If a(21) <= 0 Or a(21) > 49 Then GoTo 290
a(20) = -25 - a(30) + a(34) + 2 * a(35): If a(20) <= 0 Or a(20) > 49 Then GoTo 290
a(19) = 25 + a(30) - a(35): If a(19) <= 0 Or a(19) > 49 Then GoTo 290
a(18) = -100 + 2 * a(34) + 2 * a(35) + a(36): If a(18) <= 0 Or a(18) > 49 Then GoTo 290
a(17) = 200 - 2 * a(34) - 3 * a(35) - 2 * a(36): If a(17) <= 0 Or a(17) > 49 Then GoTo 290
a(16) = -100 + a(34) + 2 * a(35) + 2 * a(36): If a(16) <= 0 Or a(16) > 49 Then GoTo 290
a(15) = 50 - a(36): If a(15) <= 0 Or a(15) > 49 Then GoTo 290
a(14) = 50 - a(35): If a(14) <= 0 Or a(14) > 49 Then GoTo 290
a(13) = 50 - a(34): If a(13) <= 0 Or a(13) > 49 Then GoTo 290
a(12) = 100 + a(30) - 2 * a(34) - 2 * a(35): If a(12) <= 0 Or a(12) > 49 Then GoTo 290
a(11) = -100 - a(30) + 2 * a(34) + 3 * a(35) + a(36): If a(11) <= 0 Or a(11) > 49 Then GoTo 290
a(10) = 100 + a(30) - a(34) - 2 * a(35) - a(36): If a(10) <= 0 Or a(10) > 49 Then GoTo 290
a(9)  = 50 - a(30): If a(9) <= 0 Or a(9) > 49 Then GoTo 290
a(8)  = -50 + a(30) + a(35) + a(36): If a(8) <= 0 Or a(8) > 49 Then GoTo 290
a(7)  = 50 - a(30) + a(34) - a(36): If a(7) <= 0 Or a(7) > 49 Then GoTo 290
a(6)  = 25 - a(30) + a(34) + a(35) - a(36): If a(6) <= 0 Or a(6) > 49 Then GoTo 290
a(5)  = 75 + a(30) - a(34) - 2 * a(35): If a(5) <= 0 Or a(5) > 49 Then GoTo 290
a(4)  = 25 - a(30) + a(35): If a(4) <= 0 Or a(4) > 49 Then GoTo 290
a(3)  = -75 + a(30) + a(34) + a(35) + a(36): If a(3) <= 0 Or a(3) > 49 Then GoTo 290
a(2)  = 175 - a(30) - a(34) - 2 * a(35) - 2 * a(36): If a(2) <= 0 Or a(2) > 49 Then GoTo 290
a(1)  = -75 + a(30) + a(35) + 2 * a(36): If a(1) <= 0 Or a(1) > 49 Then GoTo 290

'   Exclude solutions with identical numbers

GoSub 800: If fl1 = 0 Then GoTo 290

n9 = n9 + 1
GoSub 650 'Print results (squares)
'   GoSub 645 'Print results (selected numbers)

290 b(c(30)) = 0: c(30) = 0
300 Next j30

b(c(31)) = 0: c(31) = 0
310 b(c(32)) = 0: c(32) = 0
320 b(c(33)) = 0: c(33) = 0
330 b(c(34)) = 0: c(34) = 0
340 Next j34
b(c(35)) = 0: c(35) = 0
350 Next j35
b(c(36)) = 0: c(36) = 0
360 Next j36

t2 = Timer

t10 = Str(t2 - t1) + " sec., " + Str(n9) + " Solutions for sum" + Str(s1)
y = MsgBox(t10, 0, "Routine MgcSqr6g1")

End

'   Print results (selected numbers)

645 For i1 = 1 To 36
Cells(n9, i1).Value = a(i1)
Next i1

Return

'   Print results (squares)

650 n2 = n2 + 1
If n2 = 5 Then
n2 = 1: k1 = k1 + 7: k2 = 0
Else
If n9 > 1 Then k2 = k2 + 7
End If

Cells(k1 + 1, k2 + 1).Select

i3 = 0
For i1 = 1 To 6
For i2 = 1 To 6
i3 = i3 + 1
Cells(k1 + i1, k2 + i2).Value = a(i3)
Next i2
Next i1

Return

'   Exclude solutions with identical numbers

800 fl1 = 1
For j1 = 1 To 36
a2 = a(j1)
For j2 = (1 + j1) To 36
If a2 = a(j2) Then fl1 = 0: GoTo 850
Next j2
Next j1
850 Return

End Sub