有人知道是否有一个vba语句可以将连续的相邻字符识别为"单词",而不是沿途计数每个非alpha字符(作为一个单词)?p>我的研究表明,大多数想要忽略标点符号和/或非阿尔法角色的人都专注于修剪或取消选择角色。我想保留这些字符,但是我也希望忽略 non-alpha字符,而宏正在确定要选择多少个"单词"。
考虑以下"视觉"单词与"单词"的示例:
ms。史密斯 - 哈里斯(视觉上2;单词5)上午9:00(视觉上2;单词7)和/或(视觉上1,单词3)
我有数百个宏(带有助记符快捷方式),可以通过文本扩展器访问,其中包括数十个将选择和执行动作的宏(例如,亮点,大胆,大写,斜体,斜体,删除等)在我的左右文字上有不同数量的文字 - 我在转录和编辑工作中经常做的事情。
所以,例如,我的光标可能是史密斯·哈里斯女士的权利,也许我想突出显示它或使其大写或删除它。对于我的眼睛而言,快速评估该字符的字符串为2个"单词"(相邻文本)而不是停止并执行所有繁琐的任务,即计算所有颠覆性的非alpha字符的任务,这是2个"单词"(相邻文本)的速度要容易得多,更快。选择文本,以确定按单词标准是5个"单词"。
尽管文本扩展器本身能够直接从程序中直接执行我想对文本执行的所有功能,但是让它调用一个单词宏来执行该功能,它更快,更有效,尤其是因为宏可以从选择中明智地修剪不需要的空间
,但是,例如,如果我跑步,例如,亮点2previouswords宏(如下所示),而我的光标是史密斯·哈里斯女士的右边,则只会突出显示" -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个单词左边的1个单词"宏看起来像第一个,所有"选择左侧的2个"单词和做某事的所有"选择"看起来像第二个。我通常不会超越5个单词,因为在视觉上需要计算之外,我可以手动选择文本。
因此,宏非常适合直接文字单词,但是当其他角色混合在一起时,宏不太好。我很想能够忽略非α字符,并将相邻文本的所有字符串定义为"单词"。
有人知道一种实现这一目标的方法吗?
首先两个提示:
- 获取
real
有关单词数的信息,您可以使用Range.ComputeStatistics() method
之类的信息 - 要选择文档的必需部分,您可以跟踪以这种方式定义范围的启动和结束字符
ActiveDocument.Range(startingPosition, EndingPosition)
这是您的第一个子例程改进。它可能不是您需要的100%,但我相信这是一个很好的起点(用MS。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用作替代方案。