Word-macro: alle afkortingen uit een tekst halen

Door: | 26 maart 2010 09:03

Apps & Software

Een nuttige bijlage in een document is een verklarende lijst van alle gebruikte afkortingen en acroniemen. Maar als u tijdens het opstellen van de tekst permanent attent hoort te zijn op die dingen, dan gaat het niet vooruit. Liever alles in één ruk uitschrijven, en daarna het speurwerk aan een macro overlaten!

In de woordenlijst dienen alle termen te komen van minstens twee tekens lang, die in de tekst volledig in hoofdletters geschreven staan, eventueel met puntjes achter elke letter. De macro moet dus bijvoorbeeld EU of A.I.D.S. opsporen, maar mag woorden als cao of Uefa links laten liggen.

Dergelijke karaktercombinaties kunnen opgespoord worden met de jokertekens binnen de zoekfunctie van Word: zoek naar [A-Z.]{2,} (de komma na de 2 kan ook een puntkomma zijn, als dit het in Windows gedefinieerde scheidingsteken is). De blokhaken bakenen een herhaling af, die vervolgens minstens tweemaal dient herhaald te worden: dit is wat binnen de accolades staat. De herhaling kan alle tekens tussen A en Z (hoofdletters, dus) zijn of een punt. Probeer maar eens uit op een bestaande tekst!

Met de jokertekens binnen de zoekfunctie van Word maakt u krachtige opsporingen.

In deze macro zijn twee hoofdbewerkingen nodig: eerst de zoekactie, waarbij de aangetroffen afkortingen (lees: de stukjes tekst – Range in VBA jargon – die door de opeenvolgende zoekacties gevonden worden) naar een nieuw document gekopieerd worden, en vervolgens het ontdubbelen.

[code]Sub VerzamelAcroniemen()

Dim EenAcroniem As Range

Dim HuidigDocument As Document

Dim AcroniemenLijst As Document

Set HuidigDocument = ActiveDocument

Set AcroniemenLijst = Documents.Add

HuidigDocument.Activate

With Selection

.HomeKey wdStory

With .Find

.ClearFormatting

.Replacement.ClearFormatting

.Replacement.Text = ""

Do While .Execute(findText:="[A-Z.]{2;}", _

MatchWildcards:=True, _

Wrap:=wdFindStop, Forward:=True)

Set EenAcroniem = Selection.Range

AcroniemenLijst.Range.InsertAfter EenAcroniem & vbCr

EenAcroniem.Collapse wdCollapseEnd

Loop

End With

End With

With AcroniemenLijst

.Range.Sort ExcludeHeader:=False, _

FieldNumber:="Paragraphs", _

SortFieldType:=wdSortFieldAlphanumeric, _

SortOrder:=wdSortOrderAscending

p = 2

Do

If .Paragraphs(p).Range = .Paragraphs(p - 1).Range Then

.Paragraphs(p).Range.Delete

Else

p = p + 1

End If

Loop Until p > .Paragraphs.Count

.Activate

End With

End Sub[/code]

Deze VBA-routine speurt alle afkortingen op, en brengt ze samen in een nieuw document.

Het creëren van een nieuw document gebeurt door de methode Add van de verzameling Documents op te roepen. Dit nieuwe document wijst u toe aan een variabele van het type Document, met de toepasselijke naam AcroniemenLijst. Vervolgens zorgt u ervoor dat de cursor zich in het begin van het actieve document bevindt door de methode HomeKey op te roepen van het Selection-object. Het argument wdStory duidt op de toe te passen eenheid, in casu de hoofdtekst. Zo zou wdLine de cursor naar het begin van de actieve regel brengen.

Vervolgens zorgt u er eerst voor dat er geen ‘residu’ van een eerdere zoek-en-vervangbewerking blijft hangen. Daarna voert een Do While … Loop-lus de nieuwe zoekoperatie evenveel keer uit, totdat de Execute-methode, toegepast op de Find-bewerking van het Selection-object, niet langer True als resultaat oplevert. Dit is het teken dat geen afkortingen meer gevonden zijn. Telkens wordt met een InsertAfter de gevonden tekst overgebracht naar het nieuwe document.

Tenslotte sorteert u het aldus opgebouwde AcroniemenLijst-document. Een Do … Loop Until…-lus doorloopt deze lijst, zolang er paragrafen in aangetroffen worden die identiek zijn aan de voorgaande: element p uit de Paragraphs-collectie wordt vergeleken met element p – 1, en bij gelijkheid doet een Delete-operatie het kuiswerk. Door systematisch na te gaan of Paragraphs.Count niet overschreden wordt, stopt de lus netjes.

Als er maar één afkorting gevonden wordt (= als AcroniemenLijst slechts één paragraaf telt), dan gaat deze routine de mist in. Waarom? En hoe hier een mouw aan passen?

Werkt op: Word 2007, Word 2003 en eerder