Doorlopen alle velden in een word document

Status
Niet open voor verdere reacties.

linkav

Gebruiker
Lid geworden
13 jun 2007
Berichten
465
Ik heb een word document met meerdere velden (checkboxen / combofiles / tekstvelden / datums).

Hoe kan ik in vba alle velden van een word document doorlopen om zo juiste namen en eventueel het type van veld te krijgen.

Dank voor jullie hulp!
 
In het geval van formfields kun je zoiets doen denk ik:

Code:
For Each aField In ActiveDocument.FormFields
 
Hallo Wampier,

Bedankt voor je reactie.

Hoe kan ik dan de namen van de velden en de inhoud van de velden controleren?
 
Dat zul je in een aantal stadia moeten doen, daar de "inhoud" natuurlijk afhankelijk is van het type:

Code:
For Each aField In ActiveDocument.FormFields
   msgbox "ik ben: " & aField.name &"  type:  " & aField.type

waar type 71 een checkbox is en type 70 een textbox.

Als je alle types weet kun je via een "CASE" methode de juiste waarde uitlezen
 
Wampier,

ik heb het volgende als test opgezet
Code:
Sub sample()
     For Each aField In ActiveDocument.FormFields
          MsgBox "ik ben: " & aField.Name & "  type:  " & aField.Type
     Next
End sub
Als ik dit run (F5) wordt er geen enkel veld getoond met 'Msgbox', dus hi komt niet in de lus. Wat kan de oorzaak hiervan zijn?
 
Wat geeft:
Code:
msgbox ActiveDocument.FormFields.Count
?

Is het wel het actieve document? als dat juist is, wat geeft eventueel:

Code:
msgbox ActiveDocument.Fields.Count

Zijn de velden ook zeker weten niet activeX ? want dat gebruikt weer een compleet ander mechanisme. Anders misschien even een simpel bestandje waar we even naar kunnen kijken?
 
Beste Wampier,

Code:
msgbox ActiveDocument.Fields.Count
geeft 82
en
Code:
msgbox ActiveDocument.FormFields.Count
geeft 0
 
Ok, brainwave, zijn het misschien mailmerge fields?

msgbox ActiveDocument.MailMergeFields.Count

probleem met gewone "fields" is namelijk dat deze geen specifieke naam hebben, maar alleen een type. In dat geval moet je eerst door de hele collectie, sorteren op type en alsnog lager in de objecten duiken. Maar dit is een typisch iets waar een voorbeeldbestand dat onmiddellijk had uitgesloten ;)
 
Bij dit commando krijg ik de foutmelding: Object doesn't support this property or method

Ik wou je een voorbeeldje toesturen maar kan geen bestand uploaden van op t werk.
 
Uit je initiële vraag blijkt al overduidelijk dat het niet om samenvoegvelden gaat, want die bestaan niet in de vorm van checkboxen en comboboxen. Ook maken ze geen verschil tussen datumvelden en tekstvelden, al kun je dat met Format instellingen uiteraard wel regelen. Dus: mijn gok is dat het om ContentControls gaat. Maar dat is een stuk makkelijker te controleren op basis van een voorbeeldje... Dus toch maar eens proberen, zou ik zeggen. Desnoods via een fileshare als wikisend.com of zoiets, als je dat wél mag doen.
 
Beste Octafish,

Heb jij toevallig al tijd gehad om naar mijn voorbeeldje te kijken?
 
Je gebruikt inderdaad ContentControls. Die zijn een beetje lastig te bewerken vrees ik; zo hebben ze geen Naam property, hoe vreemd dat ook moge klinken. Wel hebben ze een 'Title' die je kan uitlezen. Draai deze macro maar eens, dan krijg je een beetje een idee.

Code:
Sub CheckCC()
Dim cc As ContentControl

    For Each cc In ActiveDocument.ContentControls
        MsgBox cc.Title & vbLf & cc.PlaceholderText & vbLf & cc.Type
    Next cc
End Sub
 
Beste Octafish,

Bedankt voor je macro. Hier kom ik inderdaad al verder.

Merk wel dat ik bij het runnen van de macro geen enkele 'checkbox' tegenkom. Kan dit kloppen?
 
Dat klopt, want dat zijn geen CC's maar ActiveX controls. En daarnaast heb je ook nog een paar gewone velden gebruikt. Kies voor één soort, dan ben je een stuk beter af. Nog beter: maak een formulier, zet daar alle velden op en vul na het invullen de waarden in het document in.
Code:
Sub CheckCC()
Dim cc As ContentControl
Dim fld As Field
Dim shp As InlineShape

    For Each fld In ActiveDocument.Fields
        MsgBox fld.Type & vbLf & fld.Result & vbLf & fld.Index
    Next fld
    
    For Each shp In ActiveDocument.InlineShapes
        On Error Resume Next
        If TypeName(shp.OLEFormat.Object) = "CheckBox" Then
            MsgBox shp.OLEFormat.Object.Name & vbLf & shp.OLEFormat.Object.Caption & vbLf & shp.OLEFormat.Object.Value
        End If
    Next
    
    For Each cc In ActiveDocument.ContentControls
        MsgBox cc.Title & vbLf & cc.PlaceholderText & vbLf & cc.Type
    Next cc
End Sub
Dit laat al weer wat meer zien :).
 
Beste Octafish,

Bedankt voor bovenstaande code.

Ik heb nog een vraagje:
Met
Code:
For Each fld In ActiveDocument.Fields
        MsgBox fld.Type & vbLf & fld.Result & vbLf & fld.Index
    Next fld
en
Code:
    For Each cc In ActiveDocument.ContentControls
        MsgBox cc.Title & vbLf & cc.PlaceholderText & vbLf & cc.Type
    Next cc
worden de velden doorlopen.
Weet jij in welke volgorde? Eerst van links naar rechts en dan van boven naar onder? Of is dit echt niet te zeggen?
 
Dat is niet te zeggen, althans: niet door mij. Ik zie er weinig logica in terug. Wellicht de volgorde waarin je ze in het formulier hebt gezet.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan