Avatar billede tma Juniormester
18. august 2017 - 12:03 Der er 3 kommentarer og
1 løsning

Hvordan refererer jeg til kontrolelementer i Word via VBA

Jeg har følgende kodestump som kan vise mig indholdet af de kontrolelementer mit worddokument består af:
Private Sub Test()
    Dim i As Integer
    For i = 1 To ThisDocument.ContentControls.Count
        Debug.Print ThisDocument.ContentControls(i).Range.Text
    Next i
End Sub

Det virker fint nok, men jeg har brug for at kunne referere konkret til et navngivet element, fx noget i retning af:
ThisDocument.ContentControls("Telefonnr").Range.Text
Men det virker ikke. Når jeg opretter feltet i Word, kan jeg angive Titel eller Kode. Titel vises blot, så det burde være feltet Kode, men kan ikke få det til at virke.
Avatar billede Lene Fredborg Ekspert
18. august 2017 - 13:38 #1
Se Greg Maxeys svar i denne tråd:
http://www.vbaexpress.com/forum/showthread.php?39873-Content-Control-and-VBA

VIGTIGT: I din kode har du brugt ”ThisDocument.” – er du sikker på, at det er det, du har brug for?

ThisDocument refererer til, hvad der findes i det dokument, som indeholder selve VBA-koden. Hvis der f.eks. er en skabelon (template), er det dermed kontrolelementer i selve skabelonen (som evt. kan være installeret som global skabelon), du forsøger at gøre noget med. Det forekommer umiddelbart mere sandsynligt, at det er det aktive dokument (ActiveDocument), du har brug for at referere til.
Avatar billede tma Juniormester
18. august 2017 - 15:01 #2
Det var alene for ikke at komplicere mit eksempel til web. Den del har jeg styr på. Har netop fundet en løsning (her læser jeg fra en anden fil, hvilket er meningen - som du også antyder)):
Dim CC
For Each CC In WrdDoc.ContentControls
    If CC.Tag = "Telefonnr" Then
        MsgBox "Telefonnr er " & CC.Range.Text
    End If
Next

Man bruger feltet egenskaben TAG til at finde feltet
Avatar billede Lene Fredborg Ekspert
18. august 2017 - 15:46 #3
Du kan godt gøre, som du viser i #2, men det er mindre effektivt end den kode, jeg linkede til. Hvis du bruger fremgangsmåden i det link, jeg sendte, behøver du ikke at tjekke alle ContentControls for at finde den, du vil bruge, når du i forvejen kender Title eller Tag.

Hvis Title er ”Telefonnr”, og hvis kun én ContentControl har den titel, vil koden
WrdDoc.SelectContentControlsByTitle("Telefonnr").Item(1).Range.Text
returnere teksten fra den pågældende ContentControl i dokumentet WrdDoc
Hvis der er flere med samme titel, vil det være den første, der returneres.

Som vist i den tråd, jeg linkede til, kan du tilsvarende brug Tag, når du kender tagget:

Hvis Tag er ”Telefonnr”, og hvis kun én ContentControl har det tag, vil koden
WrdDoc.SelectContentControlsByTag("Telefonnr").Item(1).Range.Text
returnere teksten fra den pågældende ContentControl
Hvis der er flere med samme tag, vil det være den første, der returneres.
Avatar billede tma Juniormester
21. august 2017 - 09:43 #4
Du har helt ret - må erkende at jeg overså linket i første omgang.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester