简体   繁体   English

使用 VBA 在 MS Word 中使用通配符搜索循环获取标题信息

[英]Get heading information using a wild card search loop in MS Word using VBA

I am doing a wildcard search loop in MS Word and generating the list of all the find values in a new document using following code.我正在 MS Word 中执行通配符搜索循环,并使用以下代码在新文档中生成所有查找值的列表。 I have added page numbers to the output.我已将页码添加到 output。 But I can't think of how to get the headers for the searched output.但我想不出如何获取搜索到的 output 的标题。 Pls suggest.请建议。

Sample Word Document:示例 Word 文档:

1 Heading
Text Text Text Text Text

--<Page Break>--

1.1 Heading
Text Text Text Text Text [Reference X1]

1.1.1 Heading
Text Text Text Text Text
Text Text Text Text Text
Text Text Text Text Text

--<Page Break>--

1.2 Heading
Text Text Text Text Text

1.2.1 Heading
Text Text Text Text Text
Text Text Text Text Text [Reference X2]
Text Text Text Text Text [Reference X3]

The 1, 1.1, etc headings are the default heading styles used in MS word. 1、1.1等标题是MS word中使用的默认标题styles。 (For me the style name is "Heading 1", "Heading 2", etc.) (对我来说,样式名称是“标题 1”、“标题 2”等)

The output I am expecting is as under in a tabular format:我期望的 output 如下表格式:

| Reference     | Heading        | Page  |
| Reference X1  | 1.1 Heading    | 2     |
| Reference X2  | 1.2.1 Heading  | 3     |
| Reference X2  | 1.2.1 Heading  | 3     |

The Code (part of the sub that does this finding and writing in the table) I have been able to write so far is:到目前为止,我能够编写的代码(在表格中查找和写入的子代码的一部分)是:

With oDoc
    Set oRange = .Range
    n = 1
    With oRange.Find
        .Text = "<Reference X[0-9]{1,}>"
        .Forward = True
        .MatchWildcards = True
        Do While .Execute
            strFound = oRange
            With oTable
                .Cell(n+1,1).Range.Text = strFound
                .Cell(n+1,3).Range.Text = oRange.Information(wdActiveEndPageNumber)
            End With
            n = n + 1
        Loop
    End With
End With

I already have the code for defining these variables, creating a table and required rows in it.我已经有了定义这些变量、在其中创建表和所需行的代码。 I am only confused about how to get the heading just above the found item.我只是对如何在找到的项目上方获取标题感到困惑。 The issue is there can be one or multiple "Reference XX" under one heading.问题是一个标题下可能有一个或多个“参考 XX”。 Further, the heading level can be any.此外,标题级别可以是任何级别。 And I need separate rows for each item found using the wildcard.对于使用通配符找到的每个项目,我都需要单独的行。

For example:例如:

Sub GetRefHeadings()
Application.ScreenUpdating = False
Dim Rng As Range, StrOut As String, Tbl As Table
StrOut = "Ref." & vbTab & "Heading" & vbTab & "Page" & vbCr
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "<Reference X[0-9]@>"
    .Replacement.Text = ""
    .Format = False
    .Forward = True
    .Wrap = wdFindStop
    .MatchWildcards = True
  End With
  Do While .Find.Execute
    Set Rng = .Paragraphs(1).Range
    Set Rng = Rng.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel")
    StrOut = StrOut & .Text & vbTab & Rng.Paragraphs.First.Range.ListFormat.ListString & _
      " " & Split(Rng.Text, vbCr)(0) & vbTab & Rng.Information(wdActiveEndPageNumber) & vbCr
  Loop
End With
Set Rng = ActiveDocument.Range.Characters.Last
Rng.Text = StrOut
Set Tbl = Rng.ConvertToTable(Separator:=vbTab)
With Tbl
  .PreferredWidthType = wdPreferredWidthPercent
  .PreferredWidth = 100
  .Columns.PreferredWidthType = wdPreferredWidthPercent
  .Columns(1).PreferredWidth = 20
  .Columns(2).PreferredWidth = 70
  .Columns(3).PreferredWidth = 10
  .Rows(1).Range.Font.Bold = True
  .Rows(1).HeadingFormat = True
  '.Sort ExcludeHeader:=True, FieldNumber:=1
End With
Set Rng = Nothing: Set Tbl = Nothing
Application.ScreenUpdating = True
End Sub

If you want the found text's page # instead of the heading's page #, change Rng.Information to.Information.如果您想要找到文本的页面 # 而不是标题的页面 #,请将 Rng.Information 更改为.Information。

The default sort order is by reference found, regardless of the Reference #, which coincides with sorting by Heading.默认的排序顺序是通过引用找到的,而不管引用号是多少,这与按标题排序是一致的。 The code also includes a commented-out line to sort by Reference # instead.该代码还包含一个注释掉的行,用于按参考编号排序。

You can find the heading level of the section of text you've found using a predefined bookmark .您可以使用预定义的书签找到您找到的文本部分的标题级别。 Since this trick uses the Selection object, you have to transfer the "found text" range to Selection .由于此技巧使用Selection object,因此您必须将“找到的文本”范围转移到Selection This code snippet below shows how:下面的代码片段显示了如何:

Option Explicit

Sub test()
    With ActiveDocument
        Dim foundThis As Range
        Set foundThis = .Range
        With foundThis.Find
            .Text = "<Reference X[0-9]{1,}>"
            .Forward = True
            .MatchWildcards = True
            Do While .Execute
                Dim strFound As String
                Dim heading As String
                strFound = foundThis.Text
                heading = foundThis.GoTo(What:=wdGoToBookmark, _
                                         Name:="\HeadingLevel").Paragraphs(1).Range.Text
                Debug.Print "string found: " & strFound & " on page " & _
                            foundThis.Information(wdActiveEndPageNumber) & _
                            ", Heading: " & heading
            Loop
        End With
    End With
End Sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM