Aprire file (o cartelle di Excel) .XLS
(24/06/03)
Aggiornamento 09/10/03
: Aprire tutti i files .xls contenuti in una cartella.
Aggiornamento
02/06/05
: Controllare se un files .xls è già aperto. (e/o creare elenco
nomi cartelle .xls aperte)
Sul sito esistono
già suggerimenti per l'apertura di file .xls, anche nella sezione "le vs
domande", ma visto che continuano ad arrivare richieste specifiche,
dedichiamo una pagina all'argomento.
L'istruzione che serve all'uopo, è molto semplice:
Workbooks.Open Filename:="percorso e nome file",
ReadOnly:=False
dove in "percorso e nome file" dovrete indicare in sequenza: l'unità, la
cartella (directory), eventuali sottocartelle, nome del file completo di
estensione, ed inserito come una stringa, tra doppi apici, ad esempio: "C:\Documenti\Ufficio\Clienti.xls"
Come si nota, il percorso che mira al file è inserito direttamente
nell'istruzione e consente di aprire sempre e soltanto quel file. Come fare
allora quando vogliamo cambiare il file da aprire ? Imposteremo una
variabile che di volta in volta rappresenti il nome di un file, e
richiameremo la variabile nell'istruzione vista sopra.
Per assegnare il nome del file da aprire alla variabile, potremo usare vari
sistemi, vediamone alcuni, i più semplici:
-
usare una cella
del foglio di lavoro dove scrivere il SOLO nome (senza estensione, che sarà
già presente nell'istruzione, dato che vorremo aprire solo file .xls). In
questo modo, cambiando il nome, si aprirà quel file.
-
usare una InputBox
nella quale digitare il nome del file da aprire.
-
creare una tabella
con i nomi dei file che ci interessa aprire, assegnare al ListFillRange di
una ComboBox i riferimenti alle celle che delimitano la tabella, ed
assegnarle una cella di destinazione (LinkedCell) che restituisce di volta
in volta il nome selezionato nella ComboBox (sto riferendomi alla ComboBox
ActiveX presa NON da Moduli ma da Strumenti di controllo o Casella degli
strumenti). La LinkedCell sarà assegnata alla variabile.
Vediamo gli
esempi:
-
Sub apritisesamo()
Dim X As String
X = "C:\Documenti\"
& Range("A1").Value & ".xls"
Workbooks.Open Filename:=X, ReadOnly:=False
End Sub
Commenti: dichiariamo la variabile X come stringa (testo), poi assegniamo
alla X (tra doppi apici, rossi) il percorso del file, dove il solo nome del
file viene "preso" dal valore contenuto in una cella (nell'esempio la A1)
usando il concatenamento di stringa, cioè doppio apice(" verde), spazio, e
commerciale(&), spazio, riferimento alla cella come valore, spazio, e
commerciale (&), spazio, doppio apice(" verde). A questo punto, dopo
.Open FileName:= si scrive il nome della
variabile X senza doppi apici, in quanto X è già comprensiva di doppi apici.
Questo esempio è valido sia per il primo che per il terzo punto sopra
citati. Ora vediamo con l'InputBox :
-
Sub apritifile()
Dim X As String
nome = InputBox("Scrivi il nome del file da aprire")
If nome = "" Then Exit Sub
X = "C:\Excelweb\" & nome & ".xls"
Workbooks.Open Filename:=X, ReadOnly:=False
End Sub
-
Commenti: in
questo caso usiamo due variabili, la X di cui
dichiariamo il Tipo, e "nome", che senza
dimensionamento viene assunta come variabile di tipo
Variant, e che serve a reperire il nome del file che scriveremo nella
inputbox. Le altre cose che cambiano sono: l'aggiunta di una riga con la
condizione che se non scriviamo niente nella inputbox, si esca senza
generare errori, e la concatenazione della variabile "nome"
al posto del riferimento ad una cella.
Queste istruzioni
servono nel caso che i vari file a cui vogliamo accedere, siano tutti
all'interno di una stessa cartella. Se dovessimo aprire file che possono
essere su cartelle diverse, dovremo creare una variabile anche per il nome
della cartella, con lo stesso sistema in modo da poter variare sia il nome
cartella sia il nome file, e quindi, con l'uso di due celle, per reperire
nome cartella (A1) e nome file (B1), diventa:
o con le inputbox:
AGGIORNAMENTO
02/06/05
Ora vediamo invece come eseguire un controllo se un file .xls è già aperto :
se aperto, lo attiviamo, in caso contrario, lo apriremo. Usiamo quindi un
ciclo For Each che controlli i nomi di tutte le cartelle Excel (Workbook) in
quel momento aperte. Per la ricerca useremo il solo Nome della cartella
completo di estensione, ma senza percorso. Se la certella è aperta, anche se non
attiva in quel momento, la attiveremo ed usciremo dalla routine, viceversa
useremo una delle istruzioni viste sopra per aprirla:
-
Sub CercaApri()
For Each wb In Workbooks
If wb.Name = "Nomecartella.xls" Then
wb.Activate
Exit Sub
End If
Next
..e qui vanno le istruzioni per aprire il file se
non è già aperto, va bene anche questa:
-
Workbooks.Open Filename:="percorso e nome file
completo di estensione",
ReadOnly:=False
End Sub
Se invece vogliamo controllare se un file .xls è aperto e creare e
aggiornare una tabella contenente i nomi delle cartelle .xls aperte, usiamo
come sopra, un ciclo For Each Next per scorrere
le cartelle al momento aperte; e a seguire le istruzioni per memorizzare in una matrice
i nomi di dette cartelle .xls (escludendo la cartella su cui si lavora, e che
nell'esempio sotto ho chiamato "ScorriCartelle.xls") , indi puliamo la colonna che
dovrà contenere i nomi, e scriviamo nelle celle di un foglio i nomi ora contenuti in matrice;
questo provoca il naturale aggiornamento della lista delle cartelle .xls al
momento aperte:
Sub
LeggiCancellaScriviNomiCartelle()
Dim F
Dim iNomi() As String 'la variabile
iNomi è la matrice che conterrà i nomi letti nel ciclo For Each
Dim A
A = 1 'inizializiamo
un flag a 1 usando la variabile A
For Each Wb In Workbooks
'iniziamo un ciclo che scorra tutte le cartelle .xls aperte
If Wb.Name <> "ScorriCartelle.xls" Then
'se il nome è diverso dal nome della nostra
cartella
ReDim Preserve iNomi(1 To A)
'ridimensioniamo la matrice al valore di A
iNomi(A) = Wb.Name
'carichiamo il nome della cartella .xls in matrice
A = A + 1 'e
incrementiamo il flag A di 1
End If
Next 'si passa al
nome della cartella successiva
If A = 1 Then Exit Sub 'si controlla che
esistano nomi da scrivere, altrimenti usciamo dalla routine
Sheets(1).Range("A:A").ClearContents
'ora puliamo l'intervallo che ospiterà i
nomi delle cartelle
For F = LBound(iNomi()) To UBound(iNomi())
'e iniziamo un ciclo per scorrere la matrice
Sheets(1).Cells(F, 1) = iNomi(F) 'e
scriviamo nella cella riga F colonna 1 (all'inizio la A1) il 'nome
della cartella corrispondente all'indice F della matrice iNomi(F)
Next
End Sub |
Questa routine la potremo lanciare manualmente per ottenere l'aggiornamento
dell'elenco, oppure associare al lancio di altre macro. Si potrebbe
automatizzare (parzialmente) il lancio della macro sfruttando l'evento
Workbook_WindowActivate della cartella di lancio (la
ScorriCartelle.xls), MA RITORNANDO a selezionare la cartella dopo aver usato
il comando Apri/Chiudi del menù File, che aprirebbe una
nuova cartella posizionandola
inevitabilmente come cartella attiva (per questo è necessario ritornare
manualmente
alla cartella d'origine della routine, per attivarla) così:
------------------------------------------------------------------------------------------------------------
AGGIORNAMENTO
09/10/03
Quando si desideri, lavorando su un foglio, disporre di un comando per
aprire contemporaneamente più cartelle di Excel contenute in una determinata
Cartella dell'hard-disk (o Directory che dir si voglia), possiamo usare la
seguente routine messa a punto su una richiesta ricevuta. In questo esempio
sfruttiamo l'
"oggetto" FileSearch (che restituisce il
numero di file trovati e il nome di ciascuno di essi) e la sua
proprietà LookIn per la ricerca di files
all'interno di un percorso predefinito. La ricerca può essere fatta sia per
nome di file, sia per estensione del file, che per solo una parte del nome,
usando il carattere Jolly asterisco ( * ). Per determinare il nome o il tipo
del file (estensione) possiamo usare due proprietà del FileSearch:
la proprietà FileName, alla quale
assegneremo il nome o l'estensione del o dei files da cercare, es:
.FileName = "*.xls"
e saranno cercati tutti ( * ) i file di Excel
.FileName = "Fat*.xls"
e saranno cercati tutti i files Excel che
iniziano per Fat ( * )
la proprietà FileType, alla quale è
necessario assegnare una costante MsoFileType
(vedi guida in linea, digitando "FileType" e
selezionando "Proprietà FileType"), che per le
cartelle di Excel è la seguente.
.FileType =
msoFileTypeExcelWorkbooks
Sub ApriTutteCartelle()
Set fs = Application.FileSearch
'impostiamo con la variabile "fs" il FileSearch
With fs 'con la variabile "fs"
.LookIn = "C:\Temp"
'indicare il percorso della cartella in
cui cercare
'.Filename = "*.xls"
'alternativa se si sceglie di usare FileName
.FileType = msoFileTypeExcelWorkbooks 'in
questo esempio uso la costante
If .Execute() > 0 Then 'se la
ricerca dei file è superiore al numero zero
'si fornisce un messaggio
con il numero dei files trovati nel percorso scelto. Questa
istruzione può 'essere omessa, se non interessa.
MsgBox "Trovati " & .FoundFiles.Count & " file(s) xls."
'si inizia un ciclo For
Next che a partire dal primo file trovato e fino all'ultimo, (file
contati con
'.FoundFiles.Count)
For i = 1 To .FoundFiles.Count
'si aprono di seguito tutte le cartelle
trovate, usando
Workbooks.Open
Workbooks.Open .FoundFiles(i)
Next i
Else 'altrimenti si avvisa
col messaggio che non ci sono i files richiesti
MsgBox "Non ci sono file xls"
End If
End With
End Sub |
E' evidente che in questa routine il percorso dove cercare i file è un
percorso fisso, inserito nelle istruzioni. Se si volesse decidere di volta
in volta la cartella dove "pescare" i files .xls, basta rendere
variabile il percorso assegnato al .FileName
usando uno degli esempi presenti su questa pagina.
Buon lavoro
prelevato sul sito http://ennius.interfree.it |