Word VBA - 在计算/选择X个“单词”或“句子”时忽略标点符号

问题描述 投票:0回答:1

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

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

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

Smith-Harris女士(视觉2;单词5)上午9:00(视觉上2; Word 7)和/或(视觉上1,Word 3)

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

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

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

但是,如果我运行Highlight2PreviousWords宏(如下所示),而我的光标位于Smith-Harris女士的右边,那么它只会突出显示“-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个单词,因为在视觉上超过它的时间,我可以手动选择文本。

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

有谁知道这样做的方法?

vba ms-word word-vba
1个回答
1
投票

先提出两个提示:

  1. 要获得有关单词数量的real信息,您可以使用类似Range.ComputeStatistics() method的内容
  2. 要选择文档的必需部分,您可以跟踪以这种方式定义范围的开始和结束字符ActiveDocument.Range(startingPosition, EndingPosition)

这是你的第一个子程序改进了。它可能不是你需要的100%,但我相信它是一个很好的起点(与史密斯 - 哈里斯女士一起测试:))。

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作为替代方案。

© www.soinside.com 2019 - 2024. All rights reserved.