Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Copiare file con VBA

1,905 views
Skip to first unread message

micpis

unread,
Mar 16, 2015, 7:10:09 AM3/16/15
to
Per copiare alcuni file presenti in alcune cartelle di rete in una specifica cartella archivio ho utilizzato l'istruzione FileCopy.
Nelle accennate cartelle di rete sono pero' presenti piu' file.
Volendo copiare uno specifico file (es. DATI_150310.H1009), conoscendo solo parte del nome (H1009 - indicano ore e minuti di creazione a me non noti), quale sintassi devo utilizzare?
Es: FileCopy "Z:\dati\" & "DATI_150310*", "C:\Desktop\Archivio\DATI_150310.txt"
grazie

radica...@gmail.com

unread,
Mar 16, 2015, 8:57:26 AM3/16/15
to
> FileCopy "Z:\dati\" & "DATI_150310*", _
"C:\Desktop\Archivio\DATI_150310.txt"
> grazie

' Purtroppo non si puo' fare con i caratteri jolly, a quanto
' mi risulta perlomeno.

' Devi fare un ciclo sulla directory usando la funzione DIR :

Dim Percorso_IN as string
Dim NomeFile_IN as string

Dim NomeFile_OUT as string

Percorso_IN = "c:\" ' Imposta il percorso.
Nome_File_IN = Dir(Percorso_IN, vbDirectory) ' Recupera la prima voce.

Do While Nome_File_IN <> "" ' Inizia il ciclo.

if devo_copiare_il_file(Nome_File_IN) then
filecopy Nome_File_IN, Nome_Out(Nome_File_IN)
endif

Nome_File_Out = Dir ' Legge la voce successiva.
Loop

' Dove :
' 1)
' devo_copiare_il_file( ) e' una funzione scritta da te che decide
' se il file e' quello giusto. Restituisce True o False
' 2)
' Nome_Out( ) e' una funzione scritta da te che restituisce il
' nome del file output (completo) in funzione del nome del file
' input

Fammi sapere.

radica...@gmail.com

unread,
Mar 16, 2015, 9:04:28 AM3/16/15
to
Il giorno lunedì 16 marzo 2015 13:57:26 UTC+1, radica...@gmail.com ha scritto:
> > Il giorno lunedì 16 marzo 2015 12:10:09 UTC+1, micpis ha scritto:
> > Per copiare alcuni file presenti in alcune cartelle di rete
> > in una specifica cartella archivio ho utilizzato l'istruzione
> > FileCopy.
> > Nelle accennate cartelle di rete sono pero' presenti piu' file.
> > Volendo copiare uno specifico file (es. DATI_150310.H1009),
> > conoscendo solo parte del nome (H1009 - indicano ore e minuti di
> > creazione a me non noti), quale sintassi devo utilizzare ?
> > Es:
> > FileCopy "Z:\dati\" & "DATI_150310*", _
> "C:\Desktop\Archivio\DATI_150310.txt"
> > grazie
>
> ' Purtroppo non si puo' fare con i caratteri jolly, a quanto
> ' mi risulta perlomeno.
>
> ' Devi fare un ciclo sulla directory usando la funzione DIR :

' Scusa, ho sbagliato a scrivere, ecco la versione corretta :

Dim Percorso_IN as string
Dim NomeFile_IN as string

Percorso_IN = "c:\" ' Imposta il percorso.
Nome_File_IN = Dir(Percorso_IN, vbDirectory) ' Recupera la prima voce.

Do While Nome_File_IN <> "" ' Inizia il ciclo.

if devo_copiare_il_file(Nome_File_IN) then
filecopy Nome_File_IN, Nome_Out(Nome_File_IN)
endif

Nome_File_IN = Dir ' Legge la voce successiva.
Loop

' il resto e' identico (ossia le note)

radica...@gmail.com

unread,
Mar 16, 2015, 9:09:53 AM3/16/15
to
Il giorno lunedì 16 marzo 2015 14:04:28 UTC+1, radica...@gmail.com ha scritto:

c'e' un altro errore, perdonami.

Non "filecopy Nome_File_IN, Nome_Out(Nome_File_IN)"
perche' la dir non restituisce il nome completo.

Devi fare
filecopy "c:\" & Nome_File_IN, Nome_Out(Nome_File_IN)

micpis

unread,
Mar 16, 2015, 10:27:10 AM3/16/15
to
Il giorno lunedì 16 marzo 2015 12:10:09 UTC+1, micpis ha scritto:
Perfetto radica, funziona alla grande . grazie

radica...@gmail.com

unread,
Mar 16, 2015, 10:28:10 AM3/16/15
to
Sempre pronto (fin dove arrivo) xke' : chi se ritira dalla lotta
e' un gran fijo de na mignotta :D

Maurizio Borrelli

unread,
Mar 16, 2015, 11:28:51 AM3/16/15
to
Il giorno lunedì 16 marzo 2015 12:10:09 UTC+1, micpis ha scritto:
Ciao micpis, ciao radica...

Un altro modo:

Public Sub Test()
Const cstrSrcPath = "D:\Percorso\"
Const cstrDstPath = "D:\Percorso\Pippo\"
Const cstrMskFile = "DATI_150310.H????"
Const cstrDstFile = "DATI_150310.txt"

Dim strDir As String
Dim strSrcFile As String
Dim lngCount As Long

strDir = Dir(cstrSrcPath & cstrMskFile, vbNormal)
If Len(strDir) Then
strSrcFile = strDir
Do While Len(strDir)
lngCount = lngCount + 1
strDir = Dir
Loop
If lngCount > 1 Then
MsgBox "Esiste più di un file con maschera " & cstrMskFile
Exit Sub
End If
Else
MsgBox "Il file non esiste."
Exit Sub
End If
FileCopy cstrSrcPath & strSrcFile, cstrDstPath & cstrDstFile

End Sub

--
Ciao!
Maurizio

radica...@gmail.com

unread,
Mar 17, 2015, 7:09:14 AM3/17/15
to
Il giorno lunedì 16 marzo 2015 16:28:51 UTC+1, Maurizio Borrelli ha scritto:

> Ciao micpis, ciao radica...
> Un altro modo:

Vediamo un po' ...

> strDir = Dir(cstrSrcPath & cstrMskFile, vbNormal)

Ah, quindi la funzione dir accetta anche i caratteri jolly ?
Non lo sapevo. Buono !

Com' e' l' output ? Ossia mette tutti i nomi uno attaccato all'
altro tipo :
mio_file.txttuo_file.txt o cosa ? C' ha un separatore ?

E prende pure "*" ? O solo i punti interrogativi ?

Fammi sapere

Maurizio Borrelli

unread,
Mar 17, 2015, 7:58:10 AM3/17/15
to
Ciao radica...,

leggi qui:
https://msdn.microsoft.com/en-us/library/office/gg278779%28v=office.15%29.aspx?f=255&MSPPError=-2147217396

in particolare il paragrafo Remarks che, tradotto alla buona, dice:

"In Microsoft Windows, Dir supporta l'uso dei metacaratteri, (*) per caratteri multipli e (?) per un singolo carattere."

Funziona cosi' sin dai tempi antichi del DOS.

L'output e' sempre quello, un file alla volta, in un ciclo come quello che ho postato.

--
Ciao!
Maurizio

radica...@gmail.com

unread,
Mar 17, 2015, 8:45:54 AM3/17/15
to
Ah ok tutto chiaro allora. Grazie.

0 new messages