Problemen word 2010 split and merge - resultaat bewaren in afzonderlijk documenten

Status
Niet open voor verdere reacties.

vermhans

Gebruiker
Lid geworden
31 mrt 2010
Berichten
38
Beste,
Geen tot weinig notie van VBA, doch desondanks naastig aan het proberen om gevonden codes op het internet aan te passen naar eigen behoefe.
Beoogd resultaat: het resultaat van een samenvoeging in WORD2010 splitsen en elk record individueel bewaren, op een vaste locatie op de server, met als naamgeving een veldnaam uit de dbase.
In WORD2003 maakt ik gebruik van de tool van gmayor (werkt subliem, doch nu gedownloaded voor 2010 en werkt niet).
Op stackoverflow wel een code gevonden van Soren Francis (http://stackoverflow.com/questions/...h-a-merge-field-as-the-name/17511768#17511768)
Dit doet uitstekend wat ik wens, ECHTER voor maar één enkel record (hetgeen waarop men staat).
Ik zou in één beweging graag alle records bewaard hebben en bijkomend, als het document reeds bestaat in de directory, dat dit zonder meer zou overschreven worden.
Alvast dank voor jullie deskundig adviezen of oplossingen.
Hierna de code, zover als mogelijk reeds aangepast naar mijn behoefte.

Bekijk bijlage test.zip
Code:
Sub splitmacro()
'
' 1) Merges active record and saves the resulting document named by the datafield     FileName"
' 2) Closes the resulting document, and (assuming that we return to the template)
' 3) advances to the next record in the datasource
'Søren Francis 6/7-2013

    Dim DokName  As String   'ADDED CODE
    Dim firstname As String
    Dim lastname As String
    
    firstname = ActiveDocument.MailMerge.DataSource.DataFields("Voornaam").Value
    lastname = ActiveDocument.MailMerge.DataSource.DataFields("Achternaam").Value
   
    With ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = True
        With .DataSource
            .FirstRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
            .LastRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
        End With

' Merge the active record
        .Execute Pause:=False
    End With

' Save then resulting document. NOTICE MODIFIED filename
    ActiveDocument.SaveAs2 FileName:="C:\Users\vermhans001\Documents\test\" + lastname + firstname + ".docx", FileFormat:= _
        wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _
        :=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _
        :=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
        SaveAsAOCELetter:=False, CompatibilityMode:=14

' Close the resulting document
    ActiveWindow.Close

' Now, back in the template document, advance to next record
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
End Sub
 
Laatst bewerkt:
Plaats svp de code tussen codemarkeringen (code tags) !
En plaats natuurlijk een voorbeeldbestand.
Wat voor soort bestand is het 'datasource' bestand ?
 
Laatst bewerkt:
mailmerge - split to separate docs

Beste,
dank voor uw snelle reactie en uw opmerking(en) betreffende publicatie. Bij deze is dit (hopelijk correct) aangepast (wist dit niet :confused:) en het is de eerste maal dat ik in dit onderdeel van het forum een vraag plaats.
In bijlage (zip-bestand) een test hoofddocument (ik heb de macro ingesloten in het hoofddocument) + het bronbestand (access 2010-bestand).
Het doel is dus:
- hoofddocument openen, koppelen voor samenvoeging met de qry (of een andere - evenwel de naam en de voornaam komt in al mijn query's voor) en dan (zonder eerste de samenvoeging uit te voeren) de macro voor de split-bewaar macro uitvoeren, waarbij elk record een apart bestand wordt in de door mij bepaalde directory en waar nodig, reeds bestaande documenten met dezelfde naamgeving, overschrijft.
Mvg
 
Waarom regel je niet alles vanuit Access? Niet alleen kun je prima rapporten maken in Access die als uitgaande brief kunnen dienen, je bent ook gelijk van het splits probleem af. En het afzonderlijk opslaan en eventueel mailen is ook geen probleem. Zelfs vanuit Access een export naar Word is heel goed te doen, waarbij je de documenten dan ook heel eenvoudig een aangepaste naam kunt geven. Je kiest, in mijn ogen, de meest ingewikkelde manier, omdat Word hier niet echt voor is uitgerust. Je kunt met de Splitter macro prima een samenvoegdocument uit elkaar trekken in losse documenten, maar het is een stuk lastiger om die dan de juiste naam te geven.
 
Het kan (na invoer van de volledige naam van het Accessbestand) eenvoudig met:

Code:
Sub M_database_uitlezen()
    With ActiveDocument
        With .MailMerge
            .MainDocumentType = 0
            .OpenDataSource "G:\Access\fiets.mdb"
            With .DataSource
             .ActiveRecord = wdLastRecord
            y = .ActiveRecord
            For j = 1 To y - 1
              .ActiveRecord = j
              .Parent.Parent.Content = .DataFields("achternaam").Value & vbcr & .DataFields("voornaam").Value &vbcr & .DataFields("adres").Value
              .Parent.Parent.SaveAs2 "C:\Users\vermhans001\Documents\test\" & .DataFields("achternaam").Value & .DataFields("voornaam").Value & ".docx"
            Next
        End With
     End With
    End With
End Sub
 
Laatst bewerkt:
Beste,
@octafish: dacht ook wel dat dit allemaal zou moeten lukken met access, maar geen ervaring ermee via rapporten en het lijkt voor mij gecompliceerder :o, zoek dus nu in feite een snelle oplossing en doordat ik iets meer vertrouwd ben met WORD, toch wat samenvoegen betreft, zoek ik op basis daarvan de oplossing .... maar met je oplossing zie ik wel een heel andere wereld opengaan en ben wel zinnens mij hierover wat meer te verdiepen (weliswaar op regenachtige dagen :rolleyes:)
@sbn:
thx voor de code, het werkt in zoverre dat ik mijn qry kan selecteren en dat vervolgens elk individueel record wordt opgeslagen als word-docx, so fa so good, maar het is niet het resultaat van de samenvoeging (het uiteindelijk samengevoegd document) die opgeslagen wordt; bij het openen van het opgeslagen document, aangemaakt door de macro, wordt in eerst instantie gevraagd of opnieuw dient gekoppeld te worden aan de qry en het opgeslagen document bevat uiteindelijk textueel enkel de naam en voornaam, niks meer van het hoofddocument.

Dus in normale omstandigheden (normale samenvoeging): je voegt bv een kostenstaat (hoofddocument) samen met een qry: je voert de samenvoeging uit, dit resulteert in een nieuw document waar alle kostenstaten achter elkaar staan. Elke kostenstaat in dit nieuw document zou ik willen individueel opgeslagen zien….
Een beetje moeilijk uitgelegd zeker … :confused: maar dat is in een notedop de opzet.

Mijn geposte code deed dit, echter maar met 1 record en niet alle records ....
 
Je mag gewoon de code - na bestudering en analyse- natuurlijk gewoon aanpassen.

Als jij jouw samenvoegdocument gebruikt kun er je deze code inzetten:

Code:
Sub M_database_uitlezen()
    With ActiveDocument
        With .MailMerge
            .MainDocumentType = 0
            .OpenDataSource "G:\Access\fiets.mdb"
            With .DataSource
             .ActiveRecord = wdLastRecord
            y = .ActiveRecord
            For j = 1 To y - 1
              .ActiveRecord = j
              .Parent.execute
               activedocument.SaveAs2 "C:\Users\vermhans001\Documents\test\" & .DataFields("achternaam").Value & .DataFields("voornaam").Value & ".docx"
               activedocument.close 0
            Next
        End With
     End With
    End With
End Sub
 
Laatst bewerkt:
Beste snb,

Het lukte ook niet helemaal met je laatst geposte code (ik kreeg een foutmelding bij SaveAs2-pad, hoewel dit correct was aangepast), maar door in je code de macro te laten uitvoeren die ik initieel heb gepost loop alles nu op wieltjes !!! Harlijke dank.
Dit zal wel geen oplossing volgens de regels van de kunst zijn :o want zoals reeds eerder gezegd ben ik een leek op gebied van VBA, desondanks ben toch zeer tevreden!
Volledigheidshalve post ik hieronder wat het uiteindelijk geworden is. Ik weet niet of er een protocol bestaat over het aanhalen van de bronnen, doch heb ze toch aangehaald.


Code:
Sub SplitMacroI()
'
' basis code Søren Francis 6-7-2013 Stackoverflow how to split a mailmerge
' 1) Merges active record and saves the resulting document named by the datafield Achternaam en Voornaam"
' 2) Closes the resulting document en advances to the next record in the datasource
'

    Dim DokName  As String
    Dim firstname As String
    Dim lastname As String
    
    firstname = ActiveDocument.MailMerge.DataSource.DataFields("Voornaam").Value
    lastname = ActiveDocument.MailMerge.DataSource.DataFields("Achternaam").Value
   
    With ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = True
        With .DataSource
            .FirstRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
            .LastRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
        End With

' Merge the active record
        .Execute Pause:=False
    End With

' Save then resulting document. NOTICE MODIFIED filename
    ActiveDocument.SaveAs2 FileName:="S:\sec_ev\test\" + lastname + firstname + ".docx", FileFormat:= _
        wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _
        :=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _
        :=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
        SaveAsAOCELetter:=False, CompatibilityMode:=14

' Close the resulting document
    ActiveWindow.Close

' Now, back in the template document, advance to next record
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
End Sub

Sub SplitMacroUitvoeren()
'
' basis code snb 02-07-2014 – Helpmij.nl
' execute for each record SplitMacroI
'

    With ActiveDocument
        With .MailMerge
            .MainDocumentType = 0
' removed line .OpenDataSource "Pathname:\.mdb"
            With .DataSource
             .ActiveRecord = wdLastRecord
            y = .ActiveRecord
            For j = 1 To y - 1
              .ActiveRecord = j
' removed lines .Parent.execute
'                ActiveDocument.SaveAs2 "C:\Users\vermhans001\Documents\test\" & .DataFields("achternaam").Value & .DataFields("voornaam").Value & ".docx"
'                ActiveDocument.Close 0
              .Application.Run MacroName:="SplitMacroI"
              Next
        End With
     End With
    End With
End Sub
 
Kun je dan deze code testen (zonder de andere)
Code:
Sub M_database_uitlezen()
    With ActiveDocument
        With .MailMerge
            With .DataSource
             .ActiveRecord = wdLastRecord
            y = .ActiveRecord
            For j = 1 To y - 1
              .ActiveRecord = j
              .parent.Execute
               activedocument.SaveAs2 "C:\Users\vermhans001\Documents\test\" & .DataFields("achternaam").Value & .DataFields("voornaam").Value & ".docx",12
               activedocument.close 0
            Next
        End With
     End With
    End With
End Sub
 
Laatst bewerkt:
Met schaamrood op de kaken :o :o :o, laatste code werkt wel degelijk, had bij deze test niet gelet op de casesensitive van de veldnamen.
Dit werkt!!!
great :thumb:
thx
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan