Tutorial Gestione lettere di sollecito in Word

Stato
Chiusa ad ulteriori risposte.

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
2.233
83
Italy
2013 2019
166
GESTIONE LETTERE DI SOLLECITO IN WORD
VARIANTE 4



Questo tutorial è un ulteriore passo avanti rispetto al precedente:

Ho pensato di creare questo, molto più avanzato, vedendo che il precedente ha ottenuto un discreto successo di visualizzazioni.

Rispetto al progetto precedente, qui vedremo l'aggiunta di altre caratteristiche:

1. Gestire automaticamente i solleciti in modo progressivo, ovvero:
- se non si ancora ha inviato alcun sollecito verrà inviato il primo
- se si è già inviato il primo verrà inviato il secondo
- se si è già inviato il secondo verrà inviato il terzo
- se si è già inviato il terzo... non si invia più niente!

2. Inviare il file del sollecito via email:
- verrà creato un messaggio di posta elettronica
- verrà inserito il file del sollecito come allegato (PDF o DOCX che sia)
- si potrà personalizzare sia l'oggetto che il corpo del messaggio
- si potrà usare indifferentemente Outlook oppure Thunderbird
- si potrà personalizzare la sequenza di caratteri per il ritorno a capo; default: [CR]

3. Registrare in un file di LOG diverse informazioni:
- si potrà scegliere sia il nome del file che il percorso
- se il file non esiste, verrà creato automaticamente

4. Rendere persistenti le impostazioni del progetto
Ciò evita di dover re-impostare tutti i parametri ogni volta.
- viene utilizzato una classe apposita per salvare/leggere le impostazioni da un classico file INI, salvato nella cartella del progetto
- le impostazioni vengono caricate all'avvio e salvate automaticamente alla chiusura del progetto.

5. Scegliere il tipo di sequenza di delimitazione
è possibile scegliere tra tre tipi di delimitazione:
- << >> (usato di default nelle lettere di sollecito word)
- ## ##
- %% %% (usato nella lettera word del tutorial precedente)

6. Usa immagini della suite Office (images MSO)
- servono a 'decorare' l'aspetto del form


Ora svisceriamo i punti più importanti, accennati sopra, per capire meglio come funziona il 'programma'.

1. Gestire automaticamente i solleciti in modo progressivo
Prima di tutto, tramite gli appositi tre pulsanti, occorre indicare quali sono i tre tipi di lettere di sollecito da usare, così il programma sarà in

grado di utilizzare la lettera adeguata al numero di sollecito.

Nel database Excel sono presenti due colonne: Sollecito e DataInvio che servono a tener memoria rispettivamente del numero e data dell'ultimo sollecito inviato.
Nel caso non si sia mai inviato un sollecito, queste saranno inizialmente vuote, per cui verrà inviato il Primo sollecito, e tali colonne verranno poi valorizzate, così alla prossima esecuzione il programma potrà decidere autonomamente quale lettera di sollecito dovrà utilizzare.
Nel database Excel, in allegato, ho volutamente inserito valori differenti, così che possiate verificare quanto sopra.

Come abbiamo già visto nel precedente pogetto, anche qui il programma sostituirà i segnaposto indicati nella lettera con i dati reali contenuti nel database Excel.
Come abbiamo visto sopra, al putno (5), tra le Opzioni c'è anche la possibilità di scegliere quali caratteri delimitano i segnaposto.
In allegato troverete 3 versioni dei tre solleciti, e se avete delle vostre lettere potete predisporle per farei vostri test e vedere il risultato.

Con qualche piccola modifica al codice, potete adattare il database alle vostre lettere, dato che la lettura dei campi è dinamica.
In pratica, la sola cosa che conta è che ad ogni segnaposto presente nella lettera corrisponda una colonna del database.

Ad esempio, se nella lettera voglio indicare la data di nascita è sufficente inserire <<DataDiNascita>> nel punto della lettera in Word in cui dovrà apparire, ed aggiungere la colonna DataDiNascita nel foglio Excel ed inserire il dato in ogni riga.
Non importa in quale colonna lo abbiate messo, purché sia presente.
Se manca la colonna, non succede nulla di grave, solamente il segnaposto <<DataDiNascita>> resterà così com'è.
Se c'è la colonna ma non c'è il segnaposto <<DataDiNascita>> non succede nulla; ciò significa che nel database possiamo avere quante colonne vogliamo

ma verranno utilizzato solo quelle indicate nei segnaposto. Comodo vero?

La sola accortezza è che si dovranno adeguare le 'costanti di comodo' dichiarate all'inzio del modulo frmMain che indicano il numero della colonna

all'interno del database. Ad Esempio, le colonne per Sollecito e DataInvio sono impostate come 16ª e 17ª:
Const colSollecito = 16
Const colDataInvio = 17

Mentre quelle dei Destinatari come 18ª e 19ª:
Const colDestinatari = 18
Const colDestinatariCC = 19


Se inseriamo ulteriori colonne PRIMA di queste, dovremo adeguarle con il numero corretto.
Se inseriamo ulteriori colonne DOPO di queste, dovremmo aggiungere ulteriori costanti.
Ad esempio, aggiungendo per ultima la colonna DataDiNascita, dichiareremo:
Const colDataDiNascita = 20

Queste costanti, come vedremo più avanti nella composizione dell'email, sono utilissime perché ci permettono di individuare con semplicità la colonna

da cui vogliamo prelevare i dati.


