Поиск стиля «Заголовок» в документе Word - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть макрос Word, который позволяет поместить его / ее курсор в любом месте документа Word, и он находит и сохраняет текст Заголовок 1, Заголовок 2 и Заголовок 3, который на выше текст, выбранныйПользователь по порядку захватывает главу, раздел и подраздел, связанный с любым предложением в документе.

В настоящее время я использую приведенный ниже код, который перемещается по документу построчно, пока не будет найден стиль, содержащий «Заголовок х».Когда я выполнил это задание, я переместился на количество строк, которое я переместил, чтобы перейти к заголовку 1, которое может быть много страниц.

Как вы можете себе представить, это неловко, занимает много времени (иногда более 60 секунд) и визуально мешает.

Код ниже - это та подпрограмма, которая идентифицирует заголовок.

 Dim str_heading_txt, hdgn_STYLE As String 
 Dim SELECTION_PG_NO as  Integer 
     hdng_STYLE = Selection.Style
     Do Until Left(hdng_STYLE, 7) = "Heading"
             LINESUP = LINESUP + 1
             Selection.MoveUp Unit:=wdLine, COUNT:=1
             Selection.HomeKey Unit:=wdLine
             Selection.EndKey Unit:=wdLine, Extend:=wdExtend
             hdng_STYLE = Selection.Style
             'reached first page without finding heading
             SELECTION_PG_NO = Selection.Information(wdActiveEndPageNumber)
             If SELECTION_PG_NO = 1 Then     'exit if on first page
        a_stop = True
                 Exit Sub
             End If
     Loop 
     str_heading_txt = Selection.Sentences(1)

Я попробовал другой подход ниже, чтобы устранить проблемы с прокруткой и производительностью, используя команду Range.Find ниже.

У меня проблемы с выбором диапазона выделения для перехода к тексту со стилем "Заголовок 1".Код выбирает предложение при первоначальном выборе, а не текст со стилем «Заголовок 1».

В идеале команда «Найти» приведет меня к любому стилю, содержащему «Заголовок», но при необходимости я могу отдельно кодировать «Заголовок 1», «Заголовок 2» и «Заголовок 3».

Какие изменения в коде необходимы для выбора «Заголовка 1» или, альтернативно, для выбора «Заголовка»?

Dim str_heading_txt, hdgn_STYLE As String
Dim Rng As Range
Dim Fnd As Boolean

Set Rng = Selection.Range
With Rng.Find
    .ClearFormatting
    .Style = "Heading 1"
    .Forward = False
    .Execute

    Fnd = .Found
End With

If Fnd = True Then
    With Rng
        hdng_STYLE = Selection.Style
        str_heading_txt = Selection.Sentences(1)
    End With
End If

Любая помощь искренне приветствуется.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Попробуйте что-нибудь на основе:

Sub Demo()
Dim Rng As Range, StrHd As String, s As Long
s = 10
With Selection
  Set Rng = .Range
  Set Rng = Rng.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel")
  StrHd = Rng.Paragraphs.First.Range.Text
  Do While Right(Rng.Paragraphs.First.Style, 1) > 1
    Rng.End = Rng.Start - 1
    Set Rng = Rng.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel")
    With Rng.Paragraphs.First
      If Right(.Style, 1) < s Then
        s = Right(.Style, 1)
        StrHd = .Range.Text & StrHd
      End If
    End With
  Loop
  MsgBox StrHd
End With
End Sub
0 голосов
/ 14 ноября 2018

Вы можете использовать метод range.GoTo().

Dim rngHead As Range, str_heading_txt As String, hdgn_STYLE As String
Set rngHead = Selection.GoTo(wdGoToHeading, wdGoToPrevious)

'Grab the entire text - headers are considered a paragraph
rngHead.Expand wdParagraph

' Read the text of your heading
str_heading_txt = rngHead.Text

' Read the style (name) of your heading
hdgn_STYLE = rngHead.Style

Я заметил, что вы использовали Selection.Sentences(1) для захвата текста, но заголовки уже по сути являются абзацем - так что вы можете просто использоватьrange.Expand() метод и расширение с использованием wdParagraph


Также, несколько советов:

При объявлении таких переменных, как:

Dim str_heading_txt, hdgn_STYLE As String

Ваше намерение былохорошо, но str_heading_txt фактически был объявлен как тип Variant.К сожалению, с помощью VBA, если вы хотите, чтобы ваши переменные имели определенный тип данных, вы можете объявить об этом индивидуально:

Dim str_heading_txt As String, hdgn_STYLE As String

Или в некоторых типах данных даже есть методы «Сокращения», известные как символы типа:

Dim str_heading_txt$, hdgn_STYLE$

Обратите внимание, как $ был добавлен в конец вашей переменной?Он только что объявил его как String , не требуя As String.

Некоторые общие типовые символы:

  • $ String
  • & Long
  • % Integer
  • ! Single
  • # Double

Вы можете даже добавить их кФактическое значение:

Dim a

a = 5

Debug.Print TypeName(a) 'Prints Integer (default)

a = 5!

Debug.Print TypeName(a) 'Prints Single
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...