Verwijderen (unlink) Docvariable (Word 2016)

Status
Niet open voor verdere reacties.

Plotinus

Gebruiker
Lid geworden
25 mrt 2007
Berichten
649
Via een Userform laat ik een gebruiker allerlei zaken invullen die vervolgens in Documentvariabelen ({DOCVARIABLE varMelder \* CHARFORMAT}) in een Worddocument worden gestopt. Omdat ik er achter ben gekomen dat als er vervolgens een pfd van het document wordt gedraaid er wel eens zaken verkeerd gaan, verwijder ik alle code uit het Word-bestand na samenvoegen:

Code:
Sub Unlink()

    Dim oField As Field
    Dim oSection As Section
    Dim oHeader As HeaderFooter
    Dim oFooter As HeaderFooter

    Application.ScreenUpdating = False

    For Each oSection In ActiveDocument.Sections

        For Each oHeader In oSection.Headers
            If oHeader.Exists Then
                For Each oField In oHeader.Range.Fields
                    oField.Unlink
                Next oField
            End If
        Next oHeader

'        For Each oFooter In oSection.Footers
'            If oFooter.Exists Then
'                 For Each oField In oFooter.Range.Fields
'                     oField.Unlink
'                Next oField
'            End If
'        Next oFooter
    Next oSection

    With Selection
        .WholeStory
        .Fields.Unlink
        .HomeKey Unit:=wdStory
    End With

End Sub

Dit gaat prima, behalve dat daarmee ook hyperlinks worden 'platgeslagen'.

Is er een manier om alleen de Docvariabelen te verwijderen - te 'unlinken'?
 
Post eens een voorbeeldje mee; ik steek liever tijd in een oplossing zoeken dan in je document nabouwen :).
 
Licht eens toe welk probleem je ondervindt bij een PDF. ( ik ken geen verband tussen .unlink en PDF).

Ik vermoed bij deze code geen:

Code:
Sub M_snb()
    Application.ScreenUpdating = 0
    
    For Each it In StoryRanges
        it.Fields.Update
    Next

    ActiveWindow.View.ShowFieldCodes = 0
End Sub

Voor het ontkoppelen van alleen DOCVariables:

Code:
    For Each it In ThisDocument.Content.Fields
      If it.Type = 64 Then it.Unlink
    Next
 
Laatst bewerkt:
Bij deze een zeer eenvoudig voorbeeldje van wat ik bedoel. Op mijn manier worden alle DocVariabelen gewist, maar ook de hyperlink in het document. Dat laatste wil ik dus niet. Als ik de methode van snb toepas(die ik niet begrijp en die onderin module 1 staat) wordt er, voor zo ver na te gaan, niets gewist.

Ik heb ontdekt dat als de velden geüpdatet zijn en er vervolgens een pfd van wordt gedraaid er heel soms in de pdf op de plek van een documentvariabele 'Fout! De documentvariabele ontbreekt' komt te staan.' terwijl het zeker juist staat in het Word-document. Heel vervelend, zeker als je daar door een klant op wordt gewezen. Vandaar besloten om die variabelen na het updaten van de velden helemaal te wissen.

Het bijgevoegde bestandje is als sjabloon bedoeld, maar dat kon niet worden geüpload. Ik heb er dan maar een .docm-bestand van gemaakt. Voor de goede werking de extensie dus veranderen in .dotm.

Hartelijk dank voor het meedenken snb en OctaFish
 

Bijlagen

  • Standaardbrief - test snb.docm
    62,7 KB · Weergaven: 37
Voor de goede werking de extensie dus veranderen in .dotm.
Dat werkt niet, tenzij je het document ook daadwerkelijk hebt benoemd. Maar ik kan 'm dan niet openen. Als ik 'm met de huidige naam open, gaat het wél goed, maar dan is het dus geen sjabloon. En zie ik gelijk al fouten in je document die verwijzen naar ontbrekende DocVariables. Wat dan weer klopt met jouw bevinding als je hem omzet naar PDF. Het is niet genoeg om op deze manier ("{ DOCVARIABLE varTextBox1 \* CHARFORMAT }") naar een variabele te verwijzen, hij moet eerst ook zijn toegevoegd aan de collectie binnen het document. En vermoedelijk heb je dat nog niet gedaan bij allemaal. Ik zie dat althans ook niet terug in je macro. Een DocVariable wil je uiteraard gevuld hebben (waarom zou je 'm anders in je document zetten?) en dat doe ik dus doorgaans vanuit een formulier. Dat formulier start je dan automatisch op vanuit de sjabloon bij het aanmaken van een nieuw document, en dat zorgt er dus voor dat a) de gegevens worden ingevuld door de gebruiker, b) de variabelen worden aangemaakt en c) de variabelen in het document worden gevuld. Mits ze uiteraard dan in het document zijn geplaatst.

Bij het ópenen van het document (wat dan geen sjabloon meer is) zou je dan het formulier weer kunnen openen met de ingevulde DocVariables zodat de gebruiker de velden eventueel kan aanpassen. Dus bij de sjabloon start je het formulier bij een nieuw document (wat je ook meestal doet met een sjabloon), en bij het document start je het formulier bij het openen ervan. Ook dat is een standaard handeling bij documenten.
De vraag, mocht die zijn weggeslipt, is dus: is jouw bijlage nu een document of een sjabloon? Wil je de sjabloon uploaden, maak er dan een zipje van. Dat gaat meestal wel goed.
 
Je weet toch wel dat je aan een Docvariable veld altijd een waarde moet toekennen ?
Activedocument.variables("snb")="" is dus altijd fout en levert de foutmelding na .update.
Activedocument.variables("snb")=" " is goed.

Controleer je document dus vóór je er een PDF van maakt.
In die PDF zit het probleem juist niet.
 
Laatst bewerkt:
Bij deze het juiste bestand in zip-formaat; hier had ik uiteraard eerst even aan kunnen denken.

Voor de duidelijkheid: dit is een zeer eenvoudig (aangepast) voorbeeldje dat al meerdere keren hier is gepasseerd, maar dat niettemin 'mijn probleem' illustreert.

Wat mijn gebruikers doen is het sjabloon starten en vullen dan een uitgebreid paneel (userform) zoals in het voorbeeld. Als ze klaar zijn wordt de ingevoerde data middels variabelen in de brief gedumpt en moeten de de codes van DocVariabelen (ik druk me waarschijnlijk niet helemaal juist uit) worden gewist en kan men het document verder handmatig bewerken/aanvullen en vervolgens naar de administratie sturen voor verzending.

En ja, ik weet dat er in dit voorbeeldje nog Docvaiabelen in staan die nu niet gebruikt worden en daarom een foutmelding geven. In de gebruikte sjablonen is daar geen sprake van; alles werkt perfect en naar grote tevredenheid van de gebruikers. Het is nu nog finetunen, o.a. door op zoek te gaan naar hoe niet alle soorten links worden verwijderd, zoals naar een website en e-mailadres.

Wat betreft pdf: dit zorgt bij mij, los van variabelen, wel vaker voor problemen. Wat ik me vooral herinner is het laatste woord van een alinea naar een nieuwe regel verplaatsen. Dit kan soms de opmaak van een rapport plaatselijk overhoop halen.

Ik kan overigens niet helemaal uitsluiten dat ons DMS ook een rol speelt (speelde) in fouten in onze brieven na omzetting in een pdf. Maar aangezien ik daar geen invloed op heb, probeer ik de aan te leveren en verwerken documenten/brieven dus zo eenvoudig mogelijk te maken.
 

Bijlagen

  • Standaardbrief - test snb.zip
    58 KB · Weergaven: 28
Begin nu eerst eens in het sjabloon alle variabelen een waarde te geven: een spatie.

Gebruik mijn macro in #3 om alle velden te aktualiseren.

Gebruik deze code ook in het userform.

gebruik daar ook:

activedocument.variables("plaats")=iif(combobox1=""," ",combobox1)
analoog voor alle andere variabelen.
 
Laatst bewerkt:
Jongens ik laat het hier voorlopig maar even bij:


  • - ik snap de aangedragen code niet, dus loop vast;
    - ik weet niet hoe/waar ik alle Docvariabelen kan vinden (die ik nu dus deels gebruik enkel ter illustratie van een probleem/uitdaging);
    - naar mijn gevoel drijven we van de essentie van de vraag af: ik wil enkel mijn aangemaakt document 'platslaan' zonder hyperlinks te wissen; in mijn situatie gebeurt dat laatste helaas ook (zie mijn code eerste post)
    - na voortschrijdend inzicht zal zich tzt wel een oplossing aandienen.


Toch hartelijk dank voor alle moeite. Ik heb nog wat studiewerk voor de boeg.
 
De makro van snb in #3 blijkt uiteindelijk precies te zijn wat ik zoek. Ik had niet goed gekeken: het pakt de Docvariabelen in het document aan, maar niet in de header waar ik had zitten kijken (of beter blindstaren). Door nu het een ander te combineren heb ik toch bereikt wat ik beoogde:

Code:
Sub Unlink()

    Dim oSection As Section
    Dim oHeader As HeaderFooter

    Application.ScreenUpdating = False

    For Each oSection In ActiveDocument.Sections
        For Each oHeader In oSection.Headers
            If oHeader.Exists Then
                For Each it In oHeader.Range.Fields
                    If it.Type = 64 Then it.Unlink
                Next
            End If
        Next oHeader
    Next oSection

    For Each it In ThisDocument.Content.Fields
      If it.Type = 64 Then it.Unlink
    Next

End Sub

Uitgezonderd de code van snb (laatste 3 regels code) zal het een en ander wellicht sneller kunnen, maar het werkt.

DANK!!!
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan