Mailmerge alleen huidig record

Status
Niet open voor verdere reacties.

remcop1989

Gebruiker
Lid geworden
29 mrt 2012
Berichten
492
Ik ben bezig met een offertesysteem.

De gebruiker voert hier in een scherm gegevens in die op een offerte komen te staan. 1 offerte per keer.

Nu wil ik middels een mailmerge de offerte in Word laten maken. Dit lukt. Echter ik wil dat hij alleen voor het huidige record/de huidige offerte een mailmerge maakt en niet voor allemaal.

Hoe kan ik dit het beste doen?

Ik gebruik de volgende functie/module voor de mailmerge:

Code:
Function naam van de functie in de module()
         Dim oApp As Object
         Set oApp = GetObject("bestandspad waar het worddocument staat", "Word.Document")
         ' Make Word visible.
         oApp.Application.Visible = True
         ' Set the mail merge data source as the Northwind database.
         oApp.MailMerge.OpenDataSource _
            Name:="bestandspad waar de access database staat", _
            LinkToSource:=True, _
            Connection:="TABLE de naam van de tabel(len)", _
            SQLStatement:="SELECT * FROM [de naam van de tabel waaruit de SQL uitgevoerd moet worden]"
         ' Execute the mail merge.
         oApp.MailMerge.Execute
End Function

Deze word aangeroepen middels de volgende code achter een knop:
Code:
Private Sub naam van de knop_Click()
    Naam van de module waarin de code staat.naam van de functie in de module
End Sub
 
In je functie heb je een SQLStatement dat alle records selecteert. Dan is het logisch dat je ze ook allemaal ziet. Er moet dus een WHERE element bijkomen waarin je filtert op het gewenste record.
 
Dat had ik inderdaad al bedacht. Daarom heb ik nu de volgende code:

Code:
Function mailmerge()
    Dim oApp As Object
    Dim xOfferteNummer As String
    
    xOfferteNummer = Forms("Nieuwe offerte")("Offertenummer")
    
        'Set the Word document
         Set oApp = GetObject("C:\Users\Remco\Desktop\Yellow Rental offerte sjabloon huur.doc", "Word.Document")

         ' Make Word visible.
         oApp.Application.Visible = True

         ' Set the mail merge data source database.
         oApp.mailmerge.OpenDataSource _
            Name:="C:\Users\Remco\Desktop\Offerteprogramma.mdb", _
            LinkToSource:=True, _
            Connection:="TABLE Offertes", _
            SQLStatement:="SELECT * FROM [Offertes] WHERE [Offertes].[Offertenummer] = " + xOfferteNummer + ""

         ' Execute the mail merge.
         oApp.mailmerge.Execute

End Function

Hij opent echter nog steeds ALLE records.
 
Ik vind het plusje in je statement behoorlijk link. Zelf zou ik dat niet zo snel doen. Ik zie ook geen winst t.o.v.
Code:
SQLStatement:="SELECT * FROM [Offertes] WHERE [Offertenummer] = " & xOfferteNummer
Nu loop je het risico dat als xOfferteNummer leeg is, je SQL corrupt raakt. Maar goed, vermoedelijk ligt daar het probleem niet. Om te voorkomen dat we een hele db moeten nabouwen zou ik zeggen: voorbeeldje ;)
 
Oké, het werkt dus tot zover. Er is nu alleen een nieuw probleem ontstaan:

Ik heb nu de volgende functie in een module voor de mailmerge:

Code:
Function mailmerge(xOfferteNummer As String)
    Dim oApp As Object
    Dim xSql As String
    Dim xMergeDoc As String
    
    xMergeDoc = "R:\2007-2008-2009-2010\Offertesysteem\Yellow Rental offerte sjabloon huur.doc"
    
    xSql = "SELECT * FROM [Offertes] WHERE [Offertes].[Offertenummer] ='" + xOfferteNummer + "'"
    'MsgBox xSql
    
    'Exit Function
        'Set the Word document
         Set oApp = GetObject(xMergeDoc, "Word.Document")

         ' Make Word visible.
         oApp.Application.Visible = True
         
         ' Set the mail merge data source database.
         'oApp.mailmerge.OpenDataSource _
            Name = "R:\2007-2008-2009-2010\Offertesysteem\Offerteprogramma.mdb", _
            LinkToSource = True, _
            Connection = "TABLE Offertes", _
            SQLStatement = "SELECT * FROM [Offertes] WHERE Offertenummer = " + xOfferteNummer

        oApp.mailmerge.OpenDataSource _
            Name:="R:\2007-2008-2009-2010\Offertesysteem\Offerteprogramma.mdb", _
            LinkToSource:=True, _
            Connection:="TABLE Offertes", _
            SQLStatement:=xSql

         ' Execute the mail merge.
         oApp.mailmerge.Execute
         
        oApp.Application.Run "CloseMergeSource"
     
