macro gezocht om Word te doorzoeken

Status
Niet open voor verdere reacties.

PJAA

Gebruiker
Lid geworden
15 jun 2019
Berichten
20
Ik heb voor mij een verhaal van +/- 900 pagina's. Het verhaal strekt zich over een periode van ongeveer 7 eeuwen. In het document staan veel namen van personen, plaatsen, gebouwen en gebieden.
Nu het einde van de voltooiing nadert wil ik eigenlijk een index maken van bijvoorbeeld alle voorkomende personen met bijbehorend(e) paginanummer(s). Er staan zoveel namen, met verschillende schrijfwijze door de eeuwen heen, in dat de functie 'zoeken' wellicht een eeuwigheid duurt. Kan VBA hier iets in betekenen?

Ik zie het volgende voor me.. de macro wordt gestart, het eerste woord dat hij tegenkomt wordt gebruikt om te zoeken op welke pagina's dit woord nog meer voorkomt, dan het tweede woord enz. enz.
Wellicht kan de macro gebruik maken van een lijst van woorden die hij mag overslaan ter controle, bv. lidwoorden, pers. voornaamwoorden, leestekens, dit om het proces te versnellen of minder te belasten.
Het resultaat een hele lange lijst van gebruikte woorden met daarachter de diverse paginanummers. Uit deze lijst kan ik dan overnemen wat ik van belang acht. Het is maar een idee...

Ik geef toe de vraag is sneller opgeschreven dan het maken van de macro. Schrijven van 900 pagina's en het gebruik van Word lukt me wel, maar programmeren dat is een vak. Wellicht is er iemand hier die
weet hoe dit op te lossen. Geen idee hoe dit werkt of dat ik hier te simpel over denk, ben me niet eens bewust van wat de grens van de mogelijkheden is van VBA. Maar als ik zie wat mensen hier op de site
weten klaar te spelen... petje af!

Ik ben benieuwd of er mensen zijn die mij kunnen helpen
 
Lijkt hier wel iets op. How to Create an Index in Word. This wikiHow teaches you how to create an index page in Microsoft Word to look up important terms discussed in a document and the pages they appear on.
 
Laatst bewerkt:
Als je een woord gaat indexeren, kun je aangeven dat het specifieke woord in het hele document wordt gemarkeerd. Mij lijkt het zeer onwenselijk om geautomatiseerd te indexeren met een macro; lijkt mij dat de chaos groter wordt dan bij handmatig indexeren. En dus ook de tijd om het weer te herstellen navenant langer. Je had er natuurlijk beter aan gedaan om de gewenste items tegelijk te indexeren, wat ook de bedoeling is van de functie :).
 
Als reactie op bovenstaande meedenkers, als ik geweten had dat ik een dergelijke index had willen maken had ik er inderdaad bij het schrijven rekening mee moeten houden. Ik had dan inderdaad aan de eventueel te gebruiken woorden of namen een 'opmaak' aangehangen daar ze aan het einde makkelijk te filteren waren.
Maar helaas dat heb ik niet gedaan, ik heb het idee ook later pas opgedaan toen ik een boek in handen kreeg waarin zo'n namen, plaatsnamen en gebouwen index aanwezig was.

Zodoende dacht ik dat wellicht een macro een uitkomst kon zijn met als resultaat een woordenlijst van alle voorkomende woorden in de tekst met daarachter de paginanummers waar het woord voorkomt. Uit deze lijst kan ik dan de voor mij belangrijke woorden opnemen in een index achterin het boek..... Dit is inderdaad de gedachte als het niet gaat zal ik regel voor regel het boek moeten doornemen en aantekeningen maken of meteen een 'opmaak' aan het woord hangen, stel de opmaak veranderd en wellicht ook het paginanummer enz. enz.

Maar alvast bedankt voor jullie input, wellicht komt er nog iemand met het antwoord (= een macro) :D:D
 
Volgens mij zal er niemand komen met een macro, zelfs God niet, nu niet en ook niet in de eeuwigheid. Volgens mij heb je niet gekeken naar het artikel van de link. Want als je dat had getest, had je gezien dat het alsnog vrij simpel en snel te doen is om een index te maken. Ook laat deze zich bij wijzigingen snel aanpassen (paginanummers).
 
Laatst bewerkt:
@senso: volgens mij weet TS best wel hoe je 'live' een index maakt, en hoewel je linkje dat prima uitlegt, lijkt mij dat dus het probleem niet. Dat zit eerder in het feit dat TS van alle 'normale' worden een index wil maken, en die dan gaan opschonen later. En dat is een doelloze weg, denk ik. Ik heb een macro gevonden waarmee dat overigens nog wel zou kunnen, maar ik raad TS dus ernstig aan om deze weg niet te bewandelen! Ik heb een test gedaan in een qua grootte vergelijkbaar bestand (110 pagina's, en daar zaten, als ik lidwoorden etc. al niet eens meetel, zo'n 2800 verschillende woorden in. Laat staan als je die macro loslaat op een document van 900 pagina's. Dat aantal wordt dan echt niet kleiner...

En een index van zo'n 3000 items opschonen, is echt heel wat meer werk dan het handmatig opzoeken van de woorden die je wél in de index wilt hebben. Bovendien zit je ook nog eens met eventuele spelwijzen van 'identieke' woorden die je dan wilt combineren. Is echt niet te doen met een macro!

Kortom: de veruit beste en snelste weg is, om door je document te scrollen, en zelf de woorden te markeren en met de optie <Alles markeren> dan vast te leggen in de index. Goede kans dat je dan een veel betere index krijgt.

Die macro om het aantal unieke woorden te tellen, kan ik je overigens wel geven, dan kun je zelf testen wat hij bij jou doet :).
 
Wist niet dat zelfs God zou worden........ :d Natuurlijk jullie hebben allemaal gelijk als je zegt scroll door de tekst en markeer als je een woord wil gebruiken. Mijn vraag hier stellen had natuurlijk ook tot een ander resultaat kunnen leiden. Ik heb ooit vroeger onder een andere naam een vraag gehad omtrent Excel en macro's en daarop een briljant antwoord met een macro gekregen. Nooit gedacht dus dat zoiets met een macro kon. Dus vandaar niet geschoten is altijd mis.

En dan nog iets.. vaak is er een hoop te vinden op internet als je de juiste woorden gebruikt in Google. Het kan zomaar leiden tot een hoop wat je niet zoekt. Ook ik heb dat eerst gedaan. Met Engelse woorden kwam ik vaak op macro's uit die uitgingen van een woordenlijst vooraf en dat was niet wat ik zocht.

Maar ik dank jullie voor jullie hulp. Ik ga deze even doorspitten.
 
Ik heb ooit vroeger onder een andere naam een vraag gehad omtrent Excel en macro's en daarop een briljant antwoord met een macro gekregen. Nooit gedacht dus dat zoiets met een macro kon.
De naam waaronder je een vraag stelt, zal weinig te maken hebben met de kwaliteit van mogelijke antwoorden :). En een briljante macro voor een probleem in Excel wil natuurlijk nooit zeggen dat er een vergelijkbaar briljant antwoord mogelijk is in Word. Het zijn niet-vergelijkbare programma's.

Ik heb ook niet gezeg dat het niet kan, maar wél dat het niet wenselijk is. Omdat je de problemen alleen maar groter maakt in mijn simpele optiek. Moet je niet willen. Indexen zijn waardevolle hulpmiddelen voor lezers, mits goed gebruikt. Daar is nu duidelijk (nog) geen sprake van, en om geautomatiseerd alle mogelijke woorden te indexeren, is het paard achter de wagen spannen. Want voor het weghalen van niet-wenselijke markeringen ben je nog véél meer tijd kwijt.

Kortom: je hebt bij het schrijven een (beginners?) fout gemaakt door niet gelijk de belangrijke items te markeren voor een index, en nu heb je wat extra werk omhanden om dat alsnog te repareren, maar dat is verre te prefereren boven een index waar niemand wat aan heeft, omdat er duizenden items in staan die nergens op slaan.
 
