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.
0 commenti:
Posta un commento