› Sviluppare funzionalita su Microsoft Office con VBA › allegare più file con una certa stringa ad una mail con vba
-
AutoreArticoli
-
Buongiorno
avrei bisogno del Vostro aiuto per un esigenza ho diverse versioni per inserire allegati ad una mail ma avrei piacere di fare meno "ginnastica" in questo caso.
in una cartella prova ho molti file dello spesometro da inviare e nella cartella i file hanno un'estenzione finale che può essere F01 oppure F02
non so però nel file allegato come fare a far fare un ciclo che mi estragga i nomi dei file e li alleghi tutti insieme
faccio un ulteriore esempio
201801.f01
201802.f01
201803.f01
201801.f02
201802.f02
avrei la necessità che tutti i file f01 fossero allegati alla stessa mail
spero di essere stato chiaro nella richiesta aiuto
grazie
Per favore potete togliere il file allegato dovei sostituirlo ma non so come fare
grazie
Ho rimosso l'allegato come richiesto 🙂
mb wrote:avrei la necessità che tutti i file f01 fossero allegati alla stessa mail
Crei un oggetto FileSystemObject che punti ai Files di una certa directory, con un ciclo For ... Next esamini i file contenuti nella cartella e consideri solo quelli la cui estensione è quella desiderata. Puoi anche costruire una piccola funzione che estrapoli l'estensione da un nome di file, così poi il confronto è banale.
Quando sei di fronte a un file con l'estensione voluta, con un piccolo test If ... Then, ci fai quello che vuoi.
Sono davvero poche righe di codice, prova a cimentarti nell'impresa e torna in caso di difficoltà 🙂
Grazie vecchio frac
con questo trovo il 1 file
mFolder = "e:\prova\"
strFile = Dir(mFolder & "*.txt*")
If strFile <> "" And _
Left(strFile, 5) = "*.f01" Thenend if
ma poi quando spedisco mi allega solo il primo
.Attachments.Add ("e:\prova\" & strFile & "")
può essere generata la mail con i 6 allegati con estensione F01 direttamente dalla sub o devo per forza utilizzare delle celle d'appoggio ??
e poi se usassi le celle d'appoggio rimane sempre il mio "problema" come faccio nella sub ad inserire tutti i file nella riga
.Attachments.Add ("e:\prova\" & strFile & "")
potrei scrivere
.Attachments.Add ("e:\prova\" & "*.f01* "")
grazie
Ciao
Vecchio Frac (che saluto) ha scritto
Crei un oggetto FileSystemObject che punti ai Files di una certa directory, con un ciclo For ... Next esamini i file contenuti nella cartella e consideri solo quelli la cui estensione è quella desiderata.
.....
Quando sei di fronte a un file con l'estensione voluta, con un piccolo test If ... Then, ci fai quello che vuoi.
Ciao,
Mario
Va bene anche Dir (l'oggetto FileSystem è più flessibile) ma allora devi imbastire un do...loop altrimenti ti trova solo il primo file (forse).
Ho qualche (serio) dubbio sul fatto che l'istruzione
Left(strFile, 5) = "*.f01"
faccia quel che vorresti...Confermo che non devi necessariamente utilizzare celle d'appoggio.
Infine non credo che puoi usare le wildcard con Attachments.Add.
Mettiti con pazienza a ragionare sullo spunto che ti ho dato e che Mario ha ribadito, l'oggetto FileSystem si crea con CreateObject come hai fatto con l'oggetto Outlook, al suo interno ci sono metodi e proprietà che fanno al caso tuo.
Comincia a stendere qualche riga in questa direzione, poi commentiamo insieme.
help
questo è quanto ho trovato su internet
però non sono riuscito a capire dove indico la directory dove sono i file con estensione F01 da spostare nella directory c:\testdirectory ??
i miei file sono nella directory e:\origine1
------------------------------------------------------------------------------------------------
Per copiare file con un criterio specifico in una directory
Usare il metodo GetFiles per restituire l'elenco dei file. In questo esempio vengono restituiti tutti i file RTF nella directory specificata.VBCopia
For Each foundFile As String In My.Computer.FileSystem.GetFiles(
My.Computer.FileSystem.SpecialDirectories.MyDocuments,
Microsoft.VisualBasic.FileIO.SearchOption.SearchTopLevelOnly, "*.rtf")Usare il metodo CopyFile per copiare i file. In questo esempio i file vengono copiati nella directory denominata testdirectory.
VBCopia
My.Computer.FileSystem.CopyFile(foundFile, "C:\testdirectory\" & My.Computer.FileSystem.GetName(foundFile))Chiudere l'istruzione For con un'istruzione Next .
VBCopia
Nextecc....
--------------------------------------------------------------------------------------
grazie
risolto il primo problema
Sub CopiaFile()
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
fs.copyfile "e:\origine1\*.F01", "e:\z\", True
Set fs = Nothing
End Subadesso i file con estensione F01 sono nella cartella Z del disco E del mio computer
adesso come faccio a far eseguire una mail che spedisca tutti gli allegati della cartella Z
mb wrote:For Each foundFile As String In My.Computer.FileSystem.GetFiles
Non è esattamente VBA 🙂
Comunque il passaggio alla directory di appoggio E:\Z non è necessario.
In ogni caso adesso nella routine che crea il messaggio Outlook devi implementare un altro ciclo For ... Next che prenda i file della cartella E:\Z e li appiccichi con l'istruzione che conosci Attachments.Add all'oggetto MailItem che stai per spedire.
Ok, poi non ditemi che sono cattivo 🙂
Propongo una tra le soluzioni.
Nota l'uso di Option Explicit in testa al modulo e l'assegnazione di eMail di un oggetto MailItem che, non essendo referenziato in Excel, va esplicitato con il suo valore (0) e non con il suo nome di costante Outlook.
Option Explicit Sub InviaMailf01() Dim fso As Object, ffiles As Object, ffile As Object Dim eApp As Object Dim eMail As Object Set eApp = CreateObject("Outlook.Application") Set eMail = Outlook.CreateItem(0) 'olMailItem Set fso = CreateObject("Scripting.FileSystemObject") Set ffiles = fso.getfolder("e:\prova").Files For Each ffile In ffiles If get_ext(ffile.Name) Like "f01" Then eMail.Attachments.Add ffile Next With eMail .To = "mb@xxx.com" '<--- INSERISCI L'INDIRIZZO. .Subject = "riepilogo file" '<--- INSERISCI L'OGGETTO DELLA MAIL. .Body = "" '<--- INSERISCI IL TESTO. .Display End With Set ffile = Nothing Set ffiles = Nothing Set fso = Nothing End Sub Public Function get_ext(f As String) As String 'restituisce l'estensione di un nome di file passato come stringa If f = "" Then get_ext = "" Else get_ext = Split(f, ".")(UBound(Split(f, "."))) End If End Function
grazie vecchio frac non sei come tu ti definisci, anzi sei molto disponibile
lunedì provo in ufficio con i file effettivi, perchè con i file che ho simulato a casa non ha funzionato
nella cartella ho inserito dei file di tipo TXT ma con i seguenti nomi
pippo.f01
pluto.f01
ma non sono stati inseriti nella mail come allegati
proverò
grazie per la tua pazienza
buona notte
Io ho Outlook solo in ufficio quindi anch'io dovrò testare meglio il codice sul campo.
A occhio sembra tutto corretto, ma bisognerebbe farlo girare.
Buongiorno
sicuramente sono io che sbaglio, ma ho provato anche in ufficio ma non allega nessun file
ti confermo che i file terminano con .f01 e sono 6 uno per ogni mese quindi
201801.f01
201802.f01
201803,f01
201804.f01
ecc
Infatti ho fatto una serie di errori 🙂
Ecco le correzioni.
Option Explicit Sub InviaMailf01() Dim fso As Object, ffiles As Object, ffile As Object Dim eApp As Object Dim eMail As Object Set eApp = CreateObject("Outlook.Application") Set eMail = eApp.CreateItem(0) 'olMailItem Set fso = CreateObject("Scripting.FileSystemObject") Set ffiles = fso.getfolder("j:\test").Files For Each ffile In ffiles If get_ext(ffile.Name) Like "f01" Then eMail.Attachments.Add CStr(ffile) Next With eMail .To = "mb@xxx.com" '<--- INSERISCI L'INDIRIZZO. .Subject = "riepilogo file" '<--- INSERISCI L'OGGETTO DELLA MAIL. .Body = "" '<--- INSERISCI IL TESTO. .Display End With Set ffile = Nothing Set ffiles = Nothing Set fso = Nothing End Sub Public Function get_ext(f As String) As String 'restituisce l'estensione di un nome di file passato come stringa If f = "" Then get_ext = "" Else get_ext = Split(f, ".")(UBound(Split(f, "."))) End If End Function
Chiaramente invece di
Set ffiles = fso.getfolder("j:\test").Files
devi specificare la cartella da cui prelevare i singoli file.
-
AutoreArticoli