N.a.v. je verzoek om de macro die de woorden telt, hier de macro:
Code:
Sub WordFrequency()
Const maxwords = 9999          'Maximum unique words allowed
Dim SingleWord As String       'Raw word pulled from doc
Dim Words(maxwords) As String  'Array to hold unique words
Dim Freq(maxwords) As Integer  'Frequency counter for unique words
Dim WordNum As Integer         'Number of unique words
Dim ByFreq As Boolean          'Flag for sorting order
Dim ttlwds As Long             'Total words in the document
Dim Excludes As String         'Words to be excluded
Dim Found As Boolean           'Temporary flag
Dim j, k, l, Temp As Integer   'Temporary variables
Dim ans As String              'How user wants to sort results
Dim tword As String            '
Dim aword As Object            '
Dim tmpName As String          'er

    ' Set up excluded words
    Excludes = "[het][een][of][is][aan][voor][door][er][en][de][zijn][ben]"

    ' Find out how to sort
    ByFreq = True
    ans = InputBox("Sort by WORD or by FREQ?", "Sort order", "FREQ")
    If ans = "" Then End
    If UCase(ans) = "WORD" Then
        ByFreq = False
    End If
    
    Selection.HomeKey Unit:=wdStory
    System.Cursor = wdCursorWait
    WordNum = 0
    ttlwds = ActiveDocument.Words.Count

    ' Control the repeat
    For Each aword In ActiveDocument.Words
        SingleWord = Trim(LCase(aword))
        'Out of range?
        If SingleWord < "a" Or SingleWord > "z" Then
            SingleWord = ""
        End If
        'On exclude list?
        If InStr(Excludes, "[" & SingleWord & "]") Then
            SingleWord = ""
        End If
        If Len(SingleWord) > 0 Then
            Found = False
            For j = 1 To WordNum
                If Words(j) = SingleWord Then
                    Freq(j) = Freq(j) + 1
                    Found = True
                    Exit For
                End If
            Next j
            If Not Found Then
                WordNum = WordNum + 1
                Words(WordNum) = SingleWord
                Freq(WordNum) = 1
            End If
            If WordNum > maxwords - 1 Then
                j = MsgBox("Too many words.", vbOKOnly)
                Exit For
            End If
        End If
        ttlwds = ttlwds - 1
        StatusBar = "Remaining: " & ttlwds & ", Unique: " & WordNum
    Next aword

    ' Now sort it into word order
    For j = 1 To WordNum - 1
        k = j
        For l = j + 1 To WordNum
            If (Not ByFreq And Words(l) < Words(k)) _
              Or (ByFreq And Freq(l) > Freq(k)) Then k = l
        Next l
        If k <> j Then
            tword = Words(j)
            Words(j) = Words(k)
            Words(k) = tword
            Temp = Freq(j)
            Freq(j) = Freq(k)
            Freq(k) = Temp
        End If
        StatusBar = "Sorting: " & WordNum - j
    Next j

    ' Now write out the results
    tmpName = ActiveDocument.AttachedTemplate.FullName
    Documents.Add Template:=tmpName, NewTemplate:=False
    Selection.ParagraphFormat.TabStops.ClearAll
    With Selection
        For j = 1 To WordNum
            .TypeText Text:=Trim(Str(Freq(j))) _
              & vbTab & Words(j) & vbCrLf
        Next j
    End With
    System.Cursor = wdCursorNormal
    j = MsgBox("There were " & Trim(Str(WordNum)) & " different words ", vbOKOnly, "Finished")
End Sub
Ik heb de macro niet zelf gemaakt maar wel een beetje aangepast; in het origineel werden Engelse woorden uitgesloten. Die heb ik vervangen door een (groot) aantal Nederlandse woorden. Het principe daarvan is denk ik wel duidelijk; kun je zelf wel aanpassen mocht dat nodig zijn.
 
Best handig die macro OctaFish, kan ik zeker gebruiken. :thumb:
 
Laatst bewerkt:
En op basis van deze macro zou je dus een macro kunnen maken die bepaalde woorden in een index zet. Je gebruikt dan de opgebouwde matrixes (Freq en Words) om te indexeren. Bijvoorbeeld de woorden die een minimale lengte hebben (zodat je enige zekerheid hebt over de namen. Of woorden die een minimaal (of maximaal) aantal keren voorkomen.
Nogmaals: ik zou het zo nooit doen, omdat in mijn ogen jouw document niet op die manier te indexeren is. Deze methode houdt bijvoorbeeld ook geen rekening met schrijfwijzen door de tijd heen. Je zult een naam (of een woord) dat niet consequent geschreven is toch onder dezelfde term, of als subgegeven, willen markeren.
Maar proberen kan natuurlijk nooit kwaad, je sloopt er niks mee :).
 
Nogmaals je hebt helemaal gelijk, beter is het hele document handmatig te doorlopen. Toch als leerproces van hoe en wat met macro's ben ik toch weer wat wijzer geworden. Aan jouw macro heb ik al veel, vele pagina's aan woorden waarbij inderdaad naar voren komt dat als je ze alfabetisch bekijkt er verschillende schrijfwijzes zijn. Die kan ik dan heel snel opzoeken en aanpassen. Dat is alvast meegenomen :thumb:
 
Dat is inderdaad een groot voordeel, want nu heb je tenminste inzicht in je ‘woordenschat’ :)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan