Mail Merge

Status
Niet open voor verdere reacties.

ManuNeko

Gebruiker
Lid geworden
24 jun 2009
Berichten
110
Ik wil een brief in Word maken met gegevens uit Access. Op die brief staan getallen in cijfers en getallen in letters. Nu heb ik zelf een functie om cijfers om te zetten in letters.

Mijn probleem is hoe maak ik een merge met beide gegevens. Ik heb al geprobeerd om om het resultaat van mijn functie in een SQL te zetten, maar dan wordt die SQL te lang.

Dit is wat het zou moeten zijn: 2.500 (tweeduizend vijfhonderd).

Waarbij het getal uit een query komt en de letters uit een functie.
 
Als je de omzetting in een query doet (ik snap niet hoe die te lang kan worden; je hebt er toch een functie van gemaakt?) en de merge met die query doet, zal het wel werken, denk ik.
 
Ik heb een functie gemaakt, maar die kan ik niet oproepen in de query. Ik plak gewoon het resultaat, tussen quotes, in de query.

Misschien kan je mij eens eens uitleggen hoe ik die functie aanroep.
 
Je moet de functie PUBLIC maken; dan kun je hem in een query gebruiken.
 
Dat heb ik reeds geprobeerd, maar dat werkte niet. Waarschijnlijk deed ik iets fout.

Om te beginnen waar moet ik die functie zetten? In een module, maar welke module? of speelt dat geen rol?
 
Mijn functie werkt nu in mijn query, maar nu kan ik mijn word document niet meer openen.
 
Dat zou kunnen; je functie berekent de data op het moment dat de query wordt geopend. Om goed te kunnen samenvoegen, zou je een tijdelijke tabel kunnen maken en daarmee samenvoegen.
Overigens kun je met een simpele Word switch een getal omzetten naar tekst, dus daar heb je helemaal geen ingewikkelde functie voor nodig: {REF Text1 \* Cardtext} bijvoorbeeld zet je getal al netjes om naar tekst.
 
Zou je eens wat meer uitleg kunnen geven over die "ref"? Of zeggen waar ik ergens een voorbeeld en/of uitleg kan vinden?

Als er een functie bestaat, kan ik beter die gebruiken dan zelf iets te maken.
 
Wat is er mis mijn code? Als ik op de lijn van OpenDataSource kom dan stopt alles.

Code:
    Dim sDBPath, sSqlString As String
    Dim oApp As Word.Application
    Dim oMainDoc As Word.Document
    
    Set oApp = CreateObject("Word.Application")
    Set oMainDoc = oApp.Documents.Open("C:\Brieven\Edenred Controledocument.docx")
    sDBPath = "C:\Personeel.mdb"
       
    With oMainDoc.MailMerge
        .MainDocumentType = wdFormLetters
        .OpenDataSource Name:=sDBPath, SQLStatement:="Select * From [qryEdenred]"
        
        
        .Destination = wdSendToNewDocument
        .Execute
    End With
    
    oApp.Visible = True
    
    Set oMainDoc = Nothing
    Set oApp = Nothing
 
Ik zou niet weten waarom je die regel überhaupt nodig hebt; je opent een Mailmerge document; ik neem aan dat je die al opgemaakt hebt, en de velden hebt ingesteld. Het document heeft dus al een Datasource, waarom zou je die elke keer opnieuw instellen met dezelfde bron ook nog eens? Dat heeft alleen zin als je steeds een andere bron gebruikt.
 
Als ik die lijn weglaat kan krijg ik een error omdat er blijkbaar geen gegevensdocument is!
 
Zonder voorbeeldbestandjes kan ik de situatie niet nabootsen; ik gebruik zelf deze manier om samen te voegen met een sjabloon:

Code:
    'Mergen met word-sjabloon 'Merge Email Data.dot'
    Set aWord = CreateObject("Word.Application")
    Set oWord = aWord.Documents.Open(strMergePad & "Merge Email Data.dot")
    DoCmd.Echo False, "Bezig met maken van samenvoegdocument 'Merge Email Data.doc'."

    On Error GoTo Stoppen
    With oWord.MailMerge
        .Destination = wdSendToNewDocument
        .Execute
    End With

    DoCmd.Echo False, "Bezig met opslaan van e-mailadressen bestandenlijst"
    oWord.Application.ActiveDocument.SaveAs (strMergePad & "Merge Email Data.doc")
    oWord.Application.ActiveDocument.Close
    oWord.Close (wdDoNotSaveChanges)
    Set oWord = Nothing
    DoEvents
    aWord.Quit

Die werkt overigens tadelloos....
 
Ik "begin" nu toch een beetje mijn geduld te verliezen. Ik ben nu al een week aan het proberen om een eenvoudige Mail Merge te doen. Ik krijg een waslijst aan fouten. Fouten over dingen die er gewoon niet instaan.

In bijlage een test document. De database kan ik niet oploaden. Het is gewoon een Access 2010 database met 2 records (Naam, Voornaam, Adres, Postcode, Woonplaats)

Ik heb een formulier met 1 knop en de volgende code on-click:

Code:
Option Compare Database

Private Sub Knop0_Click()
    Dim oApp As Word.Application
    Dim oMainDoc As Word.Document
    Dim oSel As Word.Selection
    Dim sDBPath As String

    Set oApp = CreateObject("Word.Application")
    'Nieuw hoofddocument starten voor de samenvoegbewerking.
    Set oMainDoc = oApp.Documents.Open("C:\Users\elaur\Documents\Brieven\AdresBrief.docx")
    oApp.Application.Visible = True
  
    With oMainDoc.MailMerge

        .MainDocumentType = wdFormLetters
        
        'De gegevensbron voor de samenvoegbewerking instellen op Noordenwind.mdb.
        sDBPath = "C:\Users\elaur\Documents\Brieven\Database4.accdb"
        .OpenDataSource Name:=sDBPath, SQLStatement:="SELECT * FROM [Werknemers]"
        
        'Veldcodes toevoegen aan het document om standaardbrief te maken.
    End With
    
    'Samenvoeging naar nieuw document uitvoeren.
    With oMainDoc
        .MailMerge.Destination = wdSendToNewDocument
        .MailMerge.Execute Pause:=False
    End With
       
    Doc.Close False
    oApp.Visible = True
    MsgBox "Samenvoegen is voltooid: " & oApp.ActiveDocument.Name
    Set oApp = Nothing
       
End Sub
 

Bijlagen

Ik zal eens kijken of ik er wat mee kan stoeien... Is dan wel in eerste instantie in 2003, want ik heb op het werk geen 2010.
 
Ik vermoed dat de hele ellende veroorzaakt wordt doordat je een Word melding krijgt tegenwoordig:
Opening this document will run the following SQL command:
SELECT * FROM your datasource
Data from your database will be placed in the document. Do you want to continue?

Of de Nederlandse versie uiteraard... Als gebruiker moet je hier op Ja klikken, anders raak je de verbinding met je db kwijt. Je kunt die boodschap onderdrukken met de extra parameter Setting DisplayAlerts=none, maar dat maakt het probleem alleen maar groter, want je opent het bestand dan zonder de db koppeling. En dan is het dus al gelijk einde oefening.

In deze Microsof pagina wordt e.e.a. nog eens haarfijn uitgelegd, met een Registry truc om de boodschap in zijn geheel uit te schakelen (je moet er maar op komen!)
Mijn code doet het inderdaad (net als die van jou) ook niet meer, omdat ik 'm het laatst heb gebruikt in een versie die nog voor ServicePack 3 lag. En, zoals je in het artikel kunt lezen, is met ServicePack 3 de ellende begonnen! Het is dus iets meer uitzoekwerk om e.e.a. zonder sores te laten werken. Al kun je deze trucs nog proberen... Zoek naar de regel Super Easy Word Merge en bekijk zijn voorbeeld maar eens.
 
Om een (toch wel lang) verhaal enigszins de goede kant op te sturen: in 2003 is het me gelukt! En wel zo:

Code:
Private Sub cmdSamenvoegen_Click()
    Dim oApp As Word.Application
    Dim oWord As Word.Document
    Dim sDBPath As String
    Dim strMergePad As String, strConnection As String
    
    strMergePad = "C:\Users\elaur\Documents\Brieven\"
    sDBPath = "C:\Users\elaur\Documents\Brieven\Database4.accdb"
    
    'Nieuw hoofddocument starten voor de samenvoegbewerking.
    DoCmd.Echo False, "Bezig met maken van samenvoegdocument AdresBrief.docx'."
    Set oApp = CreateObject("Word.Application")
    oApp.DisplayAlerts = wdAlertsNone
    oApp.Visible = True
    
    Set oWord = oApp.Documents.Open(strMergePad & "AdresBrief.docx")
    On Error GoTo Stoppen
    
    With oWord.MailMerge
        strConnection = "DSN=MS Access Databases;" & sDBPath & ";FIL=RedISAM;"
        .MainDocumentType = wdFormLetters
        .OpenDataSource Name:=sDBPath, Connection:=strConnection, SQLStatement:="SELECT * FROM [Werknemers]", LinkToSource:=True, AddToRecentFiles:=False
        .Destination = wdSendToNewDocument
        .Execute
    End With

    DoCmd.Echo False, "Bezig met opslaan van adressenlijst"
    oWord.Application.ActiveDocument.SaveAs (strMergePad & "AdresBrief - " & Format(Date, "yymmdd") & ".doc")
    oWord.Application.ActiveDocument.Close
    oWord.Close (wdDoNotSaveChanges)
    Set oWord = Nothing
    DoEvents
    oApp.Quit
    DoCmd.Echo True
    Exit Sub

Stoppen:
    MsgBox Err.Number & " - " & Err.Description
    On Error Resume Next
    oWord.Close
    Set oWord = Nothing
    oApp.Quit
    Set oApp = Nothing

End Sub
 
Dat blijkt inderdaad te werken. Maar ik moet eerst nog een paar dingen testen om zeker te zijn.
 
Je kunt het db pad nog wat netter benoemen; dat scheelt een hoop ellende als je 'm een keer verplaatst.
Code:
    sDBPath = CurrentProject.Path & "\Database4.accdb"
vermoed ik...
 
Het werkte dus in mijn testversie. Ik heb nu alles overgezet en nu krijg ik de melding:

5922 - Gegevensbron kan niet geopend worden

En ja, mijn pad staat correct, de query bestaat en werkt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan