【问题标题】:Word VBA - Ignore punctuation while counting/selecting X number of "Words" or "Sentences"Word VBA - 在计算/选择X个“单词”或“句子”时忽略标点符号
【发布时间】:2017-12-19 16:15:45
【问题描述】:

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

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

考虑以下“视觉”单词与“单词单词”的示例:

女士。史密斯-哈里斯(视觉 2;字 5) 上午 9:00(视觉上 2;字 7) 和/或(视觉上 1,字 3)

我有数百个宏,我可以通过文本扩展器轻松访问(使用助记快捷方式),其中有几十个宏可以选择并执行操作(例如,突出显示、粗体、大写、斜体、删除等)在我左边或右边的不同数量的文本上——这是我在转录和编辑工作中经常做的事情。

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

虽然文本扩展器本身能够直接从程序中执行我可能想要对文本执行的所有功能,但让它代替调用 Word 宏来执行该功能会更快、更有效,尤其是因为宏可以智能地从选择中修剪不需要的空格

但是,如果我在光标位于 Smith-Harris 女士右侧时运行,例如,Highlight2PreviousWords 宏(如下所示),它只会突出显示“-Harris”。

以下是我的“选择 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

我所有的“选择一些词然后做某事”宏看起来都一样,当然除了“做某事”部分。所以所有的“选择左边的 1 个单词并做某事”宏看起来都像第一个,而所有的“选择左边的 2+ 个单词并做某事”看起来像第二个。我通常不会超过 5 个单词,因为在视觉上计算超过 5 个单词所需的时间,我可以手动选择文本。

因此,宏对于纯文本单词非常有用,但在混合使用其他字符时就不那么好了。我希望能够忽略非字母字符并将所有相邻文本的字符串定义为“单词”。

有谁知道实现这个的方法吗?

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    先说两点:

    1. 要获得real 的字数信息,您可以使用Range.ComputeStatistics() method 之类的信息
    2. 要选择文档的所需部分,您可以跟踪以这种方式定义范围的开始和结束字符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
    

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

    【讨论】:

    • 哇。哇。我什至不敢相信自己的眼睛。我用许多不同的变体对其进行了测试,并且效果很好。每一个。单身的。时间。多么改变游戏规则!现在将我的存储库中的 bazillion-gillion “select X words”宏更改为这个更好的解决方案。我还将探索 RegEx 选项。非常感谢,Kazimierz!
    猜你喜欢
    • 2013-10-24
    • 2014-10-15
    • 1970-01-01
    • 2014-12-30
    • 2016-05-25
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多