0

我目前正在为 word 编写一个 vba 宏,它应该获取文档中的所有注释并将它们返回到一个新创建的 excel 文件中。我快完成了,但我遇到了段落指示的问题。我也想将段落对应的标题放在excel中。为此,我必须直接获取段落标题或在段落上方找到第一个与标题相关的格式。至少这些是我能想到的选项。知道如何最好地解决这个问题吗?

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

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

4

1 回答 1

1

You're on the right track and seem fairly capable of writing VBA so this answer is more advisory than definitive.

Identifying "Header" in the style name could be an option, but only if you can rely on the Styles to be correctly named to fit this. In scenarios where variables are volatile (likely to change unpredictably), there's a solution that often doesn't take too much development: Prompt the user to provide this information when running the macro!

In your case you mention that headers often have custom formats, you could grab the used formats and prompt the user with a UserForm to identify which of these formats are used for the paragraph headers. By using Styles in the documents, these are more easily accessed in 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

This will loop through all the paragraphs in the document, and create a unique list (Collection) containing the names of all the styles used within the document. You can then pass this to a UserForm with a MultiSelect ListBox, instructing the user to select which styles are used for headers. Return the users selection back to your macro and use this as your comparison to seek out the headers.

于 2017-06-02T09:08:14.427 回答