我正在构建一个循环遍历文档每个单词的宏,并通过正则表达式检查它是否与模式匹配,如果是,则将找到的单词写入excel表。它是这样的:
For Each sentence In ActiveDocument.StoryRanges
For Each w In sentence.Words
myWord = w
If TestRegExp(myPattern, myWord) Then
WKS.Cells(myCount, 1).Value = myWord
myCount = myCount + 1
End If
Next
Next
这部分工作正常。现在我还想得到每个被发现的单词的部分(也就是“在找到的单词的哪个部分出现”)。我找到了命令“selection.Information”,但无论我尝试什么,我只得到“Section = 1”。即使我只检查整个文档的部分(“ActiveDocument.Sections.Count”),我只得到1.所以这些部分必须有一些东西,但是这个文档肯定有部分。有谁知道我做错了什么?
答案 0 :(得分:2)
Word中的页码和节号很难,因为文档的逻辑结构可能与显示的文本不匹配。例如,我可以在文档中间重置页码。
类似地,单词的“部分”是通过插入分节符号来分隔文档的各个部分,无论是下一页,连续,下一个奇数,下一个偶数等。但是,读者经常会想到“section”作为“标题1”样式段落之前出现的数字。同样,我可以在文档中重置这些数字。因此,具有3个部分(逻辑)的文档可能只有两个标题:第1部分中没有,第2部分中的一个表示“1.简介”,第3部分中的另一个表示“附录A.术语表”。 (逻辑)部分仍然是1,2,3 ......
w = ActiveDocument.Sentences(10).Words(1) ' given some word in the document
MsgBox w.Information(wdActiveEndPageNumber) ' logical page number
MsgBox w.Information(wdActiveEndAdjustedPageNumber) ' displayed page number
MsgBox w.Information(wdActiveEndSectionNumber) ' logical section number
显示的部分编号,由于是“标题1”样式,并且该样式已被设置为多级编号格式...获取该列表项目的显示数量似乎非常在一般情况下很难。
我见过的解决方案涉及搜索与标题样式匹配的上一段,然后从中获取.ListFormat.ListString。
MsgBox w.GoTo(What:=wdGoToHeading, Which:=wdGoToPrevious).ListFormat.ListString
但是它获得任何级别的上一个标题,而不仅仅是“标题1”。
答案 1 :(得分:0)
Sections
与StoryRanges
不同,是StoryRanges(wdMainTextStory)
范围的一部分。您可以使用For
循环代替For Each
循环来获取WdStoryType
号码:
For i = 1 To ActiveDocument.StoryRanges.Count ' or 1 To 17
For Each w In ActiveDocument.StoryRanges(i).Words
If TestRegExp(myPattern, w) Then
WKS.Cells(myCount, 1).Value = myWord
myCount = myCount + 1
Debug.Print i, myCount, w ' i has the WdStoryType number
End If
Next
Next
此外,可能不需要RegExp
,因为Word具有通配符查找和替换https://superuser.com/questions/86397/wildcards-in-word,而VBA具有Like
Operator