Descrizione :
Come generare una Matrice quadrata con valori Random su Foglio Excel.
+ Articolo :
Nell'esempio seguente viene generata una Matrice quadrata con valori binari [0,1], con un numero prefissato di valori "1", e con tutti "0" sulla diagonale. Il codice è abbastanza semplice e lineare da consentire facilmente qualsiasi modifica o adattamento.
Poniamo che la mia matrice 15x15 debba occupare il Range [N1:AB15], e che il numero desiderato di numeri 1 da inserire sia 20 :
Dim WB As Worksheet 'Imposta Foglio
Set WB = Worksheets("Foglio1")
Dim C As Range 'Imposta Cella iniziale : angolo alto-sinistro matrice
Set C = WB.Range("N1")
Dim m As Integer 'Imposta dimensione matrice (quadrata)
m = 15
Dim num1 As Integer 'Imposta numeri 1 desiderati in matrice
num1 = 20
Dim cnt1 As Integer
Dim indMinR As Long 'Indice minimo riga
indMinR = C.Row
Dim indMinC As Long 'Indice minimo colonna
indMinC = C.Column
Dim indMaxR As Long 'Indice max riga
indMaxR = C.Offset(m - 1, 0).Row
Dim indMaxC As Long 'Indice max colonna
indMaxC = C.Offset(0, m - 1).Column
Dim indR As Long
Dim indC As Long
WB.Range(C, C.Offset(m - 1, m - 1)) = 0
WB.Range(C, C.Offset(m - 1, m - 1)).Interior.Color = vbWhite
Do
indR = RandomizzaIntero(indMinR, indMaxR)
indC = RandomizzaIntero(indMinC, indMaxC)
If WB.Cells(indR, indC).Value = 0 And (indR - C.Row) <> (indC - C.Column) Then
WB.Cells(indR, indC).Value = 1
WB.Cells(indR, indC).Interior.Color = vbGreen
cnt1 = cnt1 + 1
End If
Loop Until cnt1 = num1dove RandomizzaIntero() è la semplice Function :Public Function RandomizzaIntero(ByVal min As Long, ByVal max As Long) As Long RandomizzaIntero = Int((max - min + 1) * Rnd + min) End Functionmin e max sono argomenti che permettono di selezionare un range entro cui la Function dovrà restituire il numero Long Random.
In soldoni, un RandomizzaIntero( 2, 4 ) restituirà {2,3,4} ( perciò estremi inclusi ).
In caso di argomenti invertiti, invece un RandomizzaIntero( 6, 3 ) restituirà un range di valori con estremi esclusi : {4,5}.
Il risultato sarà di questo tipo :
In pratica si Randomizza l'indirizzo di cella all'interno del Range desiderato, il che garantisce una buona distribuzione "casuale" dei valori.
Con "C" scelgo la cella da cui inizia la matrice ( cella in alto a sinistra - in questo caso N1 )
e con "m" la dimensione ( la matrice quadrata avrà m righe x m colonne ).
Offset restituisce un oggetto Range che rappresenta un intervallo distanziato dall'intervallo specificato.
Se applicato ad una cella restituisce la cella che si ottiene spostandosi dalla cella di partenza di un numero di celle defnito dai parametri (RowOffset, ColumnOffset).
+ Fine Articolo.



10:54
MarcoGG


Posted in:
0 commenti:
Posta un commento