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