maurogsc.eu
mauro gamberini


home ==> Excel: articoli ==> Nomi - Archiviare dati in un Nome

Nomi - Archiviare dati in un Nome

Situazione.
Vogliamo archiviare un Array(matrice) da riutilizzare alla prossima apertura del file. In definitiva vogliamo che i dati siano nascosti e persistenti  fra una sessione e l'altra del nostro file di Excel. Il sistema più semplice(e logico) sarebbe quello di utilizzare un foglio nascosto, ma è possibile farlo utilizzando un Name.

Nota.
Il codice dell’esempio è scaricabile a questo link. Il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità su eventuali problemi causati dal codice o dai files se usati impropriamente. Utilizzate gli esempi forniti o files di test per le vostre prove. Codice e file sono stati testati con(e quindi validi per) Excel 2000/Xp(2002)/2003/2007/2010.

Subito il codice.
ALT+F11 e siamo nell’editor del Visual Basic di Excel. Cominciamo con inserire un modulo standard nel nostro progetto(Inserisci-->Modulo). Inseriamo questo codice che ci consente di creare l'Array e di assegnarlo al Name:

Public Sub mCreaArray()
    
    'dichiaro le variabili
    Dim ly As Long
    Dim lx As Long
    Dim myArray As Variant
    
    'dimensiono l'Array
    'ricordandomi che gli Array
    'sono in base 0(zero), cioè
    'la prima riga e la prima colonna
    'sono riga 0 e colonna 0, quindi
    'il myArray(2,3) avrà 3 righe e
    '4 colonne
    ReDim myArray(2, 3)
    
    'eseguo un ciclo For per riempire
    'gli Items dell'Array
    
    'le rige
    For lx = 0 To 2
        'le colonne
        For ly = 0 To 3
            'assegno i valori
            myArray(lx, ly) = _
                "R" & lx & "C" & ly
        Next
    Next
    
    'creo un Nome(Name), gli assegno l'Array
    'e lo rendo non visibile
    ActiveWorkbook.Names.Add Name:="myName", _
        RefersTo:=myArray, Visible:=False
 
End Sub

Questi sono i valori contenuti nell' Array e passati al Name:

R0C0 R0C1 R0C2 R0C3
R1C0 R1C1 R1C2 R1C3
R2C0 R2C1 R2C2 R2C3

Un modo per verificare il contenuto del nostro Name, se non ho settato a False il parametro Visible, è questo. ALT + F11 e torniamo in Excel. Visualizziamo la finestra per la gestione dei nomi, selezioniamo myName e in *Riferito a:* vedremo i dati passati da myArray al Name. Ripeto però, solo se il parametro Visible è settato a True od omesso.

Utilizziamo i dati del Name.
Una volta caricato l'Array nel Name, possiamo eliminare la routine che l'ha creato. Adesso vediamo come utilizzare quanto *nascosto* nel Name, per esempio in una ListBox di una UserForm. Creiamo la UserForm(Inserisci-->UserForm), inseriamo una ListBox e mettiamo questo codice nel modulo di codice della UserForm:

'evento che si scatena quando creo la UserForm
Private Sub UserForm_Initialize()
    'lancio la routine che carica
    'il contenuto di myName nella
    'ListBox1
    Call mCaricaListBox1
End Sub

'routine che carica la ListBox1
Private Sub mCaricaListBox1()

    'dichiaro le variabili
    Dim aArray() As Variant
    Dim lRiga As Long
    Dim lCol As Long

    'carico il Name myName in una matrice
    'Attenzione!!! L'Array(aArray)restituito
    'dal Name è in Base 1
    aArray = [myName]
    
    With Me.ListBox1
        'dichiaro le colonne della ListBox,
        'nella ListBox siamo in Base 0,
        'righe e colonne iniziano da 0,
        'quindi ColumnCount = 4 vuol dire che
        'ho 4 colonne, colonna 0,1,2,3
        .ColumnCount = 4
        
        'ciclo la matrice e la carico nella ListBox
        
        'per ogni riga di aArray
        For lRiga = 1 To UBound(aArray)
            'aggiungo una riga alla ListBox1
            .AddItem
            'per ogni colonna della riga
            For lCol = 1 To 4
                'popolo le colonne della riga della ListBox1
                'con i dati delle rispettive righe e colonne
                'di aArray, tenendo conto che righe e colonne
                'sono in Base 0 nella ListBox1 e in Base 1
                'in aArray.
                .List(lRiga - 1, lCol - 1) = _
                    aArray(lRiga, lCol)
            Next
        Next
    End With

End Sub

Visualizzando la UserForm1, troveremo i dati salvati nel Name myName sulla nostra ListBox1.  Possiamo utilizzare un determinato valore del nostro Name da una routine in questo modo:

Public Sub mUtilizzaName()

    'dichiaro le variabili
    Dim aArray() As Variant

    'carico il Name myName in una matrice
    'Attenzione!!! L'Array(aArray)restituito
    'dal Name è in Base 1
    aArray = [myName]
    
    'visualizzo un dato dell'Array
    'riga 2, colonna 2(ricordarsi del
    'passaggio Base 0 --> Base 1
    'fra l'Array originale e questo
    'Array. Il risultato sarà R1C1
    MsgBox CStr(aArray(2, 2))
    
End Sub

Ovviamente il valore recuperato può essere passato ad una variabile o posso ciclare tutto il Name:

Public Sub mCiclaName()

    'dichiaro le variabili
    Dim aArray() As Variant
    Dim lRiga As Long
    Dim lCol As Long

    'carico il Name myName in una matrice
    'Attenzione!!! L'Array(aArray)restituito
    'dal Name è in Base 1
    aArray = [myName]
    
    'ciclo aArray(ricordarsi Base 1)
    
    'per ogni riga
    For lRiga = 1 To UBound(aArray)
        'per ogni colonna
        For lCol = 1 To 4
            'scrivi nella finestra Immediata
            'il valore dell'Item
            Debug.Print aArray(lRiga, lCol)
        Next
    Next
    
End Sub

Per ulteriori informazioni su Microsoft Excel ed il suo Visual Basic, utilizzate questo forum:
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads


Ultimo aggiornamento di questa pagina: 15/10/2009 - mauro gamberini