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

Rispondi quotando