Inhoud van een Mergfield naar een VBA variabele

Status
Niet open voor verdere reacties.

roppie555

Gebruiker
Lid geworden
18 dec 2007
Berichten
36
Ik heb een lijst gegevens in een Excel sheet. In een Word document haal ik een aantal gegevens binnen m.b.v. mailmerging. Ik heb in VBA een aantal velden nodig zoals:
lblKlantnaam = ActiveDocument.Fields(60).Result
Dit werkt in principe goed. Echter als ik de Word- en Excelbestanden op een andere computer zet kloppen de indexen (in dit geval 60) vaak niet meer. dit kan dan zomaar 59 of 61 zijn.
Daarom wil ik liever weken met de Veldnaam i.p.v. de veld index b.v.:
lblKlantnaam = ActiveDocument.Fields("Klantnaam").Result
Echter als ik de namen van de velden bekijk heet een veld b.v.: " MERGEFIELD "Klantnaam"
Met al die aanhalingstekens gaat dit niet goed. Weet iemand een andere oplossing?
 
Die tussenstap met velden heb je niet nodig om in een userform de gegevens uit het Excelbestand in te lezen.
 
Snb, dat is bekend maar ik wil de gemergde brieven als losse documenten opslaan en de bestandsnaam wordt dan opgebouwd uit de inhoud van een aantal velden, vandaar.
Heb jij een oplossing?
 
Laat eerst eens zien wat je hebt; in Word kun je simpel de naam van een veld uitlezen uit de FIELDS collectie. Je zou dus helemaal geen last hoeven te hebben van aanhalingstekens.
 
Sorry, maar dat heb ik in mijn vraag aangegeven.
Ik lees de waarde nu uit a.h.v. het indexnummer. Maar als ik de koppeling opnieuw aanbreng kloppen de nummers niet altijd meer. Indexnummer 60 kan dan b.v.59 zijn. Daarom wil ik de waarde uitlezen a.h.v. de index naam. Ik heb in mijn eerste vraag een voorbeeld van mijn methode gegeven.
 
En je bent niet duidelijk genoeg. Een Mergefield heeft een naam, die in de Mergefield zelf tussen dubbele aanhalingstekens staat. In VBA refereer je aan Mergefields zonder die aanhalingstekens. D.w.z. dat lblKlantnaam = ActiveDocument.Fields("Klantnaam").Result een werkbare code zou moeten zijn. Werkt dat niet, dan doe je iets verkeerds. Maar zonder de code is dat niet te controleren. Dus als je dit jaar nog antwoord wil, post dan je VBA code :)
 
O.k. ik zal proberen wat specifieker te zijn.
Ik heb de volgenden code:
Code:
Private Sub btnBewaren_Click()
    Klantnaam = ActiveDocument.Fields(2).Result
    Jaarvan = ActiveDocument.Fields(59).Result
    Jaartot = ActiveDocument.Fields(60).Result
    ActiveDocument.SaveAs2 FileName:=klantnaam & " " & JaarVan & " " & JaarTot & " versie " & cmbVersieNummer.Text & ".docx"
    MsgBox ("Opgeslagen als: " & klantnaam & " " & JaarVan & " " & JaarTot & " versie " & cmbVersieNummer.Text & ".docx")
End Sub

Ik zet het Word en het Excel document regelmatig over op een nadere computer. Dan blijkt soms dat het veldnummer (59 of 60) niet altijd meer overeen te komen met de zelfde kolommen.
Jaarvan blijkt dat 60 te moeten zijn en Jaartot 61.
Daarom wil ik niet meer refereren aan het indexnummer maar aan de veldnaam.
De kolomnamen van dit voorbeeld heten in Excel: "Jaar van" en "Jaar tot". Daarom dacht ik:
Code:
Jaarvan = ActiveDocument.Fields("Jaar van").Result
Maar dan krijg ik de melding: Type komen niet overeen.
Ik hoop dat ik nu wat meer duidelijk heb geschept.
 
Code:
Sub tst()
    For Each fl In ThisDocument.Fields
        fl.ShowCodes = False
        If fl.Type = 59 Then MsgBox fl.Type & vbTab & Trim(Split(fl.Code)(2)) & vbTab & fl.Result
    Next
End Sub
 
Bedankt voor je hulp.
Dit mooie stukje code legt meteen bloot waar mijn probleem ontstaat.
Code:
Trim(Split(fl.Code)(2))
geeft voor sommige veldnamen gewoon de veldnaam weer en voor de overige de veldnaam maar dan tussen haakjes.
Dus:
"Klantnaam"
Betalingstermijn
"Geldig_van"
Stad

Als ik deze resultaten in een string gedefinieerde variabele stop en ik haal met RIGHT en LEFT er 1 karakter af dan blijven de "" er omheen staan. Ik heb in Excel de eigenschappen van de cellen als tekst of getal gedefinieerd dat maakt niet uit.

Zoals hieronder:
Code:
    For Each fl In ThisDocument.Fields
        fl.ShowCodes = False
        If fl.Type = 59 Then
            'MsgBox fl.Type & vbTab & Trim(Split(fl.Code)(2)) & vbTab & fl.Result
            Veld = Trim(Split(fl.Code)(1))
            Veld = Mid(Veld, 1, 8)
            If Trim(Split(fl.Code)(2)) = "Geldig_van" Then
                lblGeldigvan = Trim(Split(fl.Code)(2))
            End If
        End If
    Next
 
Code:
Sub tst()
    For Each fl In ThisDocument.Fields
        fl.ShowCodes = False
        If fl.Type = 59 Then MsgBox fl.Type & vbTab & replace(Trim(Split(fl.Code)(2)),chr(34),"") & vbTab & fl.Result
    Next
End Sub
 
Dat was het antwoord om tot een oplossing te komen. De uiteindelijke code is:
Code:
    For Each fl In ThisDocument.Fields
        fl.ShowCodes = False
        If fl.Type = 59 Then
            If Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Geldig_van" Then
                lblGeldigvan = "Contract is geldig van 1 januari " & fl.Result
            ElseIf Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Geldig_tot" Then
                lblGeldigtot = "Contract is geldig tot 31 december " & fl.Result
            ElseIf Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Bedrijf" Then
                lblKlantnaam = "Klantnaam: " & fl.Result
            End If
        End If
    Next
Vraag me nog wel af waarom sommige merge-velden "" hebben en de rest niet. Weet jij dat?
In ieder geval: bedankt voor je hulp, wordt zeer gewaardeerd. :thumb:
 
Wat zou er gebeuren als een veldnaam een spatie bevatte ?

Code:
For Each fl In ThisDocument.Fields
  If fl.Type = 59 Then
    fl.ShowCodes = False
    c00="Contract is geldig "
    c01=Replace(Trim(Split(fl.Code)(2)), Chr(34), "")

    If instr(c01,"van")>0  Then
      lblGeldigvan = c00 &"van 1 januari " & fl.Result
    ElseIf instr(c01,"tot")>0 Then
      lblGeldigtot = c00 & "tot 31 december " & fl.Result
    ElseIf c01= "Bedrijf" Then
      lblKlantnaam = "Klantnaam: " & fl.Result
    End If
  End If
Next
 
Laatst bewerkt:
Sorry voor de late reactie. Tijdje weg geweest, vandaar.
Nogmaals bedankt voor je aanvulling. Alles werkt perfect zo.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan