Informaticasite van het Lauwers College te Buitenpost                 © R.J. van der Beek
 

Cursus Word

Hoofdstuk 10. Macro's, VBA

  10.1. Een macro maken

Als je een macro maakt dan neem je op welke toetsaanslagen er worden gebruikt, en als je later die macro uitvoert worden precies de toetsaanslagen uitgevoerd die waren opgenomen.
Stel dat je regelmatig een woord hebt, waarvan je de letters rood wilt afdrukken, en vetgedrukt, met een grijze achtergrond.
Dan kun je dat elke keer met een aantal handelingen doen, maar je kunt er ook een macro voor maken en die later gebruiken.

Dat doe je op de volgende manier:
  • Zet allereerst de cursor op de eerste letter van het woord dat je die opmaak wilt geven.
  • Klik in het menu op Extra → Macro → Nieuwe macro opnemen
  • Dan verschijnt er een venster, waarin je de naam voor de macro moet vastleggen. Noem de macro bijvoorbeeld rood_op_grijs.



  • Als je op het toetsenbord klikt dan kun je aangeven met welke toets(en) je de macro op wilt roepen.
    Klik dus op het toetsenbord, en druk dan bijvoorbeeld op Alt/R (d.w.z. Alt en R tegelijk indrukken). Klik dan op Toewijzen en dan op Sluiten



    Dan kun je later de macro laten uitvoeren door op Alt/R te drukken.
  • Vanaf nu wordt alles wat je met het toetsenbord of de muis doet opgenomen, dat zie je aan
  • Druk op Ctrl/→ terwijl je de shift-toets houdt ingedrukt. Dan wordt het woord geselecteerd (zonder de muis te gebruiken).
  • Klik dan op B (vet) in de werkbalk.
  • Kies tekstkleur rood (A op de werkbalk, klik op het pijltje ernaast, en kies rood uit)
  • Kies verder nog een grijze achtergrondkleur (klik op het pijltje naast de markeerstift, en kies voor grijs).
  • Daarmee is de opmaak klaar, klik dan op Opname stoppen, het linker blokje van
Als je nu een ander woord diezelfde opmaak wilt geven dan klik je op de eerste letter van het woord, en je drukt op Alt/R.

  10.2. Een macro uitvoeren en/of bewerken

Als je de macro uit de vorige paragraaf uit wilt voeren dan kun je Alt/R indrukken. Maar je kunt de macro ook op een nadere manier uitvoeren:
Klik in het menu op Extra → Macro → Macro's
Dan verschijnt er een venster, waarin alle aanwezige macro's worden getoond. Klik op de macro rood_op_grijs, en klik op Uitvoeren



