如何使用 vba return 找到 word 中段落上方第一个 header 的值?

How to return the value of the first header found above a paragraph in word using vba?

我目前正在为 word 写一个 vba 宏,它应该获取文档中的所有评论,并 return 它们在新创建的 excel 文件中。我快完成了,但我 运行 遇到了段落指示的问题。我想把 header 对应的段落也放在 excel 中。为此,我必须直接获取段落 header 或在段落上方找到第一个 header-related 格式。至少那些是我能想到的选择。知道如何最好地解决这个问题吗?

Sub exportComments()

Dim xlApp As Object
Dim xlWB As Object
Dim i As Integer, HeadingRow As Integer
Dim objPara As Paragraph
Dim objComment As Comment
Dim strSection As String
Dim strTemp
Dim myRange As Range
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlWB = xlApp.Workbooks.Add 'create a new workbook
With xlWB.Worksheets(1)
' Create Heading
    HeadingRow = 1
    .Cells(HeadingRow, 1).Formula = "Comment"
    .Cells(HeadingRow, 2).Formula = "Page"
    .Cells(HeadingRow, 3).Formula = "Paragraph"
    .Cells(HeadingRow, 4).Formula = "Commented part"
    .Cells(HeadingRow, 5).Formula = "Comment"
    .Cells(HeadingRow, 6).Formula = "Reviewer"
    .Cells(HeadingRow, 7).Formula = "Date"
    strSection = "preamble" 'all sections before "1." will be labeled as "preamble"
    strTemp = "preamble"
    If ActiveDocument.Comments.Count = 0 Then
        MsgBox ("No comments")
        Exit Sub
    End If
    For i = 1 To ActiveDocument.Comments.Count
        Set myRange = ActiveDocument.Comments(i).Scope
        strSection = ParentLevel(myRange.Paragraphs(1))
        'MsgBox strSection
        'Comment line
        .Cells(i + HeadingRow, 1).Formula = ActiveDocument.Comments(i).Index
        'Page number line
        .Cells(i + HeadingRow, 2).Formula = ActiveDocument.Comments(i).Reference.Information(wdActiveEndAdjustedPageNumber)
        'Paragraph indicator line
        .Cells(i + HeadingRow, 3).Formula = ActiveDocument.Comments(i).Scope.Paragraphs(1)
        'Commented part line
        .Cells(i + HeadingRow, 4).Formula = ActiveDocument.Comments(i).Scope.FormattedText
        'Comment value line
        .Cells(i + HeadingRow, 5).Formula = ActiveDocument.Comments(i).Range
        'Comment reviewer line
        .Cells(i + HeadingRow, 6).Formula = ActiveDocument.Comments(i).Author
        'Comment date line
        .Cells(i + HeadingRow, 7).Formula = Format(ActiveDocument.Comments(i).Date, "dd/MM/yyyy")
    Next i
End With
Set xlWB = Nothing
Set xlApp = Nothing
End Sub

Function ParentLevel(Para As Word.Paragraph) As String
    ' Finds the first paragraph of the current section
    Dim oSection As Section
    Dim iSection As Integer
    Dim lngPara As Long
    Dim oRng As Range, oPara As Range
        iSection = Para.Range.Information(wdActiveEndSectionNumber)
        Set oSection = ActiveDocument.Sections(iSection)
        Set oRng = oSection.Range
        For lngPara = 1 To oRng.Paragraphs.Count
            Set oPara = oRng.Paragraphs(lngPara).Range
            If Len(oPara) > 1 Then
                Exit For
            End If
        Next lngPara
        oPara.End = oPara.End - 1
        ParentLevel = oPara.Text
    End Function

所以我的想法是将段落 header 放在标题行 3。解决方案必须适应不同的 header 格式,因为我使用的文档通常是自制的 header格式。我唯一可以依赖的是 headers 在样式名称中包含单词 header。任何帮助将不胜感激,当然我可以添加更多信息可能会丢失。

您走在正确的轨道上,并且看起来相当有能力写作 VBA 所以这个答案更多的是咨询而不是决定性的。

在样式名称中识别 "Header" 可能是一种选择,但前提是您可以依靠正确命名的样式来满足此要求。在变量易变(可能会发生不可预测的变化)的场景中,有一个通常不需要太多开发的解决方案:在 运行 宏时提示用户提供此信息!

在您的情况下,您提到 headers 通常有自定义格式,您可以获取使用的格式并使用用户表单提示用户确定段落中使用了哪些格式 headers .通过在文档中使用 Styles,可以更轻松地在 VBA:

中访问它们
Sub getStyles()
    Dim UsedStyles As New Collection
    Dim pgf As Paragraph

    For Each pgf In ActiveDocument.Paragraphs
        UsedStyles.Add pgf.Style.NameLocal
    Next pgf
End Sub

这将遍历文档中的所有段落,并创建一个包含文档中使用的所有样式名称的唯一列表 (Collection)。然后,您可以将其传递给带有 MultiSelect ListBox 的用户窗体,指示用户 select 哪些样式用于 headers。 Return 用户 select 回到您的宏并使用它作为您的比较来找出 headers。