' Generates Simple Magic Squares of Subtraction (12 x 12)
' Part II, Resulting Magic Diagonals
' Tested with Office 365 under Windows 10
Sub CnstrSqrs12b()
Dim a(144), a1(12), a2(12)
Dim a3(12, 12), a4(12, 12), a5(24), d1(12), d2(12)
Dim b(144), Line12(12)
''y = MsgBox("Blocked", vbInformation, "CnstrSqrs12b")
''End
Sheets("Klad1").Select
n1 = 0: n9 = 0: k1 = 1: k2 = 1
s1 = 870
Res12 = 72
ShtNm1 = "GenLns12"
ShtNm2 = "ScrSht12"
t1 = Timer
' Read Semi Magic Squares
For j100 = 198 To 198
''Cells(1, 1).Value = j100
For i1 = 1 To 144
a(i1) = Sheets(ShtNm1).Cells(j100, i1).Value
Next i1
' Check Possible Diagonals
GoSub 200: If fl1 = 0 Then GoTo 5 'Write Sets 'ScrSht12'
GoSub 400: If n29 = 0 Then GoTo 5 'Check Valid Sets
5
1000 Next j100
t2 = Timer
t10 = Str(t2 - t1) + " sec., " + Str(n9) + " Solutions for sum" + Str(s1)
y = MsgBox(t10, 0, "Routine CnstrSqrs12b")
End
' Check Possibility Diagonals
200 fl1 = 1
i2 = 1: i3 = 0
For i1 = 1 To 144:
i3 = i3 + 1: If i3 = 13 Then i3 = 1: i2 = i2 + 1
a3(i2, i3) = a(i1)
Next i1
i31 = 0
For i11 = 1 To 12
y = MsgBox("i11 = " + CStr(i11), 0, "Test")
For i12 = 1 To 12
If i12 = i11 Then GoTo 220
For i13 = 1 To 12
If i13 = i11 Or i13 = i12 Then GoTo 230
For i14 = 1 To 12
If i14 = i11 Or i14 = i12 Or i14 = i13 Then GoTo 240
For i15 = 1 To 12
If i15 = i11 Or i15 = i12 Or i15 = i13 Or i15 = i14 Then GoTo 250
For i16 = 1 To 12
If i16 = i11 Or i16 = i12 Or i16 = i13 Or i16 = i14 Or i16 = i15 Then GoTo 260
For i17 = 1 To 12
If i17 = i11 Or i17 = i12 Or i17 = i13 Or i17 = i14 Or i17 = i15 Or i17 = i16 Then GoTo 270
For i18 = 1 To 12
If i18 = i11 Or i18 = i12 Or i18 = i13 Or i18 = i14 Or i18 = i15 Or i18 = i16 Or i18 = i17 Then GoTo 280
For i19 = 1 To 12
If i19 = i11 Or i19 = i12 Or i19 = i13 Or i19 = i14 Or i19 = i15 Or i19 = i16 Or i19 = i17 Then GoTo 290
If i19 = i18 Then GoTo 290
For i20 = 1 To 12
If i20 = i11 Or i20 = i12 Or i20 = i13 Or i20 = i14 Or i20 = i15 Or i20 = i16 Or i20 = i17 Then GoTo 320
If i20 = i18 Or i20 = i19 Then GoTo 320
For i21 = 1 To 12
If i21 = i11 Or i21 = i12 Or i21 = i13 Or i21 = i14 Or i21 = i15 Or i21 = i16 Or i21 = i17 Then GoTo 330
If i21 = i18 Or i21 = i19 Or i21 = i20 Then GoTo 330
For i22 = 1 To 12
If i22 = i11 Or i22 = i12 Or i22 = i13 Or i22 = i14 Or i22 = i15 Or i22 = i16 Or i22 = i17 Then GoTo 340
If i22 = i18 Or i22 = i19 Or i22 = i20 Or i22 = i21 Then GoTo 340
s12 = a3(1, i11) + a3(2, i12) + a3(3, i13) + a3(4, i14) + a3(5, i15) + a3(6, i16) +
+ a3(7, i17) + a3(8, i18) + a3(9, i19) + a3(10, i20) + a3(11, i21) + a3(12, i22)
If s12 <> s1 Then GoTo 340
Erase b, Line12
b(a3(1, i11)) = a3(1, i11)
b(a3(2, i12)) = a3(2, i12)
b(a3(3, i13)) = a3(3, i13)
b(a3(4, i14)) = a3(4, i14)
b(a3(5, i15)) = a3(5, i15)
b(a3(6, i16)) = a3(6, i16)
b(a3(7, i17)) = a3(7, i17)
b(a3(8, i18)) = a3(8, i18)
b(a3(9, i19)) = a3(9, i19)
b(a3(10, i20)) = a3(10, i20)
b(a3(11, i21)) = a3(11, i21)
b(a3(12, i22)) = a3(12, i22)
q2 = 0
For q1 = 1 To 144
If b(q1) = q1 Then
q2 = q2 + 1: Line12(q2) = q1
End If
Next q1
s12 = Line12(12) - Line12(11) + Line12(10) - Line12(9) + Line12(8) - Line12(7) +
+ Line12(6) - Line12(5) + Line12(4) - Line12(3) + Line12(2) - Line12(1)
If s12 <> Res12 Then GoTo 340
i31 = i31 + 1
Sheets(ShtNm2).Cells(i31, 11).Value = a3(1, i11)
Sheets(ShtNm2).Cells(i31, 12).Value = a3(2, i12)
Sheets(ShtNm2).Cells(i31, 13).Value = a3(3, i13)
Sheets(ShtNm2).Cells(i31, 14).Value = a3(4, i14)
Sheets(ShtNm2).Cells(i31, 15).Value = a3(5, i15)
Sheets(ShtNm2).Cells(i31, 16).Value = a3(6, i16)
Sheets(ShtNm2).Cells(i31, 17).Value = a3(7, i17)
Sheets(ShtNm2).Cells(i31, 18).Value = a3(8, i18)
Sheets(ShtNm2).Cells(i31, 19).Value = a3(9, i19)
Sheets(ShtNm2).Cells(i31, 20).Value = a3(10, i20)
Sheets(ShtNm2).Cells(i31, 21).Value = a3(11, i21)
Sheets(ShtNm2).Cells(i31, 22).Value = a3(12, i22)
340 Next i22
330 Next i21
320 Next i20
290 Next i19
280 Next i18
270 Next i17
260 Next i16
250 Next i15
240 Next i14
230 Next i13
220 Next i12
210 Next i11
If i31 < 2 Then fl1 = 0: Return
150
n19 = 0
For j11 = 1 To i31
n20 = 12: Erase a5
For i1 = 1 To 12
a1(i1) = Sheets(ShtNm2).Cells(j11, i1 + 10).Value
Next i1
For i1 = 1 To 12 'First Line
a5(i1) = a1(i1)
Next i1
For j12 = j11 + 1 To i31
j300 = j12: GoSub 300: If fl2 = 0 Then GoTo 120
' Write Set Diagonals to 'ScrSht12'
For i1 = 1 To 2
n19 = n19 + 1: If n19 > 45000 Then Return
For i2 = 1 To 12
Sheets(ShtNm2).Cells(n19, i2 + 24).Value = a5(i2 + (i1 - 1) * 12)
Next i2
Sheets(ShtNm2).Cells(n19, 13 + 24).Value = i1
Next i1
n20 = n20 - 12
120 Next j12
n20 = n20 - 12
110 Next j11
If n19 < 2 Then fl1 = 0
Return
' Construct Magic Set Diagonals
300 fl2 = 1
For i1 = 1 To 12
a2(i1) = Sheets(ShtNm2).Cells(j300, i1 + 10).Value
Next i1
For i1 = 1 To 12
a20 = a2(i1)
For i2 = 1 To n20
If a20 = a5(i2) Then fl2 = 0: Return
Next i2
Next i1
n20 = n20 + 12
i2 = 0
For i1 = n20 - 12 + 1 To n20
i2 = i2 + 1
a5(i1) = a2(i2)
Next i1
Return
' Read Diagonals for Final Check
400
n29 = 0
For j20 = 1 To n19 - 1 Step 2
For i1 = 1 To 12
d1(i1) = Sheets(ShtNm2).Cells(j20, i1 + 24).Value
d2(i1) = Sheets(ShtNm2).Cells(j20 + 1, i1 + 24).Value
Next i1
Erase a4
For i1 = 1 To 12
For i2 = 1 To 12
If a3(i1, i2) = d1(i1) Then a4(i1, i2) = 1
If a3(i1, i2) = d2(i1) Then a4(i1, i2) = 2
Next i2
Next i1
GoSub 450 'Check if transformation is possible
If fl1 = 1 Then
n29 = n29 + 1
' Print Semi Magic Squares
' Required Transformation Highlighted
n9 = n9 + 1: GoSub 650
End If
Next j20
Return
' Check if transformation is possible
450 fl1 = 1
For i1 = 1 To 12 'rows
n21 = 0
For i2 = 1 To 12 'clmns
If a4(i1, i2) <> 0 Then
n21 = n21 + 1
If n21 = 1 Then i41 = i2 Else i42 = i2
End If
Next i2
For i3 = i1 + 1 To 12
If a4(i3, i41) = 0 And a4(i3, i42) = 0 Then
'continue
Else
If a4(i3, i41) = a4(i1, i42) And a4(i3, i42) = a4(i1, i41) Then
Exit For 'ok
Else
fl1 = 0: Return 'no match
End If
End If
Next i3
Next i1
Return
' Print Semi Magic Squares
' Required Transformation Highlighted
650 n2 = n2 + 1
If n2 = 5 Then
n2 = 1: k1 = k1 + 13: k2 = 1
Else
If n9 > 1 Then k2 = k2 + 13
End If
Cells(k1, k2 + 1).Select
Cells(k1, k2 + 1).Font.Color = -4165632
Cells(k1, k2 + 1).Value = n9
i3 = 0
For i1 = 1 To 12
For i2 = 1 To 12
i3 = i3 + 1
Cells(k1 + i1, k2 + i2).Value = a(i3)
Select Case a4(i1, i2)
Case 1
Range(Cells(k1 + i1, k2 + i2), Cells(k1 + i1, k2 + i2)).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.149998474074526
.PatternTintAndShade = 0
End With
Case 2
Range(Cells(k1 + i1, k2 + i2), Cells(k1 + i1, k2 + i2)).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.599993896298105
.PatternTintAndShade = 0
End With
Case 0
End Select
Next i2
Next i1
Return
' Print results (squares)
750 n2 = n2 + 1
If n2 = 5 Then
n2 = 1: k1 = k1 + 13: k2 = 1
Else
If n9 > 1 Then k2 = k2 + 13
End If
Cells(k1, k2 + 1).Font.Color = -4165632
Cells(k1, k2 + 1).Value = n9
i3 = 0
For i1 = 1 To 12
For i2 = 1 To 12
i3 = i3 + 1
Cells(k1 + i1, k2 + i2).Value = a(i3)
Next i2
Next i1
Return
End
End Sub