Search code examples
vb.netms-wordoffice-interop

better method for accenting every word in Word document?


I am new to programming, but I am trying to adapt an existing script as a MS Word 2010/2013 addin to add correct stress accentuation to every Latin word in an open document.

The script "DoAccentuate" returns an accented word for any unaccented Latin word I send it as a string. I just need help doing a better job of looping through all the words, and then stopping the loop when the last word is reached. My current method is a bit goofy...I insert a nonesense word at the end of the document and then loop until it gets selected and accented.

Perhaps there's a better or more efficient way to go about the whole thing.

    Public Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    Dim document As Word.Document
    document = Globals.ThisAddIn.Application.ActiveDocument
    Dim mySelection = document.Application.Selection
 'make sure cursor is at start of document
      document.Application.Selection.HomeKey(Unit:=Microsoft.Office.Interop.Word.WdUnits.wdStory)

    'insert fake word at end to stop the loop
    Dim range As Word.Range
    range = document.Range()
    range.InsertAfter(" documentendatoris")

    Do
        'use MS Word's wildcard to select the first individual word as trimmed string
        mySelection.Find.Text = "<*>"
        mySelection.Find.MatchWildcards = True
        mySelection.Find.Execute()
        'replace the selected word that has been found with its accented counterpart
        mySelection.Text = Accentuate.Accentuate.DoAccentuate(mySelection.Text)
    Loop Until mySelection.Text = "documentendatóris"

End Sub

Solution

  • Well, I don't realy know if its more efficient way but you could use document.Content and range.Words collection to check all words in main story range

        document = Globals.ThisAddIn.Application.ActiveDocument
    
        Dim range As Word.Range
        range = document.Content
    
        Dim current As Integer
        current = 0
    
        Dim words As Word.Words
        words = range.Words
    
        Dim word As Word.Range
    
        Do
            current = current + 1
            If current < words.Count Then
                word = words(current)
                If word.Text.EndsWith(" ") Then
                    word.Text = word.Text.Trim() + "'s "
                    'replace the selected word that has been found with its accented counterpart
                    'mySelection.Text = Accentuate.Accentuate.DoAccentuate(mySelection.Text)
                Else
                    word.Text = word.Text.Trim() + "'s"
                End If
            End If
        Loop Until current = words.Count