Sinds een paar maanden ben ik in Visual Basic gedoken. Ik loop heel vaak tegen dingen aan die een repeterend karakter hebben of zich om andere redenen bij uitstek lenen om in een programma te tackelen. Vroeger programmeerde ik in Basic en nu probeer ik de draad na vele jaren weer op te pakken.
Ik heb een waslijst aan eBooks die deze taal beschrijven, en ben inmiddels redelijk gevorderd in een daarvan. Langzamerhand begin ik het te begrijpen. Dit handelt echter over Visual Basic 2005 en .NET, mijn vraag spitst zich toe op de simpelere variant van Visual Basic: VBA in Word.
Voor werk vul ik heel veel documenten in op een standaard wijze. Om deze invuloefening simpeler te maken, ben ik met Userforms aan de gang gegaan. Daar zijn prima tutorials voor te vinden, en met wat passen en meten kom ik er prima uit.
Het probleem waar ik tegenaan loop is een kwestie van nette code schrijven.
Inleiding:
Ik heb nu Word documenten met tekst waar ik met een heleboel bookmarks werk. De bookmarks zet ik er allemaal handmatig in. Bij de bookmarks wordt middels een VBA script een woord of tekstje ingevuld die ik als gebruiker invul in een userform. Door op de OK knop te drukken worden de velden uit het userform bij de desbetreffende bookmarks ingevuld.
In het invulveld staat of wel een tekst, of er staat niets in. Zoals uit onderstaande code mag blijken wordt de bookmark met "[ ]" ingevuld als het invulveld leeg is, en zo niet, dan met de tekst die in het invulveld in het userform staat.
Het lijkt mij zo ongeveer het makkelijkste wat er is in VBA
casus
Bij een aantal documenten zijn er een flink aantal bookmarks in gebruik evenals de daarbij behorende invulvelden in een userform. Dat houdt in dat ik dezelfde code (die werkt
) meer dan 30 keer zit te copy/pasten in mijn script om alle bookmarks ingevuld te krijgen. Het lijkt mij dat dit efficienter kan.
In feite zit mijn script voor iedere bookmark telkens:
• de invoer in het invulveld in het userform te checken aan de hand waarvan het de string "[ ]" of de string als ingevoerd in het invulveld krijgt; en
• deze string in de desbetreffende bookmark in te vullen
Ik ben nu al enige tijd bezig om dit simpeler te krijgen, zodat bij grotere documenten met veel bookmarks de code overzichtelijker kan blijven. Een aantal dagen google leren mij dat er eigenlijk maar weinig te vinden is over 'hard core' VBA (zeker voor Word) en met de gegeven voorbeelden voor Visual Basic voor een functie kan ik in VBA niet terecht. De syntax is net iets anders, heb ik het idee.
Mijn gedachte is om voor een bepaald invulveld de string in te voeren in een apart te maken functie die kijkt of de string leeg is of gevuld (actiepunt 1 van mijn script). Het daarna ook invullen in de bookmark in het Word document zelf lijkt mij niet iets voor een functie, ik begrijp dat dit niet kan in Visual Basic.
Een en ander probeer ik van de grond te krijgen met een heel simpel voorbeeld.

Voorbeeld userform en bijbehorende tekst met bookmarks (waar tekst ingevuld gaat worden)
De bookmarks "Naam" en "Zetel" worden prima ingevuld via het userform. De bookmark "Adres" probeer ik in te vullen via een functie die ik telkens zou kunnen hergebruiken voor dit klusje.
probleem
Als ik met F8 door de code hop, stap voor stap, zie ik dat ik wel door de Function heen wandel en dat 'Blockcontents' de waarde krijgt uit mijn invulveld 'txtAdres', doch dat de laatste stap niet van de grond komt. Ik krijg de waarde van mijn invulveld 'txtAdres' in de variabele 'Blockcontents' maar het invullen van de bookmark 'Adres' met deze string werkt uiteindelijk niet.
Het moet vast simpel zijn om dit soort reperteerklusjes in een aparte functie te zetten, doch ik kan maar bitter weinig documentatie vinden op dit punt. Wel veel voorbeeldcode voor VBA voor diverse leuke dingen, doch ik zie nergens een functie voor dit soort reperteerwerk waar ik de kunst vanaf kan kijken, noch literatuur waar dit kunstje duidelijk uit de doeken wordt gedaan. Ik kom er simpelweg niet uit
Ik heb een waslijst aan eBooks die deze taal beschrijven, en ben inmiddels redelijk gevorderd in een daarvan. Langzamerhand begin ik het te begrijpen. Dit handelt echter over Visual Basic 2005 en .NET, mijn vraag spitst zich toe op de simpelere variant van Visual Basic: VBA in Word.
Voor werk vul ik heel veel documenten in op een standaard wijze. Om deze invuloefening simpeler te maken, ben ik met Userforms aan de gang gegaan. Daar zijn prima tutorials voor te vinden, en met wat passen en meten kom ik er prima uit.
Het probleem waar ik tegenaan loop is een kwestie van nette code schrijven.
Inleiding:
Ik heb nu Word documenten met tekst waar ik met een heleboel bookmarks werk. De bookmarks zet ik er allemaal handmatig in. Bij de bookmarks wordt middels een VBA script een woord of tekstje ingevuld die ik als gebruiker invul in een userform. Door op de OK knop te drukken worden de velden uit het userform bij de desbetreffende bookmarks ingevuld.
In het invulveld staat of wel een tekst, of er staat niets in. Zoals uit onderstaande code mag blijken wordt de bookmark met "[ ]" ingevuld als het invulveld leeg is, en zo niet, dan met de tekst die in het invulveld in het userform staat.
Het lijkt mij zo ongeveer het makkelijkste wat er is in VBA
casus
Bij een aantal documenten zijn er een flink aantal bookmarks in gebruik evenals de daarbij behorende invulvelden in een userform. Dat houdt in dat ik dezelfde code (die werkt
In feite zit mijn script voor iedere bookmark telkens:
• de invoer in het invulveld in het userform te checken aan de hand waarvan het de string "[ ]" of de string als ingevoerd in het invulveld krijgt; en
• deze string in de desbetreffende bookmark in te vullen
Ik ben nu al enige tijd bezig om dit simpeler te krijgen, zodat bij grotere documenten met veel bookmarks de code overzichtelijker kan blijven. Een aantal dagen google leren mij dat er eigenlijk maar weinig te vinden is over 'hard core' VBA (zeker voor Word) en met de gegeven voorbeelden voor Visual Basic voor een functie kan ik in VBA niet terecht. De syntax is net iets anders, heb ik het idee.
Mijn gedachte is om voor een bepaald invulveld de string in te voeren in een apart te maken functie die kijkt of de string leeg is of gevuld (actiepunt 1 van mijn script). Het daarna ook invullen in de bookmark in het Word document zelf lijkt mij niet iets voor een functie, ik begrijp dat dit niet kan in Visual Basic.
Een en ander probeer ik van de grond te krijgen met een heel simpel voorbeeld.

Voorbeeld userform en bijbehorende tekst met bookmarks (waar tekst ingevuld gaat worden)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| Private Sub btnCancel_Click()
Unload UserForm1
End Sub
Private Sub btnOk_Click()
If txtNaam.text = "" Then
ActiveDocument.Bookmarks("Naam").Range.text = "[ ]"
Else
ActiveDocument.Bookmarks("Naam").Range.text = txtNaam.text
End If
If txtZetel.text = "" Then
ActiveDocument.Bookmarks("Zetel").Range.text = "[ ]"
Else
ActiveDocument.Bookmarks("Zetel").Range.text = txtZetel.text
End If
TextInputCheck (txtAdres.text)
ActiveDocument.Bookmarks("Adres").Range.text = Blockcontents
Unload UserForm1
End Sub
Public Function TextInputCheck(ByVal textblock As String)
Dim Blockcontents As String
If textblock = "" Then
Blockcontents = "[ ]"
Else
Blockcontents = textblock
End If
End Function
Private Sub UserForm_Click()
End Sub |
De bookmarks "Naam" en "Zetel" worden prima ingevuld via het userform. De bookmark "Adres" probeer ik in te vullen via een functie die ik telkens zou kunnen hergebruiken voor dit klusje.
probleem
Als ik met F8 door de code hop, stap voor stap, zie ik dat ik wel door de Function heen wandel en dat 'Blockcontents' de waarde krijgt uit mijn invulveld 'txtAdres', doch dat de laatste stap niet van de grond komt. Ik krijg de waarde van mijn invulveld 'txtAdres' in de variabele 'Blockcontents' maar het invullen van de bookmark 'Adres' met deze string werkt uiteindelijk niet.
Het moet vast simpel zijn om dit soort reperteerklusjes in een aparte functie te zetten, doch ik kan maar bitter weinig documentatie vinden op dit punt. Wel veel voorbeeldcode voor VBA voor diverse leuke dingen, doch ik zie nergens een functie voor dit soort reperteerwerk waar ik de kunst vanaf kan kijken, noch literatuur waar dit kunstje duidelijk uit de doeken wordt gedaan. Ik kom er simpelweg niet uit
