Word VBA - 在计算/选择X数字时忽略标点符号"单词"或"句子"

时间:2017-12-19 07:11:22

标签: vba ms-word word-vba

是否有人知道是否有VBA语句将连续的相邻字符识别为"字"而不是沿途计算每个非字母字符(作为一个单词)?

我的研究表明,大多数想要忽略标点符号和/或非字母字符的人都专注于修剪或取消选择字符。我想保留这些字符,但我也希望非字母字符忽略,而宏确定了多少"字"选择。

考虑以下" visual"单词与"单词":

女士。 Smith-Harris(视觉2; Word 5) 上午9点(视觉上2;字7) 和/或(视觉上1,Word 3)

我有数百个宏,我可以通过文本扩展器轻松访问(使用助记符快捷键),其中有数十个宏将选择并执行操作(例如,高亮,粗体,大写,斜体,删除等)在我左边或右边的不同数量的文本 - 我在转录和编辑工作中经常做的事情。

因此,例如,我的光标可能位于Smith-Harris女士的右边,也许我想要突出显示它或将其设为大写或删除它。我的眼睛更容易,更快速地快速评估这一串字符为2"字" (相邻文本)而不是停止并执行繁琐的任务,即计算Word所计算的所有破坏性非字母字符"单词"在选择文本时,要弄清楚它的5"单词"按照Word标准。

尽管文本扩展器本身能够直接从程序中执行我可能想要对文本执行的所有功能,但是让它更快更有效地调用Word宏来执行功能,特别是因为宏可以智能地从选择中删除不需要的空格

但是,如果我运行Highlight2PreviousWords宏(如下所示),而我的光标位于Smith-Harris女士的右边,那么它只会突出显示&#34; -Harris。&#34; < / p>

以下是我的&#34;选择X个单词的两个例子&#34;宏:

    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

我的所有&#34;选择一些单词,然后做一些事情&#34;宏观看起来是一样的,除了&#34;做某事&#34;部分当然。所以所有的&#34;选择左边的1个单词并做一些事情&#34;宏看起来像第一个,并且所有&#34;选择左边的2个单词并做一些事情&#34;看起来像第二个。我通常不会超过5个单词,因为在视觉上超过它的时间,我可以手动选择文本。

因此,宏可以很好地用于直文单词,但是当其他字符混合使用时效果不是很好。我希望能够忽略非字母字符,并将相邻文本的所有字符串定义为&#34;单词。&#34;

有谁知道如何实现这个目标?

1 个答案:

答案 0 :(得分:1)

首先提出两个提示:

  1. 要获取有关单词数量的real信息,您可以使用Range.ComputeStatistics() method
  2. 之类的内容
  3. 要选择文档的必需部分,您可以跟踪以这种方式定义范围的开始和结束字符ActiveDocument.Range(startingPosition, EndingPosition)
  4. 这是你改进的第一个子程序。它可能不是你需要的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
    

    聚苯乙烯。我相信有一个较短的解决方案,但我无法弄清楚。我认为可以在这里使用RegEx作为替代方案。