Si tratta in sostanza di una “piccola” evoluzione di due precedenti tutorial il cui scopo è quello di consentire di tenere traccia di quali record sono stati elaborati dalla stampa unione in passato.
Questo utile “stratagemma” consente dunque di inserire nuovi record alla base di dati senza dover cancellare i precedenti.
Ecco il codice da me utilizzato nellesempio:
Sub UpdateSent(TheRow As Long)
'creo la connessione al DB Access
Dim conn As ADODB.Connection
Dim NumOfRec As Integer
Dim strPath As String
strPath = ActiveDocument.Path & "\stampaunione.mdb"
Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath
conn.Execute "UPDATE Aziende_Ricevuta SET sent = 1" & _
" WHERE Id = " & TheRow, NumOfRec, adExecuteNoRecords
conn.Close
Set conn = Nothing
End Sub
E, per quanto riguarda la macro vera e propria:
Sub Stampa_PDF() Dim fd As FileDialog 'Crea un oggetto FileDialog per scegliere la cartella in cui salvare i file Set fd = Application.FileDialog(msoFileDialogFolderPicker) With fd 'Usa il metodo Show per mostrare la finestra di dialogo e restituire l'azione dell'utente If .Show = -1 Then For Each vrtSelectedItem In .SelectedItems 'vrtSelectedItem è una stringa che contiene l'indirizzo di ogni elemento selezionato. 'E' possibile usare qualsiasi funzione di I/O sui file utilizzando questo indirizzo. SelectedPath = vrtSelectedItem Next vrtSelectedItem Else MsgBox ("Nessuna cartella è stata selezionata.") Exit Sub End If End With 'Imposta la variabile oggetto a Nothing Set fd = Nothing Application.ScreenUpdating = False maindoc = ActiveDocument.Name ChangeFileOpenDirectory SelectedPath ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord 'Quanti record ci sono? hmrecords = ActiveDocument.MailMerge.DataSource.ActiveRecord 'posizionati sul primo record ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord For i = 1 To hmrecords + 1 With ActiveDocument.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True With .DataSource .FirstRecord = i .LastRecord = i .ActiveRecord = i 'Utilizza alcuni campi del file sorgente per impostare il nome del file pdf 'IMPORTANTE: tali campi vanno personalizzati in base a quelli effettivamente 'presenti nella sorgente dati docName = .DataFields("anno").Value & "_" & .DataFields("Modulo").Value & "_" & .DataFields("Broker").Value & "_" & .DataFields("Cognome").Value & "_" & .DataFields("Numero").Value & ".pdf" TheRow = .DataFields("ID").Value sent = .DataFields("sent").Value 'se il record è flaggato salta la stampa If sent = 1 Then GoTo 100 End With .Execute Pause:=False Application.ScreenUpdating = False End With 'crea il PDF ActiveDocument.ExportAsFixedFormat OutputFileName:=docName, _ ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _ wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _ Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _ CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _ BitmapMissingFonts:=True, UseISO19005_1:=False ActiveWindow.Close SaveChanges:=False 'vai alla sub che flagga a "vero" il record appena processato UpdateSent (TheRow) 100 'se la riga non va stampata salta qui Next i Application.ScreenUpdating = True End Sub
il tutorial attuale (3): [mx_youtuber type="video" id="5n5NuF9LCN0"]
I due tutorial precedenti. qui il primo (1): [mx_youtuber type="video" id="izlQ9osMfz4"]
Il secondo (2): [mx_youtuber type="video" id="uYugLf4vv7U"]