Word VBA:如何获取当前部分编号

时间:2017-05-04 13:27:04

标签: vba ms-word

我正在构建一个循环遍历文档每个单词的宏,并通过正则表达式检查它是否与模式匹配,如果是,则将找到的单词写入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.所以这些部分必须有一些东西,但是这个文档肯定有部分。有谁知道我做错了什么?

2 个答案:

答案 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)

SectionsStoryRanges不同,是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