2. Inviare il file del sollecito via email
La maggior parte delle funzionalità relative all'invio email è stata implementata in un modulo a parte: modEmail.
Per l'invio dell'email è necessario indicare almeno i Destinatari e, opzionalmente, i DestinatariCC (in copia).
Nel database Excel sono incluse tali colonne in cui devono essere inseriti gli indirizzi email.
Possiamo indicare in ogni colonna uno o più indirizzi, separati da una virgola, esempio: pippo@sito.it,pluto@sito.it.
Chiaramente, se non è presente almeno l'indirizzo del Destinatario, l'email non verrà generata.

Dato che per l'invio ho previsto la possibilità dil'utilizzare sia Outlook che Thunderbird, era necessario predisporre due routine separate:
InviaEmailOutlook
InviaEmailThunderbird

in quanto il codice è totalmente diverso in entrambi icasi.

Una nota particolare per Thunderbird: dato che tutti i parametri devono essere racchiusi tra apici singoli, ho previsto un'apposita funzione Apici() che si preoccupa di aggiungerli automaticamente. Esempio:
sTo = "to=" & Apici(.teDestinatari)

Notare che in questa occasione, anziché creare ogni singolo parametro da passare a tali routine, ho preferito utilizzare un 'struttura' (TYPE) :
Visual Basic:
Public Type TYPE_EMAIL
    teDestinatari As String
    teDestinatariCC As String
    teOggetto As String
    teCorpo As String
    teAllegato As String
End Type
Prima di tutto perché ciò semplifica il passaggio dei dati, secondo perché in caso di necessità diventa più semplice aggiungere ulteriori parametri.
Se, ad esempio, volessimo aggiungere un Destinatario nascosto (BCC) è sufficiente inserirlo all'interno della struttura:
Visual Basic:
Public Type TYPE_EMAIL
    teDestinatari As String
    teDestinatariCC As String
    teOggetto As String
    teCorpo As String
    teAllegato As String
    teBCC As String ' <<< nuovo parametro
End Type
Automaticamente diviene disponibile e, soprattutto, senza dover modificare la 'firma' di entrambe le routine.
N.B. Il prefisso 'te' dei campi della struttura è arbitrario, possiamo usare qualsiasi carattere, ma è sempre meglio sceglierne uno per non rischiare di usare variabili già dichiarate in altre parti del codice. Lo standard, in questi casi, prevede l'uso delle iniziali della struttura: infatti te è da intendersi come le iniziali di TYPE_EMAIL.

La comodità di usare una 'struttura' (TYPE) è che l'Intellisense di VBA ci aiuterà a gestirla come un qualsiasi altro oggetto in cui ogni campo della struttura diventa una proprietà.
Ad esempio una volta dichiarata una variabile oggetto del tipo della nostra struttura:
Dim TEmail As TYPE_EMAIL
quando digitiamo: TMail. oppure usiamo il With TEmail / End With nel momento in cui digitiamo il punto (.) verranno elencati tutti i campi della struttura.

Esattamente come avviene quando digitiamo il nome di un controllo, es. TextBox1. e ci vendono elencate le proprietà.

Ovviamente, dato che il tipo di file da generare è dinamico, scelto in base all'opzione Salva in PDF, il tipo di file allegato all'email sarà uguale.

Come si può osservare nell'immagine (scheda EMail), è possibile personalizzare sia l'Oggetto che il Corpo del messaggio.
Inoltre è possibile utilizzare una sequenza di caratteri per gli 'a capo' che per default è [CR].

Fare attenzione alla scelta del mailer perché il programma verificherà che il mailer selezionato sia installato nel computer (per quanto possibile).

Infine è importante notare che l'email non verrà inviata direttamente, a causa delle policy applicate orami da tempo contro lo SPAM, che prevedono che sia l'utente a confermare l'invio dell'email per cui se si usa Outlook verranno creati i messaggi da inviare, tanti quanti sono i Destinatari, mentre se si usa Thunderbird i messaggi verranno posizionati nella cartella Posta in uscita.


3. Registrare in un file di LOG diverse informazioni
Questa caratteristica (anch'essa opzionale) permette di inserire in un file di LOG i dati più importanti relativi ai solleciti inviati, così da tenere uno storico di ciò che si è spedito o generato.

4. Rendere persistenti le impostazioni del progetto
Probabilmente questa funzionalità è stata poche volte implementata in un progetto VBA, ciò non di meno può risultare molto comoda quando le impostazioni sono tante (come in questo caso) e sarebbe alquanto noioso dovrele reimpostare tutte ogni volta che si apre l'userform.
Qui vewngono usate le funzionalità indispensabili: scrivere e leggere il che, detto per inciso, sono le più 'gettonate', ma non sono le uniche disponibili.
Eventualmente si potrà approfondire il discorso sulla classe CIniFile in un successivo tutorial.

Le altre funzionalità sono 'autoesplicative' quindi credo di non dover aggiungere altro.

CONCLUSIONE
In questo progetto abbiamo visto come si può arrivare a creare una 'mini' applicazione stand-alone per la gestione dei solleciti.
Chiaramente i solleciti sono in questo caso semplicemente una 'scusa' per addentrarci su nuovi aspetti implementativi di un progetto VBA che, tengo a precisarlo, può mostrare una potenza e flessibilità davvero notevoli, da permetterci di implementare funzionalità impensabili che se fatte manualmente, richiederebbero davvero molto tempo.

Sperando di aver fatto cosa gradita, auguro buona programmazione a tutti.
Sicuramente avrò dimenticato qualcosa, nel caso raccomando di non accodarsi a questo tutorial, ma di aprire una discussione nella sezione Excel VBA e Macro.
 

Allegati

Stato
Chiusa ad ulteriori risposte.

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!