End Function

Deze wordt gestart door de volgende code achter een knop op een formulier:

Code:
Private Sub Knop61_Click()
    RunCommand acCmdSaveRecord
        
    mailmerge.mailmerge Forms("[B]Formuliernaam[/B]")("[B]Veldnaam[/B]")
    
End Sub

Middels deze codes wordt het sjabloon geopend en perfect een mailmerge uitgevoerd voor het huidige record. Echter er staan nu 2 Word documenten open: het sjabloon en het gemailmergede offerte document. Ik wil nu automatisch het sjabloon laten sluiten. Dit doe ik met de regel
Code:
 oApp.Application.Run "CloseMergeSource"
in de functie. Deze roept in Word de Macro "CloseMergeSource" aan:

Code:
Sub CloseMergeSource()
    Bestandsnaam = "R:\2007-2008-2009-2010\Offertesysteem\Yellow Rental offerte sjabloon huur.doc"
    Dim I As Integer
    Dim Origineel As String

    If Bestandsnaam = Empty Then
        Exit Sub
    End If

    If Application.Version >= "12.0" Then

        ' Office 2007 op deze manier ondervangen.
        Origineel = ActiveDocument.Name
      
        For I = 1 To Documents.Count

            Windows(I).Activate
      
            If LCase(ActiveDocument.Name) = LCase(Bestandsnaam) Then
            Rem MsgBox "Hier mergebronbestand proberen te sluiten " + Bestandsnaam
                ActiveDocument.Close (wdDoNotSaveChanges)
                Exit For
            End If
    Next I

        ' Lus om juiste document gemergde document op te sporen.
        For I = 1 To Documents.Count
            Windows(I).Activate
            If LCase(ActiveDocument.Name) = LCase(Origineel) Then
                Exit For
            End If
        Next I

    Else
        ' Probeer onder Word 2003 hier het samenvoegsjabloon te sluiten
        For Teller = 1 To Documents.Count
            'MsgBox LCase(Windows(Teller).Document.FullName) + Chr(13) + LCase(Bestandsnaam)
            
            If LCase(Windows(Teller).Document.FullName) = LCase(Bestandsnaam) Then
                Windows(Teller).Document.Close (wdDoNotSaveChanges)
            End If
        Next
    End If

End Sub

De macro wordt aangeroepen en uitgevoerd. Echter krijg ik de foutmelding

"Fout 5941 tijdens uitvoering:
Het gevraagde lid van de collectie bestaat niet."

Bij foutopsporing opent zich de code van de macro "CloseMergeSource" en is de volgende regel in de code geel gemarkeerd met een geel pijltje in de kantlijn:
Code:
If LCase(Windows(Teller).Document.FullName) = LCase(Bestandsnaam) Then

Ik heb al gekeken of de verwijzingen in Word en Access hetzelfde zijn (in code-editor menu extra --> verwijzingen), maar dat helpt niet. Als ik uit de functie het lijntje
Code:
 oApp.Application.Run "CloseMergeSource"
op de rem zet, dan werkt hij zonder foutmeldingen, maar sluit het sjabloon niet.

Open ik een Word document én het sjabloon en voer ik de macro "CloseMergeSource" direct in Word (handmatig) uit, dan sluit het sjabloon document zonder foutmelding en blijft het andere document open zoals het hoort.

Weet iemand hier een oplossing voor? Wat ik dus wil is dat het sjabloondocument zich na het uitvoeren van de mailmerge sluit en enkel het nieuw ontstane document openblijft op de voorgrond.
 
Oké, de oplossing was dus simpeler dan ik dacht.

Het sjabloon-document sluiten middels het aanroepen van een macro is niet de juiste oplossing.

In bovenstaande code is "oApp" het sjabloon-document. Dit document word middels

"oApp.mailmerge.execute"

samengevoegd met gegevens uit de database. Dit samenvoeg document is een ander document dan "oApp".
De code:

"oApp.Close" is al voldoende!
 
Opslaan samenvoegdocument na mailmerge

Er is dus nu een Offerte gecreëerd met alle relevante gegevens. Nadat dit functioneert wil ik nu het volgende:

1) maak een map aan in R:/offertes die als naam heeft:
Code:
[offertenummer] " " [bedrijfsnaam] " " "-" " "[voornaam] " " [achternaam]

2) sla in deze map het gecreëerde samenvoegdocument op in .pdf formaat met:
Code:
"Off-" [offertenummer]

Is dit mogelijk?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan