snelle manier formulieren naar pdf's schrijven

Status
Niet open voor verdere reacties.

mie1981

Gebruiker
Lid geworden
6 jan 2007
Berichten
12
Goedemorgen

ik heb een vraagje

ik heb in access een tabel met ongeveer 4000adressen en een unieke id.
Ik heb vervolgens een formulier waar ik mijn adressen aan koppel.

mijn vraag is nu, hoe kan ik op een snelle manier de 4000 brieven naar pdf schrijven (ieder adres in 1 pdf) en naam van pdf moet de unieke id zijn.

alvast bedankt voor jullie hulp

mvg
 
Ik zou zeggen: maak een rapport, en print dat naar PDF. Je kunt dan met een lus een tijdelijk rapport maken van één record, en dat opslaan onder de nieuwe naam, bijvoorbeeld met DoCmd.OutputTo. Of gebruik je een Word samenvoegdocument? Je hebt het tenslotte over een brief?
 
Hallo idd tis een brief in word. Klant wilt per adres een pdf van brief met naw-gegevens en pdfnaam moet unieke id zijn (is ook aanwezig in bestand)
 
Ik heb wel een procedure voor je die e.e.a. kan regelen. Het enige waar je zelf voor moet zorgen is het opslaan naar PDF vanuit Word, want dat doet hij niet. (al gaat daar de vraag over ;) )
Het opslaan als PDF is zo'n beetje het simpelste onderdeel van je probleem, dus daarom eerst maar het moeilijke stuk. Dat ziet er zo uit:
Code:
Private Function BedrijfMail()
Dim aWord As Object, oWord As Word.Document
Dim rst As ADODB.Recordset
Dim strVP As Variant

strPad = CurrentProject.Path & "\Dagelijks\"            'Pad voor uitleveringen
strMergePad = CurrentProject.Path & "\Merge\"           'Document voor emailmerge
strMergeDoc = strMergePad & "Merge.doc"

strSQL = "Select * From tUitleverMergeBedrijf"
Set rst = New Recordset
rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

strVP = rst.GetRows

If rst.RecordCount > 0 Then
    'Nu in een loopje elk record apart exporteren naar Excel, en samenvoegen met het Word document
    strFileTxT = strMergePad & "qUitleverMerge.xls"
    For i = LBound(strVP) To UBound(strVP)
        'Checken of bestand al bestaat. Doen we door te kijken of de bestandsnaam in de uitlevermap is te vinden.
        strUitgeleverd = Trim(strVP(9, i)) & " - Leads " & date & ".doc"
        temp = Dir(strPad & strUitgeleverd)

        'Als het bestand nog niet bestaat, uitleveren!
        If strUitgeleverd <> temp Then
            strSQL = "SELECT * FROM tUitlevermergeBedrijf WHERE [ID] =" & strVP(5, i)
            CurrentDb.QueryDefs.Delete ("qUitlevermerge")
            Set temp = CurrentDb.CreateQueryDef("qUitleverMerge", strSQL)
            
            'Verwijder het oude bestand, omdat de procedure anders crasht.
            On Error Resume Next
            Kill strFileTxT
            Err.Clear
            On Error GoTo 0
            DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "qUitleverMerge", strMergePad & "qUitleverMerge.xls"
            GoSub TijdLoop
            
            'Voor elk record wordt de Word applicatie apart opgestart en afgesloten; dit voorkomt overtollige Word-sessies
            strInfo_A = strInfo_A & Trim(strVP(9, i)) & " - Leads " & date & ".doc" & vbLf
            Set aWord = CreateObject("Word.Application")
            Set oWord = aWord.Documents.Open(strMergeDoc)
            On Error Resume Next
            With oWord.MailMerge
                .Destination = wdSendToNewDocument
                .Execute
            End With
            GoSub TijdLoop
            
            'Bestand opslaan
            strUitgeleverd = strPad & Trim(strVPNaam(i)) & " - Leads " & date & ".doc"
            oWord.Application.ActiveDocument.SaveAs (strPad & strUitgeleverd)
            oWord.Application.ActiveDocument.Close
            oWord.Close (wdDoNotSaveChanges)
            Set oWord = Nothing
            aWord.Application.Quit
        End If
        Next
    End If

'Recordset en applicaties netjes afsluiten
rst.Close
Set rst = Nothing
Set db = Nothing
Set aWord = Nothing

'Echo na afloop altijd op True zetten, omdat je anders een leeg scherm overhoudt
DoCmd.Echo True

'En voor de zekerheid nog een keertje alles afsluiten...
On Error Resume Next
aWord.Quit
Set aWord = Nothing

Exit Function
'==========================================================================
'Hieronder staan de subroutines die boven in de code worden aangesproken.

