017. Creare file con VBA ed inviarli via mail (avanzato)

Download PDF

Ciao a tutti,

in questo giorni ho modificato il Tool che invia allegati tramite email seguendo alcune necessità di Alessandra.
Le modifiche sono le seguenti:
1) verifica della presenza dei nomi inseriti nella base dati con quelli presenti in elenco
e segnalazione di eventuali assenze
2) selezione attraverso di un file dialog della cartella dove salvare gli allegati
3) creazione di un file “xls” o “xlsx” in base alla versione Excel utilizzata
4) scelta tra invio del file allegato in Excel o in Pdf
5) inserimento nell’allegato di un’intestazione e/o logo aziendale

Ecco il file avanzato:
Tool crea file da elenco – Excel o PDF

Per chi fosse interessato a come funziona il codice…. buona lettura!

PUNTO 1.
Verifico l’ultima riga non vuota nel foglio ‘Nomi’ (la rubrica degli indirizzi)
Sheet1.Select
Last_Row_1 = ActiveSheet.Cells.Find(“*”, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

Verifico l’ultima riga non vuota nel foglio ‘Base Dati’ (archivio dei dati da analizzare)
Sheet2.Select
Last_Row_2 = ActiveSheet.Cells.Find(“*”, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

Con un ciclo for-next prendo ciascun nome in ‘Base Dati’, lo confronto con quelli in ‘Nomi’
se non lo trovo la variabile NomeTrovato rimane uguale a zero e quindi lancio messaggio di avviso
e blocco l’esecuzione della macro

For i = 2 To Last_Row_2

NomeTrovato = 0 ‘inizializzo la variabile

For y = 2 To Last_Row_1

If Sheet2.Cells(i, 1) = Sheet1.Cells(y, 1) Then
NomeTrovato = NomeTrovato + 1
End If

Next y

If NomeTrovato = 0 Then
MsgBox “Non trovata corrispondenza dati per ‘” & Sheet2.Cells(i, 1) & “‘” & Chr(10) & Chr(10) & _
“Verifica che:” & Chr(10) & _
“- sia presente nel foglio ‘Nomi'” & Chr(10) & _
“- sia scritto nello stesso modo nel foglio ‘Nomi’ ed in quello ‘Base Dati'”, vbInformation
Sheet2.Cells(i, 1).Select
Exit Sub
End If

Next i

PUNTO 2.
Dim fDialog As Office.FileDialog
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
Dim selezione As Variant

Dim PercorsoStandard As String
‘PercorsoStandard = “C:\” ‘inserite il vostro percorso preferito e togliete la virgoletta prima di PercorsoStandard

With fDialog
.AllowMultiSelect = False
.Title = “Seleziona il percorso dove salvare i file”
‘.InitialFileName = PercorsoStandard ‘togliete la virogletta prima di .InitialFileName se avete definito il PercorsoStandard

If .Show = -1 Then
For Each selezione In .SelectedItems
cartella = selezione
Next
Else
MsgBox “Operazione annullata!”, vbInformation
Sheet2.Select
Exit Sub
End If
End With

Set fDialog = Nothing

PUNTO 3.
Con questa funzione verifico la versione Excel utilizzata
(un ringraziamento a chi tempo fa l’ha creata risolvendo un mio problema)

Public Function fVersioneExcel() As Long
With Application
fVersioneExcel = Val(Mid(.Version, 1, InStr(1, .Version, “.”) – 1))
End With

‘NOTE
‘Excel 2010 = 14
‘Excel 2007 = 12
‘Excel 2003 = 11
‘Excel 2002 = 10
‘Excel 2000 = 9
End Function

A secondo del valore restituito dalla funzione fVersioneExcel, assegno alla variabile ‘nome’ l’estensione corretta:

If fVersioneExcel < 12 Then
nomefile = nome & ” ” & Format(Date, “yyyy_mm_dd”) & “.xls”
ElseIf fVersioneExcel >= 12 Then
nomefile = nome & ” ” & Format(Date, “yyyy_mm_dd”) & “.xlsx”
End If

PUNTO 4.
La routine ‘LanciaMacro’ crea sia l’allegato Excel che quello in PDF

Il PDF è creato con questa istruzione:

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
cartella & “\” & nomefilePDF, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
‘>>>> OpenAfterPublish:=False imposto a False per non far aprire il PdF dopo la sua creazione

La scelta di che tipo di file allegare viene effettuata attraverso la selezione
degli Option Button presenti nel foglio “Base Dati’

Il codice è il seguente:

If Sheet2.OptionButton1 = True Then
Call InviaMailconPDF(nome, mail, cartella, nomefilePDF)
ElseIf Sheet2.OptionButton2 = True Then
Call InviaMailconExcel(nome, mail, cartella, nomefile)
End If

In base all’opzione selezionata, viene lanciata la macro che allega il file in Excel (InviaMailconExcel)
oppure in PDF (InviaMailconPDF)
Le due macro differiscono solo dalla variabile utilizzata per identificare il file da allegare
(nomefile o nomefilePDF)

PUNTO 5.
La macro prima copia i dati filtrati nel foglio ‘Foglio da inviare’
e poi copia il foglio ‘Foglio da inviare’ in un nuovo file (quello che sarà allegato)
In questo modo è possibile impostare il formato, l’intestazione ed il logo desiderato.

Se si desidera incollare i dati in una posizione diversa, nella routine “CopiaDati”
inserite al posto di “Range(“B6″).Select” una cella diversa (ricordate di spostare anche le righe di intestazione presenti nel foglio ‘Foglio da inviare’

Riccardo Vincenti

The following two tabs change content below.