2017-12-19 5 views
0

연속되는 인접한 문자를 "단어"로 인식하는 VBA 문이 있는지 알 수 있습니까? (단어로서) 도중에?Word VBA - "단어"또는 "문장"의 X 수를 계산/선택하는 동안 구두점 무시

필자의 연구에 따르면 구두점 및/또는 비 알파 문자를 무시하려는 대부분의 사람들은 문자 자르기 또는 선택 해제에 중점을 둡니다. 내가 이러한 문자를 보유하고 싶지만, 또한 비 알파 문자가 무시 무시 매크로를 선택하는 동안 얼마나 많은 "단어"를 결정하는 동안 싶습니다.

은 "단어 즉"대 "시각적"단어의 다음 예 고려해

양 스미스 해리스 (시각 2, 워드 5) 오전 9 (시각 2, 단어 7) 및/또는 (시각적으로 1, Word 3)

텍스트 확장기를 통해 쉽게 액세스 할 수있는 수백 개의 매크로가 있으며 그 중 매크로를 사용하여 수십 개의 매크로를 선택하고 수행합니다 (예 : 강조, 굵게, 대문자, 기울임 꼴, 삭제 등)을 텍스트의 왼쪽이나 오른쪽으로 옮깁니다. 필자의 필사본 편집 작업에 자주 사용됩니다.

예를 들어, 내 커서가 Smith-Harris 양 오른쪽에있을 수 있으며 커서를 강조 표시하거나 대문자로 만들거나 삭제하려고 할 수 있습니다. 내 눈이 그 문자열을 (인접한 텍스트의) 2 "단어"로 신속하게 평가하여 Word가 "단어"로 간주하는 파괴적이지 않은 모든 비 알파벳 문자를 계산할 지루한 작업을 수행하는 것이 아니라 훨씬 빠르고 쉬워졌습니다. 텍스트를 선택하여 Word 표준에 따라 5 "단어"라는 것을 파악합니다.

텍스트 확장기 자체가 프로그램 내에서 텍스트에 직접 할 수있는 모든 기능을 수행 할 수 있지만 기능을 수행하기 위해 Word 매크로를 호출하는 것이 훨씬 빠르고 효율적입니다 매크로가 선택에서 원하지 않는 공백을 지능적으로 다듬을 수 있기 때문에

그러나 내 음모가 Smith-Harris 오른쪽에있는 동안 Highlight2PreviousWords 매크로 (예 : 아래)를 실행하면 강조 표시 만됩니다. "- 해리스."

여기 내 "단어의 X 번호를 선택"매크로의 두 가지 예 :

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 

의 내 모든 매크로는 "무언가"를 제외하고 같은 모양 "일부 단어를 선택하고 무언가를" 물론, 부분. 따라서 "왼쪽으로 한 단어 선택하고 무언가를하십시오"라는 매크로는 모두 첫 번째 매크로처럼 보이며 "왼쪽에 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

와우. 와우. 나는 내 눈을 믿을 수 없다. 여러 변형으로 테스트 해봤는데 완벽하게 작동합니다. 마다. 단일. 시각. 이 얼마나 게임 체인저! 이제 나의 리포지토리에있는 엄청나게 많은 "셀렉트 X 단어"매크로를이 훨씬 더 나은 솔루션으로 변경하십시오. RegEx 옵션도 살펴 보겠습니다. 많은 감사, Kazimierz! – HappyNanaMO