martedì 25 ottobre 2011

[Excel VBA] Matrice con Valori Random

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 = num1
dove 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 Function
min 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.

Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.



0 commenti:

Posta un commento

Favorites Twitter Facebook Delicious Digg Stumbleupon More

 
Design by Free WordPress Themes Modificato da MarcoGG