【问题标题】:Word VBA: How to get the current section numberWord VBA:如何获取当前节号
【发布时间】:2018-02-11 01:34:38
【问题描述】:

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

【问题讨论】:

  • 由于您没有标记答案或以其他方式跟进并且您没有定义您认为是一个部分的内容,我将其标记为“不清楚您在问什么”并投票关闭。

标签: vba ms-word


【解决方案1】:

Word 中的页码和节号很困难,因为文档的逻辑结构可能与显示的文本不匹配。例如,我可以在文档中间重置页码。

类似地,单词的“节”是通过插入分节符来分隔文档的各个部分,无论是下一页、连续、下一个奇数、下一个偶数等。但是,读者经常会想到“section”作为出现在“heading 1”样式段落之前的数字。同样,我可以在文档中间重置这些数字。因此,包含 3 个部分(逻辑)的文档可能只有两个标题:第 1 部分中没有标题,第 2 部分中的一个标题为“1. Introduction”,而第 3 部分中的另一个标题为“Appendix A. Glossary”。 (逻辑)部分仍然是 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

但这会获得 any 级别的上一个标题,而不仅仅是“标题 1”。

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 2013-02-06
      相关资源
      最近更新 更多