Non vorrei lavorare con un file excel e uno word; quindi il mio suggerimento e' che in Foglio3 del file excel ti componi il testo della lettera standard, completo di intestazione, il valore totale dello scaduto che si sollecita (non il dettaglio, che sara' stampato in coda), le informazioni, le formule amichevoli, le formule minatorie, i saluti e quant'altro di circostanza.
Successivamente una macro si occupera' di accodare a questa lettera l' analitico delle fatture e mandare in stampa cartacea ognuna di queste pagine.
La macro che si potrebbe usare e' questa:
- Codice: Seleziona tutto
Sub mytest()
Dim ListC As String, myFilt As String
'
ListC = "Z" '<<<1 Una colonna LIBERA in cui sara' creato l' elenco dei nominativi
'
Sheets("Foglio1").Select
ActiveSheet.Range("$A:$A").AutoFilter Field:=1 ', Criteria1:="*"
'
'Scegli stampante:
SelPrint = Application.Dialogs(xlDialogPrinterSetup).Show
If SelPrint = False Then
MsgBox "Stampa Cancellata"
Exit Sub
End If
'
'Crea elenco partite Iva
Range(ListC & ":" & ListC).ClearContents
Range("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range(ListC & "1") _
, Unique:=True
'Crea elenco per ogni partita Iva
For I = 2 To Cells(Rows.Count, ListC).End(xlUp).Row
If Cells(I, ListC) <> "" Then
myFilt = Cells(I, ListC).Text
ActiveSheet.Range("$A:$A").AutoFilter Field:=1, Criteria1:=myFilt
Range("A1").Select
xxx = RangePublish33("A:J", myFilt)
End If
Next I
ActiveSheet.Range("$A:$A").AutoFilter Field:=1 ', Criteria1:="*"
End Sub
Function RangePublish33(ByVal PRan As String, ByVal PIva As String) As Variant
'
Dim DestSh As String, myCoda As String, myPIva As String
'
DestSh = "Lettera" '<<< Il nome del foglio in cui c' e' il testo della lettera
myCoda = "A15" '<<< La cella in foglio Lettera in cui si comincera' ad accodare
myPIva = "A1" '<<< La cella in foglio Lettera in cui si scrivera' la Partita Iva corrente
'
'Accoda righe e stampa
Sheets(DestSh).Range(myCoda).Resize(200, 20).Clear
Sheets(DestSh).Range(myPIva).Value = "'" & PIva
Application.Intersect(Columns(PRan), ActiveSheet.UsedRange).Copy _
Destination:=Sheets(DestSh).Range(myCoda)
'
Sheets(DestSh).PrintPreview '**1
'Sheets(DestSh).PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False '**2
'
Stop '!!! Vedi Testo
'
End Function
Inserisci il codice in un Modulo standard del vba, in sostituzione di quello che hai provato a usare.
Ci sono varie righe, marcate <<<, da personalizzare:
-per indicare quale colonna di Foglio1 sara' usato per creare un elenco univoco di PartiteIva; io ho impostato Z, che mi pare sia libera.
-per indicare il nome del foglio su cui hai imbastito la lettera; io ho usato "Lettera"
-l' indirizzo della cella, sul foglio Lettera, da cui si inserira' l' elenco delle fatture; io per prova ho usato A15
-l' indirizzo della cella del foglio Lettera, in cui verra' scritta il numero di parita iva in oggetto; io per prova ho usato A1. Il codice P.Iva sara' usato da formule con cui compili denominazione e nominativi di destinazione della lettera, usando la P.Iva come chiave di accesso all' anagrafica di Foglio2
Poi manda in esecuzione la Sub mytest.
La macro al momento NON MANDA in stampa le N lettere, ma si limita a fare la Print-preview; questo ti consentira' di eventualmente modificare in fase di test i margini, l' orientamento carta, eventuali altre impostazioni sul foglio di stampa.
Quando sei pronto a sfidare la sorte allora metti un "apostrofo" in testa alla riga marcata **1 (PrintPreview) e toglilo alla riga **2 (PrintOut); poi manda in esecuzione la macro mytest.
Se qualcosa ancora va storto non sara' un disastro, perche' ho inserito una istruzione Stop che fermera' la macro dopo ogni comando di stampa; quindi sei sempre in tempo a fermare la macro; per continuare invece basta premere F5. Quando poi sei confidente che e' tutto Ok allora basta mettere l' apostrofo in testa a Stop e premere F5 una ultima volta.
Ho detto di inserire nel corpo del testo della mail l' informazione del totale in arretrato; poiche' l' importo residuo e' posizionato in colonna J, dalla riga che sai tu e per una lunghezza certamente inferiore a 1000 righe ti bastera' usare una formula tipo
- Codice: Seleziona tutto
=Somma(J15:J1000)
Il file cosi' modificato dovra' essere salvato in formato ".xlsm"
Spero trovi sufficienti spunti per procedere...
Ciao