As a way to improve my VBA understanding, I'm attempting to build a cross sum solver. A cross sum, for those who don't know being the below. Each blank cell can contain a number 1 - 9, but the number can only be in the grid once and all sums must reconcile.
I've got some code with nested for and if statements that does put in all possible variations in the cells but it take forever and I'm sure it's a highly inefficient way of doing it.
Sub Test()
Dim StartTime As Double
Dim SecondsElapsed As Double
StartTime = Timer
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
Application.ScreenUpdating = False
Dim i, j, k, l, m, n, o, p, q As Integer
For i = 1 To 9
ws.Range("A1").Value = i
For j = 1 To 9
If j <> ws.Range("A1").Value Then
ws.Range("C1").Value = j
End If
For k = 1 To 9
If k <> ws.Range("A1").Value Then
If k <> ws.Range("C1").Value Then
ws.Range("E1").Value = k
End If
End If
For l = 1 To 9
If l <> ws.Range("A1").Value Then
If l <> ws.Range("C1").Value Then
If l <> ws.Range("E1").Value Then
ws.Range("A3").Value = l
End If
End If
End If
For m = 1 To 9
If m <> ws.Range("A1").Value Then
If m <> ws.Range("C1").Value Then
If m <> ws.Range("E1").Value Then
If m <> ws.Range("A3").Value Then
ws.Range("B3").Value = m
End If
End If
End If
End If
For n = 1 To 9
If n <> ws.Range("A1").Value Then
If n <> ws.Range("C1").Value Then
If n <> ws.Range("E1").Value Then
If n <> ws.Range("A3").Value Then
If n <> ws.Range("C3").Value Then
ws.Range("E3").Value = n
End If
End If
End If
End If
End If
For o = 1 To 9
If o <> ws.Range("A1").Value Then
If o <> ws.Range("C1").Value Then
If o <> ws.Range("E1").Value Then
If o <> ws.Range("A3").Value Then
If o <> ws.Range("C3").Value Then
If o <> ws.Range("E3").Value Then
ws.Range("A5").Value = o
End If
End If
End If
End If
End If
End If
For p = 1 To 9
If p <> ws.Range("A1").Value Then
If p <> ws.Range("C1").Value Then
If p <> ws.Range("E1").Value Then
If p <> ws.Range("A3").Value Then
If p <> ws.Range("C3").Value Then
If p <> ws.Range("E3").Value Then
If p <> ws.Range("A3").Value Then
ws.Range("C5").Value = p
End If
End If
End If
End If
End If
End If
End If
For q = 1 To 9
If q <> ws.Range("A1").Value Then
If q <> ws.Range("C1").Value Then
If q <> ws.Range("E1").Value Then
If q <> ws.Range("A3").Value Then
If q <> ws.Range("C3").Value Then
If q <> ws.Range("E3").Value Then
If q <> ws.Range("A5").Value Then
If q <> ws.Range("C5").Value Then
ws.Range("E5").Value = q
End If
End If
End If
End If
End If
End If
End If
End If
Next q
Next p
Next o
Next n
Next m
Next l
Next k
Next j
Next i
Application.ScreenUpdating = True
SecondsElapsed = Round(Timer - StartTime, 2)
MsgBox "This code ran successfully in " & SecondsElapsed & " seconds", vbInformation
End Sub
Is there a more sensible way to achieve the putting the numbers in the cells? I've got the evaluate part to do the sums dependent upon the operators and the answer already working, so once I've got this working I'd not put it in the cell every time, but just pass to a variable. I'm just putting the value in a cell for the sake of testing.
Many thanks

