2017-12-19 61 views
0

連続した隣接文字を「単語」として認識するためのVBA文があるかどうかは分かりません。途中で(言葉として)?Word VBA - 「単語」または「文章」のX数をカウント/選択中に句読点を無視する

私の研究は、句読点や非アルファベット文字を無視したいと思うほとんどの人は、文字をトリミングまたは選択解除することに焦点を当てていることを示しています。私はのこれらの文字を保持したいが、私はまた、非アルファベット文字を無視してを無視してマクロが何個の "単語"を選択するかを決定したい。 ; 9:00(視覚2;ワード7) 及び/

氏スミス・ハリス(ワード5目視2):

"は単語の単語" 対 "視覚" の単語の次の例を考えてみ(視覚的に1、Word 3)

テキストエクスパンダを使って簡単に(ニーモニックのショートカットで)アクセスする何百ものマクロがあります。その中には、アクションを選択して実行する数十のマクロ(ハイライト、太字、大文字、イタリック体、削除など)のテキストを左または右に変更することができます。

たとえば、私のカーソルがSmith-Harrisさんの右にあるかもしれません。おそらく、それを強調表示したり、大文字にしたり、削除したりしたいと思っています。私の目では、文字列を2つの "単語"(隣接するテキストの)として素早く評価するのはずっと簡単ですし、Wordが「単語」として数え切れないすべての破壊的でないアルファ文字を数えるという面倒な作業を行うのではなくテキストを選択して、それがWord標準によって5 "単語"であることを理解する。

テキストエキスパンダー自体は、プログラム内からテキストに直接行うことができるすべての機能を実行できますが、機能を実行するためにWordマクロを呼び出すよりはるかに高速で効率的ですマクロは選択から不要なスペースをインテリジェントにトリミングすることができるので、

しかし、私のカーソルがスミス - ハリスさんの右にあるときに、たとえばHighlight2PreviousWordsマクロを実行すると、強調表示されます"ハリス"

はここに私の「言葉のX番号を選択し、」マクロの2つの例です:

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 

のすべての私のマクロが「何か」を除いて、同じように見える「いくつかの単語を選択して何かをします」もちろん、部分。だから、 "1つの単語を左に選択して何かをする"というマクロは、最初のマクロのように見えます。そして、 "2つ以上の単語を左に選択して何かをする"のすべてが第2のものと同じように見えます。私は通常、5単語を超えていません。なぜなら、視覚的にそれ以上にカウントする時間がかかるので、私は手動でテキストを選択することができるからです。

したがって、マクロはストレートテキストの単語には効果的ですが、他の文字が混在している場合はあまり効果がありません。私は非アルファベット文字を無視して、隣接するテキストのすべての文字列を "単語"として定義することができればと思っています。

誰でもこれを達成する方法を知っていますか?最初

答えて

1

つのヒント:

  1. あなたがこの範囲を定義する文字を開始および終了トレースすることができ、あなたの文書の必要な部分を選択するにはRange.ComputeStatistics() method
  2. のようなものを使用することができます単語の数についてrealの情報を取得するにはway ActiveDocument.Range(startingPosition, EndingPosition)

あなたの最初のサブルーチンが改善されました。それはあなたが必要とするものの100%ではないかもしれませんが、私はそれが良い出発点だと信じています(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。私は、より短い解決策があると信じていますが、私はそれを理解できませんでした。私はRegExを代わりに使うことができると思います。

+1

ワウ。ちょうどうわー。私は私の目を信じることさえできません。私は多くの異なるバリエーションでそれをテストし、これは完全に動作します。すべて。シングル。時間。どのようなゲームチェンジャー!今すぐ私のリポジトリ内の膨大な数の "select X words"マクロをこのずっと良いソリューションに変更してください。また、RegExオプションについても説明します。多くのありがとう、Kazimierz! – HappyNanaMO

関連する問題