2017-12-19 56 views
0

Weiß jemand, ob es eine VBA-Anweisung gibt, aufeinanderfolgende angrenzende Zeichen als "Wörter" zu erkennen, anstatt jedes Nicht-Alpha-Zeichen zu zählen (als ein Wort) auf dem Weg?Word VBA - Interpunktion ignorieren beim Zählen/Auswählen der X-Nummer von "Words" oder "Sentences"

Meine Forschung zeigt, dass die meisten Menschen, die Interpunktion und/oder Nicht-Alpha-Zeichen ignorieren wollen, konzentrieren sich auf das Trimmen oder die Auswahl der Zeichen. Ich möchte behalten diese Zeichen, aber ich möchte auch die Nicht-Alpha-Zeichen ignoriert während das Makro bestimmt, wie viele "Wörter" zu wählen.

Betrachten Sie die folgenden Beispiele für "visual" Worte im Vergleich zu "Wort Worte":

Frau Smith-Harris (visuell 2; Wort 5) 09.00 Uhr (visuell 2; Word-7) und/oder (visuell 1, Wort 3)

Ich habe Hunderte von Makros, auf die ich leicht (mit mnemonic Abkürzungen) über einen Textexpander zugreift, darunter Dutzende von Makros, die eine Handlung auswählen und durchführen (zB markieren, fett, Großbuchstaben, kursiv, lösch, usw.) auf unterschiedlichen Mengen von Text zu meiner Linken oder Rechten - etwas, das ich ziemlich häufig in meiner Transkriptions- und redigierenden Arbeit mache.

So könnte zum Beispiel mein Cursor rechts von Frau Smith-Harris sein, und vielleicht möchte ich es hervorheben oder es in Großbuchstaben schreiben oder es löschen. Es ist viel einfacher und schneller für meine Augen, diese Zeichenkette schnell als 2 "Wörter" (des angrenzenden Textes) zu bewerten, anstatt die langweilige Aufgabe zu unterbrechen, all die störenden Nicht-Alpha-Zeichen zu zählen, die Word als "Wörter" zählt Wählen Sie Text, um herauszufinden, dass es 5 Worte nach Word-Standards sind.

Obwohl der Text-Expander selbst alle Funktionen ausführen kann, die ich direkt aus dem Programm heraus ausführen möchte, ist es viel schneller und effizienter, stattdessen einen Word-Makro aufzurufen, um die Funktion auszuführen weil das Makro unerwünschte Räume intelligent von der Auswahl abschneiden kann

Aber leider, wenn ich zum Beispiel das Makro Highlight2PreviousWords (unten gezeigt) laufen lasse, während mein Cursor rechts von Frau Smith-Harris ist, würde es nur hervorheben "-Harris."

Hier sind zwei Beispiele meiner „wählen X Anzahl der Wörter“ Makros:

Sub h1lw_HighlightPrevious1Word() 

     Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend 

      Dim oRng As Word.Range 
      Set oRng = Selection.Words(1) 
      Do While oRng.Characters.Last = " " 
      oRng.MoveEnd wdCharacter, -1 
      Loop 
      oRng.Select 

     Selection.Range.HighlightColorIndex = wdYellow 
     Selection.Collapse Direction:=wdCollapseEnd 

    End Sub 


    Sub h2lw_HighlightPrevious2Words() 
    ' 
      Selection.MoveLeft Unit:=wdWord, Count:=2, Extend:=wdExtend 

      Dim oRng As Range 
      Set oRng = Selection.Range 
      Do While oRng.Characters.Last = " " 
      oRng.MoveEnd wdCharacter, -1 
      Loop 
      oRng.Select 

      Selection.Range.HighlightColorIndex = wdYellow 
      Selection.Collapse Direction:=wdCollapseEnd 

    End Sub 

Alle meine „ein paar Worte wählen und dann etwas tun,“ Makros gleich aussehen, mit Ausnahme der „etwas tun“ Teil natürlich. So sehen alle Makros "Wähle 1 Wort nach links und mach etwas aus" wie das erste aus, und alle "Wähle 2+ Wörter links und tue etwas" sehen aus wie das zweite. Ich gehe normalerweise nicht über 5 Wörter hinaus, da ich in der Zeit, die darüber hinaus visuell zählt, den Text nur manuell auswählen kann.

Also die Makros funktionieren hervorragend für Straight-Text-Wörter, aber nicht so gut, wenn andere Charaktere in der Mischung sind. Ich würde gerne die Nicht-Alpha-Zeichen ignorieren und alle Strings des angrenzenden Textes als "Wörter" definieren.

Kennt jemand einen Weg, dies zu erreichen?

Antwort

1

Zwei Tipps zuerst:

  1. Um real Informationen über Anzahl von Worten erhalten Sie so etwas wie Range.ComputeStatistics() method
  2. So wählen Sie gewünschten Teil Ihres Dokuments können Sie verfolgen können und endend Zeichen, die Reichweite in dieser definiert Weg ActiveDocument.Range(startingPosition, EndingPosition)

Hier ist Ihre erste Unterroutine verbessert. Es könnte nicht 100% von dem, was Sie brauchen, aber ich glaube, es ist ein guter Ausgangspunkt (getestet mit Frau Smith-Harris :)).

Sub h1lw_HighlightPrevious1Word() 

Dim curSection As Range 
Dim curEnd As Long 
    curEnd = Selection.End 
Dim newStart As Long 

Do 
    newStart = Selection.Start 
    Selection.MoveLeft Unit:=WdUnits.wdWord, _ 
       Count:=1 

    Set curSection = ActiveDocument.Range(Selection.Start, curEnd) 

    Debug.Print curSection.Text 'test 

Loop While curSection.ComputeStatistics(wdStatisticWords) < 2 

    Set curSection = ActiveDocument.Range(newStart, curEnd) 
    Debug.Print curSection.Text 'test 

    'removing ending spaces 

     Do While curSection.Characters.Last = " " 
      Set curSection = ActiveDocument.Range(curSection.Start, curSection.End - 1) 
     Loop 

    With curSection 
     .HighlightColorIndex = wdYellow 
     ActiveDocument.Range(.End, .End).Select 
    End With 
End Sub 

Ps. Ich glaube, es gibt eine kürzere Lösung, aber ich konnte es nicht herausfinden. Ich denke, man könnte RegEx hier als Alternative verwenden.

+1

Wow. Einfach wow. Ich kann meinen Augen nicht einmal glauben. Ich habe es mit vielen verschiedenen Variationen getestet, und das funktioniert perfekt. Jeden. Single. Zeit. Was für ein Spiel! Jetzt los, um die Bazillion-Billion "Select X Worte" -Makros in meinem Repository zu dieser viel besseren Lösung zu ändern. Ich werde auch die RegEx-Option erkunden. Vielen Dank, Kazimierz! – HappyNanaMO