Word VBA - 在计算/选择X个“单词”或“句子”时忽略标点符号
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Word VBA - 在计算/选择X个“单词”或“句子”时忽略标点符号相关的知识,希望对你有一定的参考价值。
有没有人知道是否有一个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个单词,因为在视觉上超过它的时间,我可以手动选择文本。
因此,宏对于直文单词非常有用,但是当其他字符混合使用时,这种情况就不那么好了。我希望能够忽略非字母字符,并将相邻文本的所有字符串定义为“单词”。
有谁知道这样做的方法?
先提出两个提示:
- 要获得有关单词数量的
real
信息,您可以使用类似Range.ComputeStatistics() method
的内容 - 要选择文档的必需部分,您可以跟踪以这种方式定义范围的开始和结束字符
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作为替代方案。
以上是关于Word VBA - 在计算/选择X个“单词”或“句子”时忽略标点符号的主要内容,如果未能解决你的问题,请参考以下文章