Salvare il contenuto (Lista) di una ListBox. (valido anche per ComboBox ActiveX) - dal 04/09/04 pagina vista: volte

Questa volta ci occupiamo di come poter salvare il contenuto di una ListBox (ActiveX, cioè presa da "Casella degli strumenti" alias "Strumenti di controllo", non da "Moduli"), copiando la Lista in un file di testo. Lo scopo di questa operazione potrà essere quello di salvare una determinata combinazione di valori (testo, numeri o altro) presenti nella ListBox, oppure di stampare il file di testo così ottenuto. Ricordo che una ListBox si "popola" sfruttando tre metodi o proprietà:

  • AddItem - (metodo) serve ad aggiungere una voce nell'elenco di una ListBox

  • ListFillRange - (proprietà) Specifica l'origine (range di celle) da cui proviene un elenco di una ListBox. Si usa questa proprietà quando la ListBox (ActiveX) è inserita sul foglio di lavoro.

  • RowSource - (proprietà) Specifica l'origine (range di celle) da cui proviene un elenco di una ListBox. Si usa questa proprietà quando la ListBox (ActiveX) è inserita in una UserForm.

Presento tre soluzioni, per ListBox su UserfForm, tutte e tre si basano sul reperire il numero di voci presenti nell'elenco della ListBox, e con un ciclo For..Next, copiare un valore ad ogni ciclo in un file di testo. Le prime due necessitano di un file di testo (vuoto) precedentemente creato e posto in una cartella a vostro piacere, la terza invece provvederà anche alla creazione diretta del file di testo di cui forniremo noi il nome, scrivendolo nel codice, file che verrà salvato nella cartella Documenti di sistema (quindi C:\Documenti per le versioni antecedenti WindowsXP, in C:\Documents And Settings\Nome Utente\Documenti in XP). I più attenti potranno rendere con una variabile questo nome, in modo da creare nuovi file.Txt senza sovrascrivere i precedenti. Ma passiamo alle routines. La prima si basa sull'Istruzione Open che consente di eseguire operazioni di input/output (I/O) su un file, e ci affideremo ad un CommandButton per attivare le istruzioni:

Private Sub CommandButton1_Click()
'apriamo il file di testo precedentemente creato
Open "C:\TuaCartella\Tuonome.txt" For Output As #1
'con la variabile "n" prendiamo il numero di quante voci compongono l'elenco della 'ListBox
n = ListBox1.ListCount - 1
For i = 0 To n 
'inizializziamo il ciclo For Next assegnando alla variabile "i" il valore che 'partendo da zero si incrementa di uno e si concluderà quando il valore sarà "n"
ListBox1.ListIndex = i 
'identifichiamo il valore indice della ListBox rendendolo uguale a '"i", ottenendo (sotto) con la proprietà List il corrispondente valore presente nella riga 'dell'elenco "i" (testo, numero o altro) e con Print #1 copiamo (scriviamo) questo valore nel 'file di testo

Print #1, ListBox1.List(ListBox1.ListIndex)

Next i
'passiamo al successivo "i"

Close #1
'chiudiamo il file di testo così riempito e lo salviamo
MsgBox ("Eseguito!")
'indi si avvisa con il messaggio
End Sub

Il secondo esempio, simile al primo, sfrutta la Funzione CreateObject per l'apertura del file di testo(le istruzioni che spiegano questa funzione le potete leggere nell'articolo, stesa sezione, "DriveList, DirList,FileList"). Unica precisazione: poichè questa soluzione formerebbe un file di testo con i nomi della lista posto uno di seguito all'altro, anzichè riga per riga, viene inserita l'istruzione " f.WriteLine (" ") " che provvede a scrivere i nomi riga per riga:

Private Sub CommandButton2_Click()
Dim fs, f
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile("C:\TuaCartella\Tuonome.txt", 2, -2)

n = ListBox1.ListCount - 1
For i = 0 To n
ListBox1.ListIndex = i

'diversamente dall'esempio precedente, qui si usa l'istruzione Write #. A differenza 'dell'istruzione Print #, l'istruzione Write # inserisce virgole tra gli elementi e racchiude le 'stringhe tra virgolette mentre vengono scritte nel file. Non è necessario inserire nell'elenco 'delimitatori espliciti. Si potrebbe usare Write # per inserire un carattere di nuova riga, 'ovvero una sequenza ritorno a capo–avanzamento riga (Chr(13) + Chr(10)), dopo aver 'scritto nel file l'ultimo carattere dell'argomento elencooutput  (ListBox1.List)
f.Write ListBox1.List(ListBox1.ListIndex)
f.WriteLine (" ")
Next i
f.Close

MsgBox ("Eseguito!")
Set fs = Nothing
Set f = Nothing
End Sub

Il terzo esempio invece, non richiede che si sia preventivamente creato un file di testo perchè lo creiamo direttamente con le istruzioni, usando la Funzione CreateObject, con il metodo CreateTextFile per la creazione di un file di testo, seguito da dal metodo GetFile che restituisce il file appena creato e che viene aperto col metodo OpenAsTextStream il quale consente ci di leggere il file oppure di sovrascrivere il file o inserire altre informazioni alla fine del file. Infatti la sintassi del metodo OpenAsTextStream è composta dalle seguenti parti:

  • oggetto.OpenAsTextStream([modoIO, [formato]]), dove:

  • modoIO = Facoltativa. Indica la modalità di input/output e può corrispondere a una delle seguenti tre costanti: ForReading ( valore 1 = Apre un file in sola lettura. Non è possibile scrivere nel file), ForWriting ( valore 2 = Apre un file in scrittura. Se esiste un file con lo stesso nome, il suo contenuto verrà sovrascritto) o ForAppending ( valore 8 = Apre un file e scrive alla fine del file.)

  • formato = Facoltativa. Uno dei tre valori Tristate utilizzati per indicare il formato del file aperto. Se viene omesso, il file verrà aperto in formato ASCII.(TristateUseDefault, valore -2 = Apre il file utilizzando l'impostazione predefinita di sistema. - TristateTrue, valore -1 = Apre il file in formato Unicode - TristateFalse, valore 0 = Apre il file in formato ASCII.)

Private Sub CommandButton3_Click()
Dim fs, f, ts, s
'dichiarazione variabili
Set fs = CreateObject("Scripting.FileSystemObject")
fs.CreateTextFile "Miotesto.txt" 
'Crea un file di testo nella cartella di sistema
Set f = fs.GetFile("Miotesto.txt")
Set ts = f.OpenAsTextStream(2, -2)


n = ListBox1.ListCount - 1
For i = 0 To n
ListBox1.ListIndex = i
ts.Write ListBox1.List(ListBox1.ListIndex) 
'vedi esempio precedente
ts.WriteLine (" ")
Next i
ts.Close

MsgBox ("Eseguito!")
Set fs = Nothing
Set f = Nothing
Set ts = Nothing

End Sub

Potrete divertirvi e fare prove, imparando ad usare la guida in linea per approfondire i metodi e le funzioni qui usate.

Buon lavoro.

prelevato sul sito www.ennius.altervista.org