maurogsc.eu
|
![]() |
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