Как вернуть значение первого заголовка, найденного над абзацем в слове, используя vba?

В настоящее время я пишу макрос 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

Таким образом, идея состоит в том, чтобы поместить заголовок абзаца в заголовок 3. Решение должно было бы приспособиться к различным форматам заголовков, поскольку документы, с которыми я работаю, часто имеют форматы заголовков, созданные самостоятельно. Единственное, на что я могу положиться - это заголовки, имеющие заголовок слова в имени стиля. Буду признателен за любую помощь, и, конечно, я могу добавить больше информации, если таковая отсутствует.

1 ответ

Решение

Вы на правильном пути и, кажется, вполне способны писать на VBA, поэтому этот ответ является скорее рекомендательным, чем окончательным.

Определение "Заголовка" в имени стиля может быть вариантом, но только если вы можете полагаться на стили, которые будут правильно названы, чтобы соответствовать этому. В сценариях, где переменные изменчивы (вероятно, изменятся непредсказуемо), существует решение, которое часто не требует слишком больших усилий: попросите пользователя предоставить эту информацию при запуске макроса!

В вашем случае вы упоминаете, что заголовки часто имеют пользовательские форматы, вы можете захватить используемые форматы и предложить пользователю с помощью пользовательской формы определить, какой из этих форматов используется для заголовков абзаца. Используя 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, инструктируя пользователя выбрать, какие стили используются для заголовков. Верните выбор пользователя обратно в ваш макрос и используйте его в качестве сравнения для поиска заголовков.

Другие вопросы по тегам