Ciao,
interessanti i tuoi quesiti.
Per la prima parte ti posto il codice che utilizzerei io e poi te lo illustro rapidamente visto che è poco che usi VBA.
codice:
Private Sub CommandButton1_Click()
Worksheets("Foglio2").Activate
Dim d As Integer, i, j, Casella, SommaAx, SommaBx, SommaSx, SommaDx, SommaD1, SommaD2
With Worksheets("Foglio2")
.Range(.Cells(1, 1), .Cells(20, 20)).Value = ""
End With
SommaAx = 0
SommaBx = 0
SommaSx = 0
SommaDx = 0
SommaD1 = 0
SommaD2 = 0
Randomize
d = InputBox("Lato matrice")
For i = 1 To d
For j = 1 To d
Cells(i, j) = Int((Rnd * 2))
Next j
Next i
For Each Casella In Range(Cells(1, 1), Cells(d, d))
If Casella.Row = 1 Then
SommaAx = SommaAx + Casella.Value
End If
If Casella.Row = d Then
SommaBx = SommaBx + Casella.Value
End If
If Casella.Column = 1 Then
SommaSx = SommaSx + Casella.Value
End If
If Casella.Column = d Then
SommaDx = SommaDx + Casella.Value
End If
If Casella.Row = Casella.Column Then
SommaD1 = SommaD1 + Casella.Value
End If
If Casella.Row + Casella.Column = d + 1 Then
SommaD2 = SommaD2 + Casella.Value
End If
Next
[h1].Value = SommaAx
[h2].Value = SommaBx
[h3].Value = SommaSx
[h4].Value = SommaDx
[h5].Value = SommaD1
[h6].Value = SommaD2
End Sub
come vedi l'ho associato ad un pulsante (CommandButton1) ma questo è solo per mia comodità di prove.
La activate non è proprio necessaria, serve a definire una volta per tutte in quale foglio si sta lavorando per evitare di doverlo ripetere ogni volta che serve nel resto del codice.
Appena comincio pulisco un'area di 20 x 20 e inizializzo le sei variabili che conterranno le sei somme (Alto, Basso, Sinistra, Destra, Diagonale1, Diagonale2).
Segue l'istruzione randomize che genera una nuova sequenza casuale. Questo equivale a "mescolare le carte" mentre la RND si limita a "distribuirle".
Poi chiedo all'utente con una inputbox di indicare il lato che dovrà avere la matrice di numeri.
Per poter parlare di diagonale la matrice dev'essere quadrata quindi chiedo un solo valore, credo che averne 2 (h ed l) come avevi fatto tu sia scorretto.
Ho modificato anche la RND per non ottenere dei valori decimali (che poi falsano le somme).
Il cuore di tutto è la For Each che esplora, casella per casella, un range. In questo caso il range va da (1,1) a (d,d).
All'interno di questo ciclo individuo se la casella appartiene a un lato o a una digonale e incremento il corrispondente contatore che poi visualizzo nelle caselle h1, h6.
Per la spirale invece devo pensarci un po' perché non è tanto facile. Il fatto è che, per mia soddisfazione personale, voglio trovare una formula generale da inserire nella for each che permetta di assegnare ad ogni cella, partendo dalle sue coordinate la posizione finale che avrà nell'array dei risultati.
Nei prossimi giorni ti farò sapere qualcosa.
Spero di esserti stato utile.
Ciao