Cercare l'ultimo file in una cartella, e usarne il nome. - dal 04/09/04 pagina vista: volte

E' possibile cercare ed ottenere anche un elenco completo dei nomi dei files presenti sull'hard-disk, all'interno anche di cartelle, e magari solo i file con una determinata estensione, ma quando si richieda di voler cercare l'ultimo file inserito in una cartella, ci troviamo costretti a decidere il criterio di ricerca.

Si possono creare routine diverse, per ottenere il nostro risultato, e di norma, l'ultimo file che in genere si trova in una cartella viene ordinato da Windows in base al nome del file, da A a Z, indipendentemente dal tipo di file o di estensione.

Una routine che cerchi in assoluto l'ultimo nome di file in una cartella potrebbe non servirci, restituendolo senza possibilità di decisione da parte nostra ciò che invece vorremmo. E' altrettanto vero che con un minimo di organizzazione, potremmo ottenere il risultato voluto: basterà infatti creare una cartella dove salvare un certo tipo di file, e nell'assegnare il nome, scegliere un numero progressivo, esempio: fatt001.xls, fatt002.xls, fatt003.xls, ecc. ecc.. Appare evidente che l'ultimo file presente in quella cartella, corrisponderà al nome con il numero più alto. Questo comporta però una maggior attenzione nell'assegnazione del nome, infatti fat18.xls, se fosse l'ultimo file salvato, non verrebbe comunque trovato come ultimo perchè in un elenco progressivo, fat18 viene prima di fatt001.

Passiamo ad esaminare le routine. La prima si basa sull' oggetto FileSearch che sfruttando il metodo Execute consente di definire tramite il suo argomento SortBy il metodo di ricerca . Si possono all'uopo usare delle costanti MsoSortBy per definirne il metodo, ne cito alcune:

  • msoSortByFileName  Predefinito (in assenza della costante viene ordinato comunque per nome del file)
    msoSortByFileType   Restituisce il file in base all'estensione
    msoSortByLastModified  Restituisce l'ultimo file modificato (o salvato). Quando si modifica o si salva ul file, il S.O. assegna al file anche la data e l'ora della modifica. Per vedere queste informazioni basta impostare, in Esplora Risorse, la visualizzazione a "dettagli", e comparirà anche la colonna relativa all'ultima modifica.
    msoSortBySize  Restituisce il file in funzione della sua dimensione (kb)

L'altro argomento di  Execute è SortOrder che determina il relativo ordinamento, di default o non assegnato, e del tipo ascendente (da A a Z msoSortOrderAscending) altrimenti discendente (da Z ad A msoSortOrderDescending, o se preferite dal più grande al più piccolo, oppure dal maggiore al minore.

Il metodo Execute serve per avviare la ricerca ed aggiornare l'oggetto FoundFiles, che restituirà tutti i file presenti nella cartella di ricerca, seguendo le impostazioni di SortBy, per cui nella routine sotto, poichè come esempio intendiamo trovare solo l'ultimo file Modificato e non tutti, inseriremo l'istruzione Exit For per uscire dal ciclo di ricerca appena trovato l'ultimo file modificato. E' necessario costruire un ciclo per la ricerca in quanto FoundFiles restituisce un numero di indice che rappresenta il percorso completo del file, ed il ciclo serve a scorrere comunque tutti i file presenti, anche se poi usciremo appena trovato il file ultimo modificato.( Attenzione. il file ultimo modificato è quello che porta la data più recente, cioè la più grande in termini di ordinamento, ed infatti useremo msoSortOrderDescending).

Domanda: cosa facciamo con il file così trovato? Simuliamo di creare un collegamento a questo file usando il metodo Add dell'oggetto HyperLinks. E dove lo mettiamo questo collegamento? potremo usare un riferimento ad una precisa cella, oppure alla cella che decideremo di selezionare prima di lanciare la macro, e che quindi sarà la cella attiva. Questo ci consentirà di decidere di volta in volta dove inserire il collegamento al file cercato.

E passiamo alle due routine. La prima:

Sub CercaUltimoFile()
Set fs = Application.FileSearch
'settiamo la variabile fs con FileSearch
With fs  'con la variabile fs
.LookIn = "C:\Documenti" 'cerchiamo nella cartella (indicare il percorso completo)
'.SearchSubFolders =  True 'questa istruzione nel caso la cartella contenga sotto cartelle e si 'voglia cercare anche in queste
.Filename = "*.jpg"
'indichiamo il tipo di file da cercare (asterisco-punto-estensione: cioè tutti i file 'con estensione .jpg. potrete cercare quel che vorrete indicando un'altra estensione

'sotto: letteralmente: se l'esecuzione della ricerca (con i parametri impostati) trova dei file, quindi 'il valore restituito è maggiore di zero, allora:
If .Execute(SortBy:=msoSortByLastModified, SortOrder:=msoSortOrderDescending) > 0 Then
'sotto: si inizia il ciclo che parte dal primo file ordinato per SortBy e terminerà all'ultimo valore rappresentato dal totale dei file presenti (FoundFiles.Count)
For i = 1 To .FoundFiles.Count
'sotto: poichè il metodo Add dell'hyperLinks si applica all'oggetto Range e non a Cells, useremo 'la variabile "cella" per reperire l'indirizzo (Address) della cella attiva, variabile che useremo al 'posto del riferimento alla cella nell'istruzione .Range("riferimento").
cella = ActiveCell.Address

'sotto: poichè il metodo Add richiede che venga definito il percorso completo che mira al file su 'cui impostare il collegamento, convertiamo con la variabile X il percorso al file rappresentato dal 'valore indice (i) di  FoundFiles(i)
X = .FoundFiles(i)

'sotto: se stiamo lavorando sulla cella attiva è evidente che siamo anche sul foglio attivo. Se si 'fosse scelto di collegare una cella usando un riferimento preciso compreso il foglio, potevamo 'creare il collegamento su quel foglio direttamente, e anzichè scrivere With Activesheet avremmo 'potuto scrivere With Worksheets("Quelchetipare") anche se la macro la lanciavamo da un altro 'foglio. Dovremmo eliminare l'istruzione : cella = ActiveCell.Address e conseguentemente la riga Hyperlinks diventerebbe : .Hyperlinks.Add .Range("tuoRiferimento"), X
With Activesheet
.Hyperlinks.Add .Range(cella), X
 'inseriamo il collegamento
End With
Exit For
 'ed usciamo dal ciclo For Next
Next i
Else
 'altrimenti se Execute non trova i file richiesti si avvisa con un messaggio.
MsgBox "Non esistono i file Cercati"
End If
End With

End Sub

Questa routine non è difficile da capire ed eventualmente modificare secondo le proprie esigenze.

Vediamo ora un'altra routine, non mia, ma compilata da Giuliano Quattrini  e-mail  farmaciaginanneschi@virgilio.it che si basa su un ciclo che potrà servire anche per altre necessità, e sfrutta la funzione Dir seguita dal percorso completo che mira al file, in cui indicare le estensioni dei file che ci interessa verificare, e che restituisce, in questo esempio, solo il nome del file ultimo nella cartella scelta, senza il percorso completo. Per il Ciclo di ricerca ha usato Do Until ..Loop.

Sub Giuliano()
Dim NomeFile As String, UltimoFile As String
NomeFile = Dir("C:\Temp\*.*")
UltimoFile = NomeFile
Do Until NomeFile = ""
If NomeFile > UltimoFile Then UltimoFile = NomeFile
NomeFile = Dir
Loop
MsgBox UltimoFile
End Sub

Un grazie a Giuliano per la routine inviata, e complimenti per la sua interpretazione.

Buon lavoro.

prelevato sul sito www.ennius.altervista.org