vba: вернуть номер страницы из selection.find, используя текст из массива

(Примечание. См. Решение ниже.)

Я пытался извлечь номера страниц из страниц, на которых находятся различные заголовки в текстовом документе, используя VBA. Мой текущий код возвращает 2 или 3, а не правильно связанные номера страниц, в зависимости от того, где и как я использую его в своей основной подпрограмме.

astrHeadings = docSource.GetCrossReferenceItems(wdRefTypeHeading)

For Each hds In astrHeadings
        docSource.Activate
        With Selection.Find
            .Text = Trim$(hds)
            .Forward = True
            MsgBox hds & ":" & Selection.Information(wdActiveEndPageNumber), vbOKOnly
        End With
        Selection.Find.Execute
Next

docSource это тестовый документ, который я создал с 10 заголовками на 3 страницах. У меня есть заголовки, извлеченные изgetCrossReferenceItems Метод используется позже в моем коде.

Я пытаюсь просмотреть результаты изgetCrossReferenceItems метод и использовать каждый из них в объекте Find наdocSource и из этого выясните, на какой странице находится результат. Номера страниц будут позже использованы в строке в моем коде. Эта строка плюс номер страницы будет добавлена в другой документ, который создается в начале моей основной подпрограммы, все остальное работает, но этот сегмент кода.

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

Проблемы решены

Спасибо, Кевин, вы мне очень помогли, теперь у меня есть именно то, что мне нужно, по результатам этого.Sub

docSource - это тестовый документ, который я создал с 10 заголовками на 3 страницах. docOutline - это новый документ, который будет действовать как оглавление.

Я должен был использовать этоSub над словомs встроенные функции оглавления, потому что:

У меня есть несколько документов для включения, я мог бы использоватьRD поле, чтобы включить их, но

у меня есть другойSub который генерирует настраиваемую десятичную нумерацию страниц в каждом документе 0.0.0 (представитель chapter.section.page), который, чтобы весь пакет документов имел смысл, должен быть включен в оглавление в качестве номеров страниц. Вероятно, есть другой способ сделать это, но я придумал слово "Встроенные функции.

Это станет функцией, которая будет включена в нумерацию моей страницыSub, В настоящее время я нахожусь на 3/4 пути к завершению этого небольшого проекта, последний квартал должен быть простым.

Пересмотрен и убран окончательный кодекс

Public Sub CreateOutline()
' from http://stackoverflow.com/questions/274814/getting-the-headings-from-a-word-document
    Dim docOutline As Word.Document
    Dim docSource As Word.Document
    Dim rng As Word.Range
    Dim strFootNum() As Integer
    Dim astrHeadings As Variant
    Dim strText As String
    Dim intLevel As Integer
    Dim intItem As Integer
    Dim minLevel As Integer
    Dim tabStops As Variant

    Set docSource = ActiveDocument
    Set docOutline = Documents.Add

    minLevel = 5  'levels above this value won't be copied.

    ' Content returns only the
    ' main body of the document, not
    ' the headers and footer.
    Set rng = docOutline.Content
    astrHeadings = docSource.GetCrossReferenceItems(wdRefTypeHeading)

    docSource.Select
    ReDim strFootNum(0 To UBound(astrHeadings))
    For i = 1 To UBound(astrHeadings)
        With Selection.Find
            .Text = Trim(astrHeadings(i))
            .Wrap = wdFindContinue
        End With

        If Selection.Find.Execute = True Then
            strFootNum(i) = Selection.Information(wdActiveEndPageNumber)
        Else
            MsgBox "No selection found", vbOKOnly
        End If
        Selection.Move
    Next

    docOutline.Select

    With Selection.Paragraphs.tabStops
        '.Add Position:=InchesToPoints(2), Alignment:=wdAlignTabLeft
        .Add Position:=InchesToPoints(6), Alignment:=wdAlignTabRight, Leader:=wdTabLeaderDots
    End With

    For intItem = LBound(astrHeadings) To UBound(astrHeadings)
        ' Get the text and the level.
        ' strText = Trim$(astrHeadings(intItem))
        intLevel = GetLevel(CStr(astrHeadings(intItem)))
        ' Test which heading is selected and indent accordingly
        If intLevel 

Ответы на вопрос(1)

Ваш ответ на вопрос