Als je op Bewerken klikt, in plaats van op Uitvoeren, dan krijg je het volgende programma te zien:
(onder Sub rood_op_grijs() staan nog een paar groen-gedrukte regels, voorafgegaan door een '-teken. Dat zijn zogenaamde commentaar-regels. Ze hebben niets te maken met de werking van het programma, ze staan er alleen bij ter verduidelijking)


Sub rood_op_grijs() Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend Selection.Font.Bold = wdToggle Selection.Font.Color = wdColorRed Selection.Range.HighlightColorIndex = wdGray25 End Sub

Als er een macro wordt opgenomen in Word maakt Word automatisch een VBA-programma, waarin staat wat er moet gebeuren.
En dat kun je eventueel zelf aanpassen.
Verander Count:=1 maar eens in Count:=2, sluit het VBA-venster af, klik op de beginletter van een woord, en druk op Alt/R. Dan krijgen twee woorden de vastgelegde opmaak, in plaats van één woord!

  10.3. Visual Basic for Applications (VBA)

Je komt op de volgende manier in de Visual Basic-programmeeromgeving terecht:
Klik in het menu op Extra → Macro → Visual Basic Editor
De Visual Basic programmeeromgeving is een volledig zelfstandige toepassing die in een eigen venster draait.
Een paar syntaxisregels:
  • Eigenschappen en ingebouwde procedures worden van elkaar gescheiden door punten.
    Voorbeeld:
    Selection.Font.Size = 20

    Deze opdracht heeft tot gevolg dat het geselecteerde gedeelte van lettergrootte 20 wordt voorzien.

  • Om aan een eigenschap een waarde toe te kennen gebruik je een gelijkheidsteken =. Zie in het voorbeeld hierboven, Size krijgt de waarde 20

  • Gebruik een dubbele punt + gelijkheidsteken := om aan een ingebouwde procedure (methode) een argument toe te voegen. Heb je bij een procedure meerdere argumenten, dan gebruik je komma's om die te scheiden.
    Voorbeeld:
    Documents.Open FileName:="C:\worddocumenten\test.doc", AddToRecentFiles := False

    Deze opdracht heeft tot gevolg dat het document test.doc wordt geopend, maar dat het niet wordt toegevoegd aan de lijst met recent geopende bestanden (die je onderaan in het venster ziet als je in het menu klikt op Bestand).
    In dit voorbeeld zijn Filename en AddToRecentFiles argumenten bij de methode Open.

  • Bij lange Visual Basic instructies die over verschillende regels lopen, gebruik je een spatie + onderstrepingsteken ( _) om aan te geven dat de instructie verder gaat op de volgende regel.

  • Bij het intypen van Visual Basic instructies krijg je gelukkig hulp:
    Als je hulp bij een bepaalde instructie wilt zet je de cursor in die instructie en druk je op F1.
    Verder is het zo dat, zodra je het scheidingsteken tussen instructies intypt, er meestal een keuzelijst verschijnt met eigenschappen en methodes waaruit je kunt kiezen.

  10.4. Voor- en achternamen omdraaien

Stel dat je een lijstje met namen in Word hebt, waarbij telkens eerst de voornaam staat, en daarachter de achternaam.



En stel nu dat je om de één of andere reden de voornaam graag achter de achternaam wilt hebben, gescheiden door een komma.
Dan kun je dat handig met een macro doen.

Dat doe je op de volgende manier:
  • Zet allereerst de cursor op de eerste letter van de eerste naam.
  • Klik in het menu op Extra → Macro → Nieuwe macro opnemen Geef de macro bijvoorbeeld de naam omwisselen. En klik op OK.
  • Vanaf dat moment wordt alles opgenomen.
  • Druk op Ctrl/→ terwijl je de shift-toets houdt ingedrukt. Dan wordt het woord geselecteerd, dus de voornaam.
  • Druk op Ctrl/X , dan wordt die voornaam verwijderd.
  • Druk op End, dan springt de cursor naar het eind van de regel, dus naar de plaats achter de achternaam.
  • Typ nu een komma en een spatie, die verschijnen dan achter de achternaam.
  • Druk op Ctrl/V , dan wordt de voornaam, die eerst verwijderd was maar nog in het geheugen zit, achter de achternaam geplakt.
  • Druk op Ctrl/→ , dan springt de cursor naar het volgende woord, dus naar de eerste letter van de voornaam op de volgende regel.
    En daarna kan het proces opnieuw beginnen, want die voornaam moet ook weer achter de achternaam worden geplakt, maar dat komt later.
  • Daarmee is de macro klaar, klik op Opname stoppen.
Als je wilt het VBA-programma wilt zien, dat automatisch gemaakt is toen de macro is opgenomen, dan klik je in het menu op Extra → Macro → Macro's
Klik op de macro omwisselen, en klik op Bewerken, dan krijg je het volgende programma te zien:


Sub omwisselen() (1) Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend (2) Selection.Cut (3) Selection.EndKey Unit:=wdLine (4) Selection.TypeText Text:=" ," (5) Selection.Paste (6) Selection.MoveRight Unit:=wdWord, Count:=1 End Sub

Deze macro heeft tot gevolg dat de voor- en achternaam op één regel worden omgewisseld.

Regel (1) heeft tot gevolg dat het woord (en de spatie die erachter staat), waarop de cursor staat, wordt geselecteerd.
Door de code op regel (2) wordt het geselecteerde woord verwijderd.
Regel (3) is de opdracht om de cursor naar het einde van de regel te verplaatsen.
Regel (4) zorgt ervoor dat er een spatie en een komma worden toegevoegd.
Regel (5) heeft tot gevolg dat het woord, dat eerst verwijderd was, geplakt wordt op de plaats van de cursor.
En door de code op regel (6) springt de cursor naar de eerste letter van het volgende woord, en dat staat op de volgende regel.

Wil je dat alle voor- en achternamen worden omgewisseld, dan moet je er voor zorgen dat het programma, dat nu is vastgelegd, steeds herhaald wordt tot het einde van het Word-document is bereikt.
Dat doe je door de volgende regel aan het begin toe te voegen:

While Selection.Type = wdSelectionIP And Selection.End <> ActiveDocument.Content.End - 1

en achteraan moet je nog een regel toevoegen waarop het volgende staat:

wend

Het totale programma ziet er dan als volgt uit:


Sub omwisselen() While Selection.Type = wdSelectionIP And Selection.End <> _ActiveDocument.Content.End-1 Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend Selection.Cut Selection.EndKey Unit:=wdLine Selection.TypeText Text:=" ," Selection.Paste Selection.MoveRight Unit:=wdWord, Count:=1 Wend End Sub

En als je deze macro dan laat uitvoeren, dan worden alle voor- en achternamen omgewisseld, zelfs al zijn het er honderden.



En nu het omgekeerde
Stel je voor dat je het laatste lijstje hebt, dus eerst de achternaam, dan een komma, en dan de voornaam.
En je wilt de voornamen naar voren halen.
Dan kun je daar niet dezelfde macro voor gebruiken als hierboven, want de achternaam bestaat soms uit meer dan één woord. De achternaam kan dus niet geselecteerd worden door op Ctrl/→ te klikken, want dan wordt er maar één woord geselecteerd.
Je kunt het nu op de volgende manier doen:
  • Zet allereerst de cursor op de eerste letter van de eerste naam.
  • Klik in het menu op Extra → Macro → Nieuwe macro opnemen Geef de macro een naam en klik op OK.
  • Klik in het menu op Bewerken → Zoeken, typ in het zoek-venster een komma, en klik op Volgende zoeken. Dan springt de cursor naar de eerstvolgende komma, en die staat vlak achter de achternaam. Maar de achternaam wordt niet geselecteerd, daar moeten we nu nog voor zorgen.
  • Druk op Home, terwijl je de shifttoets houdt ingedrukt. Dan springt de cursor naar het begin van de regel, en alles ertussen wordt geselecteerd, dus de achternaam.
  • Druk op Ctrl/X , dan wordt die achternaam (maar niet de komma) verwijderd, en op het klembord gezet.
  • Druk twee keer op de Delete-toets ,dan wordt de komma en de spatie voor de voornaam verwijderd.
  • Druk op End, dan springt de cursor naar het eind van de regel, dus naar de plaats achter de voornaam.
  • Typ nu een spatie, die verschijnt dan achter de voornaam.
  • Druk op Ctrl/V , dan wordt de achternaam, die eerst verwijderd was, achter de voornaam geplakt.
  • Druk op Ctrl/→ , dan springt de cursor naar het volgende woord, dus naar de eerste letter van de voornaam op de volgende regel.
  • Daarmee is de macro klaar, klik op Opname stoppen.
Dan wordt de achternaam achter de voornaam geplakt bij één regel.
Wil je dat macro alle namen bijlangs gaat, zorg er dan voor dat het programmagedeelte herhaald wordt.
Het totale programma ziet er dan als volgt uit:


Sub voornaamvooraan() While Selection.Type = wdSelectionIP And Selection.End <> _ActiveDocument.Content.End-1 Selection.Find.ClearFormatting With Selection.Find .Text = "," .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Selection.HomeKey Unit:=wdLine, Extend:=wdExtend Selection.Cut Selection.Delete Unit:=wdCharacter, Count:=1 Selection.Delete Unit:=wdCharacter, Count:=1 Selection.EndKey Unit:=wdLine Selection.Paste Selection.MoveRight Unit:=wdWord, Count:=1 Wend End Sub

  10.5. Nog een macro-voorbeeld: een breuk maken

Stel dat je regelmatig breuken typt, en je wilt graag dat die breuken zo worden afgedrukt dat de teller iets hoger staat dan de noemer, dan kun je dat handig met een macro doen.
Stel dat je de volgende regel hebt:



En je wilt die regel zo veranderen dat hij er zo uitziet:



Dan maak je daar een macro voor op de volgende manier:
  • Zet allereerst de cursor ergens in de breuk 13/17, bijvoorbeeld op de laatse 7.
  • Klik in het menu op Extra → Macro → Nieuwe macro opnemen Geef de macro bijvoorbeeld de naam breukmaken. En klik op OK.
  • Vanaf dat moment wordt alles opgenomen.
  • Klik in het menu op Bewerken → Zoeken
    Vul achter Zoeken naar een spatie in, en kies bij Zoekrichting voor omhoog
    (als Zoekrichting er niet bij staat klik je eerst op Meer)
    Klik dan op Volgende zoeken. Dan springt de cursor naar de spatie voor de breuk. Klik het zoek-venster dan weg.
  • Druk dan op Ctrl/→ terwijl je de shift-toets houdt ingedrukt. Dan wordt het eerstvolgende woord geselecteerd, dus de teller van de breuk.
  • Klik in het menu op Opmaak → Lettertype en zet een vinkje voor Superscript, klik dan op OK. Dan wordt de teller in superscript gezet, dus in kleinere tekens die iets hoger staan.
  • Druk twee keer op , dan springt de cursor over de scheve breukstreep / naar het begin van de noemer.
  • Druk dan op Ctrl/→ terwijl je de shift-toets houdt ingedrukt. Dan wordt het eerstvolgende woord geselecteerd, dus de noemer van de breuk.
  • Klik in het menu op Opmaak → Lettertype en zet een vinkje voor Subscript, klik dan op OK. Dan wordt de noemer in subscript gezet, dus in kleinere tekens die iets lager staan.
  • Druk op , dan springt de cursor naar het volgende teken, en dan is er niets meer geselecteerd.
  • Daarmee is de macro klaar, klik op Opname stoppen.
Als je wilt het VBA-programma wilt zien, dat automatisch gemaakt is toen de macro is opgenomen, dan klik je in het menu op Extra → Macro → Macro's
Klik op de macro breukmaken, en klik op Bewerken, dan krijg je het volgende programma te zien:


Sub breukmaken() Selection.Find.ClearFormatting With Selection.Find .Text = " " .Replacement.Text = "" .Forward = False End With Selection.Find.Execute Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend With Selection.Font .Superscript = True End With Selection.MoveRight Unit:=wdCharacter, Count:=2 Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend With Selection.Font .Subscript = True End With Selection.MoveRight Unit:=wdCharacter, Count:=1 End Sub

Als je nu de cursor ergens in de breuk km/uur zet, en je laat de macro breukmaken uitvoeren, dan wordt km in superscript en uur in subscript gezet.

  10.6. Tekstvakken, labels en buttons met VBA

Stel dat je een groot document hebt waar op zo'n tien plaatsen een bepaalde naam moet worden ingevoerd (steeds dezelfde naam), en op bijv. zes plaatsen een adres (steeds hetzelfde adres).
Als dat document vaak moet worden gebruikt, voor verschillende mensen (bijv. bij een notaris), dan is het handig er voor te zorgen dat het wordt geautomatiseerd.
Dat kan m.b.v. VBA.
  • Je moet er eerst voor zorgen dat de plaatsen, waar de naam moet worden ingevuld, gemarkeerd zijn m.b.v. bladwijzers, je leest in Word 9.9. hoe dat moet.
    We gaan er in het vervolg van uit dat je die bladwijzers naam1, naam2, naam3, enz. genoemd hebt.
    En ook de plaatsen, waar het adres moet worden ingevuld, moeten gemarkeerd zijn m.b.v. bladwijzers.
    We gaan er in het vervolg van uit dat je die bladwijzers adres1, adres2, adres3, enz. genoemd hebt.
  • Klik op Beeld, dan op Werkbalken, en dan op Visual Basic.
  • Klik nog eens op Beeld, dan op Werkbalken, en dan op Werkset Besturingselementen.
    Dan zie je het volgende venster:



  • Nu klik je in de Visual Basic-werkbalk of in de Werkset Besturingselementen op het icoontje Ontwerpmodus , en dan kun je een VBA-programma ontwerpen.

  • Vervolgens klik je in de werkset op de knop Label , en dan kun je een label in het document zetten. Zet die op pagina 1 aan het begin van het document, en laat de tekst van het document op pagina 2 beginnen.
  • Klik dan in de werkset op Eigenschappen , dan kun je de eigenschappen van het label instellen.
  • In het eigenschappenvenster (zie het venster hieronder) vul je bij Caption Naam : in.
  • En bij BackColor kies je een mooi kleurtje uit. Verder kun je het lettertype, de borderstyle, alignment, enz. instellen.



    Klik achter het label, en klik dan in de werkset op de knop Tekstvak , dan wordt er een tekstvak in het document geplaatst achter het label.

  • Klik nog eens in de werkset op de knop Label , en dan kun je een tweede label in het document zetten. Zet die onder het eerste label.
  • In het eigenschappenvenster vul je bij Caption Adres : in.
    En je kunt weer de achtergrondkleur, het lettertype, de borderstyle, alignment, enz. instellen.
  • Klik achter het tweede label, en klik dan in de werkset op de knop Tekstvak , dan wordt er een tweede tekstvak in het document geplaatst achter het label.
  • Klik in het document onder het tweede label, en klik dan in de werkset op de knop Opdrachtknop , en dan wordt er een opdrachtknop (of button) in het document geplaatst.
  • In het eigenschappenvenster vul je bij Caption Zet naam en adres in het document in.
    En je kunt weer de achtergrondkleur, het lettertype, de borderstyle, alignment, enz. instellen.
  • Dan heb je de interface klaar. Die ziet er dan als volgt uit:



  • Maar nu de programmacode nog.
    Daarvoor dubbelklik je op de opdrachtknop, dan verschijnt het programmavenster.
  • Er staat al Private Sub CommandButton1_Click() en een eindje verder staat End Sub
    Op de regels daar tussen moet de programma-code worden geplaatst.
    Daar tik je het volgende in:



    Private Sub CommandButton1_Click() Selection.GoTo What:=wdGoToBookmark, Name:="naam1" Selection.TypeText TextBox1.Text Selection.GoTo What:=wdGoToBookmark, Name:="naam2" Selection.TypeText TextBox1.Text ' enz. (10 keer) Selection.GoTo What:=wdGoToBookmark, Name:="adres1" Selection.TypeText TextBox2.Text Selection.GoTo What:=wdGoToBookmark, Name:="adres2" Selection.TypeText TextBox2.Text ' enz. (5 keer) End Sub

  • Als dat klaar is dan klik je het programmavenster en het Visual Basicvenster weg, dan klik je in de Visual Basic-werkbalk op het icoontje : Ontwerpmodus afsluiten, je verwijdert de Visual Basic-werkbalken, en dan ben je klaar.
Als je dan in het eerste tekstvenster een naam invult, en in het tweede tekstvak vul je een adres in, en je klikt op de opdrachtknop, dan wordt de ingevoerde naam op de tien plaatsen ingevuld, en het ingevoerde adres op vijf plaatsen. Tenminste als je de bladwijzers had aangebracht.

Verklaring van het programma:
Selection.GoTo What:=wdGoToBookmark, Name:="naam1"
betekent: breng de cursor naar de plaats van de bladwijzer met de naam "naam1".

Selection.TypeText TextBox1.Text
betekent: plaats de tekst, die is ingevoerd in het eerste tekstvak, op de plaats van de cursor.

En zo zorgen de volgende opdrachten er voor dat ook op de andere plaatsen de naam of het adres wordt geplaatst.