Cercare File(s) sull'Hard-Disk.      (01/06/03)

Un esercizio utile a chi voglia ricercare se esiste un file, oppure di avere l'elenco di tutti i file con una determinata estensione presenti in una cartella. Sfrutteremo il metodo Execute applicato all'oggetto FileSearch. Con Execute possiamo usare due costanti che ci forniranno l'elenco dei file trovati ordinati per nome e in ordine crescente (da A a Z). ( Execute inizia la ricerca per il file o i file specificati. Restituisce un oggetto Long; zero (0) se non viene trovato alcun file o un numero positivo se vengono trovati uno o più file). Le istruzioni si basano sul settaggio di una variabile assegnata ad Application.FileSearch, che saranno sempre le stesse, a cui seguiranno istruzioni su dove cercare il file e il nome o l'estensione da trovare; queste ultime le renderemo variabili per poter eseguire tipi diversi di ricerca.. Ma partiamo col primo esempio, la ricerca di un file in una cartella. Di questo esempio, con i parametri di ricerca fissi e impostati nelle istruzioni, non vedo una pratica utilità, serve solo a avvicinarsi ai concetti di queste ricerche;  in verde i commenti:

Sub cercaunfile()
Set fs = Application.FileSearch
'assegnazione alla variabile "fs" del metodo di ricerca
With fs
 'con la variabile "fs"
.LookIn = "C:\Documenti"  
'cerca nella cartella documenti
.Filename = "Pippo.doc" 
 ' il file col nome di Pippo.doc
If .Execute() > 0 Then 
 'se eseguendo la ricerca trovi il file (execute sarà 1, quindi 'maggiore di zero), avvisi col il seguente messaggio:
MsgBox "Il File è presente."
Else
'altrimenti avvisi con questo messaggio:
MsgBox "File non trovato."
End If 
 'fine condizione
End With
 'fine con "fs"
Set fs = Nothing 
'cancelliamo dalla memoria "fs"
End Sub

Nel secondo esempio invece esaminiamo le procedure per la ricerca di file impostando non più i parametri nel codice, ma usando tre celle del foglio di lavoro da usare come contenitori (vettori) che assegneremo a tre variabili, e saranno le tre variabili a prendere il posto del

  • nome della cartella entro cui cercare

  • nome del file (o dei files) da cercare

  • estensione dei file da cercare

In questo modo potremo cercare in qualunque cartella, un file specifico o, impostando un asterisco ( carattere jolly * al posto del nome file, così verranno cercati TUTTI i file), variare il tipo di estensione dei file, per ottenere di volta in volta tutti i tipi di documento Word (doc), o di file di Excel (xls), o di immagini (bmp, jpg, ecc.) ecc. ecc. Nell'esempio proposto uso le celle A1, B1 e C1 (ma potranno essere quelle che vorrete) per scrivere rispettivamente: il nome cartella, il nome del file, l'estensione da cercare. Esempio delle tre celle con, rispettvamente: nome della cartella - asterisco - estensione :

  A B C

1

  Documenti

*

txt

Altro accorgimento: inserendo nelle istruzioni la proprietà SearchSubFolders impostata a True , sarà possibile eseguire la ricerca in tutte le cartelle del nostro Hard-Disk, SENZA bisogno di indicare il nome di una cartella, in questo modo verranno trovati TUTTI i file con l'estensione richiesta presenti in tutte le cartelle, Esempio in cui la cella A1 viene lasciata vuota:

  A B C

1

 

*

txt

Una cosa da considerare è che non sapremo il numero di quanti files saranno presenti in una determinata cartella, e visto che una volta lanciata la routine, il metodo Execute restituisce un SOLO messaggio col totale dei files trovati e a seguire, MA SENZA INTERRUZIONE, un messaggio col nome ed il percorso dei ogni file trovato, se vogliamo interrompere il ciclo anzitempo, è doveroso prevedere una domanda condizionale se vorremo uscire (dal ciclo) oppure no. Vediamo le istruzioni, in verde i commenti:

Sub cercafiledue()

'sotto assegnazione a tre variabili del contenuto delle tre celle usate:
cartella = Range("A1").Value
nome = Range("B1").Value
este = Range("C1").Value

Set fs = Application.FileSearch
With fs

'il metodo NewSearch viene utilizzato per ripristinare i criteri di ricerca predefiniti prima 'di iniziare una nuova ricerca.
.NewSearch

'sotto cercheremo sul C:\ il nome della cartella digitato in A1
.LookIn = "C:\" & cartella & ""

'sotto: istruzione per cercare in tutte le cartelle e sottocartelle se verrà lasciata vuota la variabile "cartella" (cioè la cella A1)

.SearchSubFolders = True

'sotto usiamo i valori scritti in B1 e C1 per cercare nome file o tutti i file (*) con 'l'estensione voluta
.Filename = "" & nome & "." & este & ""
'sotto: utilizzo delle costanti di execute per ottenere la ricerca in ordine alfabetico
If .Execute(SortBy:=msoSortByFileName,  _
SortOrder:=msoSortOrderAscending) > 0 Then

'primo messaggio che avvisa quanti files sono stati trovati (con  .FoundFiles.Count)
MsgBox "Ci sono " & .FoundFiles.Count & " file(s) trovati."

'inizio del ciclo For Next per restituire per ogni file trovato, il nome e il suo percorso; 'assegnazione alla variabile I di detto nome, che cambierà ad ogni ciclo fino alla fine dei 'files trovati, e restituiti uno dopo l'altro con un messaggio
For I = 1 To .FoundFiles.Count
MsgBox .FoundFiles(I)

'sotto: inserimento in questo punto, cioè dopo che sarà riportato il nome di un file con la 'msgbox sopra, che inseriamo la domanda se vorremo uscire
dimmi = MsgBox("Vuoi uscire dalla ricerca ?", vbYesNo)

'se la risposta sarà SI allora:
If dimmi = vbYes Then

'cancelliamo fs dalla memoria
Set fs = Nothing

'usciamo dal ciclo e dalla routine
Exit For
End If
Next I

'sotto: altrimenti (else) se nessun nome o estensione richiesta verrà trovato, si avvisa con il 'messaggio:
Else
MsgBox "File(s) non trovato."
End If
End With
Set fs = Nothing
End Sub

Alcuni accorgimenti: la routine sopra l'abbiamo impostata con, tra i criteri di ricerca, la possibilità di scegliere noi l'estensione da cercare. Bene, esiste una variante usando la proprietà FileType con la costante msoFileTypeOfficeFiles , di ottenere tutti i file caratterizzati dalle seguenti estensioni: *.doc, *.xls, *.ppt, *.pps, *.obd, *.mdb, *.mpd, *.dot, *.xlt, *.pot, *.obt, *.htm o *.html. - In questo caso non useremo nelle istruzioni la proprietà FileName,  sostituendo  la riga dell'istruzione

.Filename = "" & nome & "." & este & ""

con questa:

.FileType = msoFileTypeOfficeFiles

Un altro accorgimento, nel caso si voglia cercare  i file SOLO nella cartella di sistema (quella che di default è impostata dal Sistema Operativo) che per le versioni di Windows è C:\Documenti e per Windows XP è C:\Documents and Settings\Nome Utente\Documenti, sarà sufficiente sostituire l'istruzione :

.LookIn = "C:\" & cartella & ""

con questa :

.LookIn = CurDir("C")

 

 

Buon lavoro.

prelevato sul sito http://ennius.interfree.it