'--------------------------------------------------------------------------
TijdLoop:
    'Om te voorkomen dat de programmatuur zich verslikt, een kleine pauze van 1 seconde...
    Start = 0
    Start = Timer    ' Aanvangstijd instellen.
    Do While Timer < Start + 1
        DoEvents    ' Overdragen aan andere processen.
    Loop
Return

'--------------------------------------------------------------------------
Stoppen:
    On Error Resume Next
    Set rst = Nothing
    Set oWord = Nothing
    Set aWord = Nothing
    DoCmd.Echo True

End Function
Er gebeuren nogal wat dingen, maar dat komt omdat je a) aparte namen wilt voor de bestanden en b) met Word wilt werken. Wat doet de code?
1. Een tabel openen en in een matrix variabele zetten. Vervolgens met een loop door de matrix wandelen en documenten aanmaken.
Code:
       strVP = rst.GetRows
2. Een query maken met de selectie van één klant en die exporteren naar een Excel bestand.
Code:
       strSQL = "SELECT * FROM tUitlevermergeBedrijf WHERE [ID] =" & strVP(5, i)
       Set temp = CurrentDb.CreateQueryDef("qUitleverMerge", strSQL)
       DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "qUitleverMerge", strMergePad & "qUitleverMerge.xls"
3. In Word een samenvoeg document openen dat is gekoppeld aan het Excel bestand.
Code:
       Set aWord = CreateObject("Word.Application")
       Set oWord = aWord.Documents.Open(strMergeDoc)
       On Error Resume Next
       With oWord.MailMerge
                .Destination = wdSendToNewDocument
                .Execute
       End With
4. Het samengevoegde Word document opslaan onder de nieuwe naam.
Code:
       strUitgeleverd = strPad & Trim(strVPNaam(i)) & " - Leads " & date & ".doc"
       oWord.Application.ActiveDocument.SaveAs (strPad & strUitgeleverd)
       oWord.Application.ActiveDocument.Close
       oWord.Close (wdDoNotSaveChanges)
Dat laatste stuk zou je dus moeten aanpassen, want je wilt opslaan als pdf. Maar dat zal niet zo moeilijk zijn, want in Word 2007 en hoger zit dat ingebakken.
 
Laatst bewerkt:
amai octafish

heel fel bedankt!!!!
ik zal mij morgen op werk eens gaan amuseren met dit en zal je zeker op de hoogte houden :)

thx!!!
 
Sorry heb geen tijd gehad om dit te testen....zal proberen dit int weekend te doen :)
 
Het is een hoop code; ik zou het weekend er niet mee om zeep helpen :)
Ik ga dit onderwerp uitwerken in het komende hoofdstuk voor de Access cursus, dus hou de komende nieuwsbrief ook in de gaten...
 
hier ben ik dan :)

misschien een heel domme vraag van me, maar ik moet dit code toch in access gebruiken (formulier met knop en dit code plakken bij gebeurtenis - klikken)?
 
tssss tis gelukt hoor :)

enkel bij het uitvoeren nu, krijg ik na een tijdje foutmelding:'subscript valt buiten bereik"
en volgend code wordt geel:
strInfo_A = strInfo_A & Trim(strVP(9, i)) & " - Leads " & Date & ".doc" & vbLf
 
Zijspoortje... (toch hier geplaatst omdat het in de zelfde lijn is van haar vraag)

Ik heb een beetje met pdf drivers lopen klooien. maar kan niet een echt goede vinden zonder veel geld neer te leggen of het niet werkend te krijgen.
Iemand hier met een goede ervaring voor een goede pdf driver. (in mijn geval wil ik hem graag op een server installeren die met data uit een db mijn facturen op de website zet. Dan kunnen klanten hun factuur zelf downloaden)
M.
 
hey na héééééééééééél lang zoeken (ook verder gekeken op de forum)

heb ik iets gevonden dat mijn rapport in access naar een .rtfdocument schrijft.
(dus 1000 records in tabel, 1000 rtf's met juiste naam als bestand)

nu heb ik een heel raar probleem namelijk, als ik mijn rtf opendoe, zie ik enkel mijn gegevens van mijn tabel.
mijn kop-en voettekst + doorlopende tekst in mijn rapport wordt niet mee naar document geschreven, enkel dus gegevens van mijn tabel.

weet iemand hoe dit komt?
dit is mijn code:
Private Sub knpPrinten_Click()
Dim db As Database
Dim rst As Recordset
Dim strSQL As String
Dim vFactuur As String
Dim vDatum As String
Dim strSQL_Rapport As String
Dim sFilter As String, sTabel As String
Dim vklant As Integer
Dim x As Integer
srapport = "vlms"
Set db = CurrentDb()
strSQL = "SELECT * from vlms"
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
rst.MoveFirst
Do While Not rst.EOF
vklant = rst!ID
DoCmd.OpenReport srapport, acViewDesign, , , acHidden
sTabel = "select * from vlms"
If InStr(1, UCase(sTabel), "WHERE") > 0 Then
strSQL_Rapport = Left(sTabel, InStr(1, sTabel, "WHERE ") - 1)
Else
If InStr(1, UCase(sTabel), "SELECT") = 0 Then
If InStr(1, sTabel, " ") > 0 And InStr(1, sTabel, "[") = 0 Then
sTabel = "[" & sTabel & "]"
End If
strSQL_Rapport = "SELECT * FROM " & sTabel & " "
Else
strSQL_Rapport = sTabel
End If
End If
sFilter = " WHERE id = " & vklant & ";"
strSQL_Rapport = strSQL_Rapport & sFilter
Reports(srapport).RecordSource = strSQL_Rapport
DoCmd.Close acReport, srapport, acSaveYes
DoCmd.OutputTo acOutputReport, srapport, acFormatRTF, "C:\Users\maria\Downloads\pdfs via rapport\BriefVlms-" & vklant & ".rtf"
rst.MoveNext
Loop
MsgBox ("klaar")
End Sub
 
eerst vul je de variable sTabel met een keiharde string en dan daarna ga je controleren wat er in staat. ?????? (je hebt het er net zelf ingezet.....)
Verder kan ik zo snel in de code geen fout vinden.
Kan het zijn dat het een afdruk instelling is die je mee moet geven. Dus dat voet/koptekst uitstaat in de standaard output optie?
M.
 
Das enige manier dat ik gevonden heb om record per record telkens 1 rtf te printen. Anders kreeg ik ofwel 1 rtf-bestand met al mijn 1000 records in, ofwel 1000rtf-bestanden met daarin 1000 records in. Weet jij toevallig hoe ik dit anders kan doen? Ben der nie zo goed in :)

Wat mijn rapport betreft, zal sffs idd mijn instellingen gaan nakijken, misschien dat ik daar iets moet gaan aanpassen.
 
Je kunt in Word aan een samenvoegbestand toch gewoon een accestabel koppelen ?
In Word kun je dan ieder samegevoegd bestand opslaan als PDF.
 
hey snb

idd, maar het zijn hier in totaal 5000 adressen en ieder pdf moet unieke klantnr als naam hebben
dat gaat toch niet met 1 handeling in word? Daar zou ik toch ieder record naar pdf printen en zelf naam moeten ingeven, of zie ik dit verkeerd?
 
Dat zie je inderdaad verkeerd.

Zie hier een macro die van een Worddocument een hoofddocument samenvoegen maakt en vervolgens de samenvoegingen 1 voor 1 uitvoert en tussentijds automatisch opslaat.
Omdat je een bestand maar 1 keer hoeft te koppelen heb ik de koppelingshandelingen maar even achter commentaartekens gezet.
Het invoegen van de samenvoegvelden kun je ook beter eerst met de hand doen.
Het opslaan van het hoofddocument is niet noodzakelijk voor het gewenste resultaat.

In dit voorbeeld is de tabel de tabel 'fiets' in het bestand G:\Access\Kopie van fiets.mdb. Dat zul je effe moeten aanpassen.

Code:
Sub M_snb()
    With ActiveDocument.MailMerge
'        .MainDocumentType = wdFormLetters
'        .OpenDataSource "G:\Access\Kopie van fiets.mdb", False, False, Connection:="TABLE fiets", SQLStatement:="SELECT * FROM [fiets]"
'        ActiveDocument.SaveAs2 "G:\OF\__samenvoeg Word Access snb.docm", wdFormatXMLDocumentMacroEnabled
        .ViewMailMergeFieldCodes = False
        
        With .DataSource
            .ActiveRecord = wdLastRecord
            y = .ActiveRecord
            .ActiveRecord = wdFirstRecord
    
            For j = 1 To y
                .ExportAsFixedFormat "G:\OF\brief " & Format(j, "000") & ".pdf", wdExportFormatPDF
                If j < y Then .ActiveRecord = wdNextRecord
            Next
        End With
    End With
End Sub
 
Laatst bewerkt:
@mie1981

Ik hoop dat Octafish meekijkt.....


Als je wil dat de inhoud van 1 van de samenvoegvelden in de bestandsnaam terecht komt kun je gebruik maken van:

Code:
.ExportAsFixedFormat "G:\OF\brief " & .fields(2).result & ".pdf", wdExportFormatPDF
 
Laatst bewerkt:
En waarom denk je dat ik dat niet weet? :)
 
@Octa,

Daar zeg ik niets over, bij gebrek aan kennis; ik zei alleen dat ik hoopte dat je meekeek,,,,, :d
Door jouw interpretatie van wat ik niet schreef raak ik aan het twijfelen ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan