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