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:

  • Sub apritisesamo2()
    Dim X As String
    X =
    "C:\" & Range("A1").Value & "\" & Range("B1").Value & ".xls"
    Workbooks.Open Filename:=X, ReadOnly:=False
    End Sub

o con le inputbox:

  • Sub apritifile2()
    Dim X As String
    cartella = InputBox("Scrivi il nome della cartella")
    If cartella = "" Then Exit Sub
    nome = InputBox("Scrivi il nome del file da aprire")

    If nome = "" Then Exit Sub
    X = "C:\" & cartella & "\" & nome & ".xls"
    Workbooks.Open Filename:=X, ReadOnly:=False
    End Sub

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ì:

  • Private Sub Workbook_WindowActivate(ByVal Wn As Window)   ' evento della cartella "ScorriCartelle.xls"
    LeggiCancellaScriviNomiCartelle 
    'chiamiamo la macro LeggiCancellaScriviNomiCartelle()
    End Sub

 

------------------------------------------------------------------------------------------------------------

 

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