Как определить, является ли предыдущий заголовок в документе заголовком 1 или заголовком 7 через VBA

Мои шаблоны содержат заголовки с 1 по 5 для обычного текста и заголовки приложений (на основе заголовков 7, 8 и 9).

    1. Chapter text
  • Приложение А Текст главы

Подписи к таблицам и рисункам разные: на основе Заголовка 1 или Приложения.

  • Таблица 1.1 или
  • Таблица А.1

Работает отлично. Но... пока у меня есть две кнопки в ленте для вставки заголовка таблицы:

  • Вставить заголовок таблицы
  • Вставить приложение к заголовку таблицы

То же самое для подписи к рисунку.

Должен быть способ определить предыдущий основной заголовок (заголовок 1 или заголовок 7 или уровень структуры 1 или 7), поэтому мне нужна только одна кнопка, чтобы вставить заголовок таблицы (или рисунка). Но я просто не могу найти его.

У кого-нибудь есть ключ? Спасибо. Хельма


person Kem    schedule 24.09.2020    source источник


Ответы (2)


В Word нет определенного свойства, которое вернет предыдущий уровень с уровнем структуры x. Вам нужно будет создать макрос, который зацикливается назад от текущего абзаца, пока не найдет уровень структуры 1 или уровень структуры 7.

Вот два примера функции, которая возвращает true, если предыдущий уровень заголовка был уровня структуры 7, и false, если это был уровень структуры 1. Код компилируется без ошибок и не дает никаких результатов при проверке с помощью инспектора кода RubberDuck.

Option Explicit

'Recursive function

Public Function IsAppendixR(ByVal ipPara As Range) As Boolean

    Select Case ipPara.Paragraphs.Item(1).OutlineLevel
    
        Case 1
            IsAppendixR = False

        Case 7
            IsAppendixR = True

        Case Else
            IsAppendixR = IsAppendixR(ipPara.Previous)
            
    End Select
    
End Function


' Loop version
Public Function IsAppendixL(ByVal ipPara As Range) As Boolean

    Do
        Select Case ipPara.Paragraphs.Item(1).OutlineLevel
    
            Case 1
                IsAppendixL = False
                Exit Function
                
            Case 7
                IsAppendixL = True
                Exit Function

            Case Else
                ipPara.Previous
                
        End Select
        
    Loop
    
End Function
person freeflow    schedule 24.09.2020
comment
Большое спасибо. Оно работает. Я пробовал первый (такой же, как ответ Тимоти ниже). Это именно то, что я искал. Вы оба мне очень помогли своими ответами. Спасибо. - person Kem; 26.09.2020

Word содержит скрытую закладку, которую можно использовать для получения диапазона текущего уровня заголовка. Проверяя уровень структуры первого абзаца в этом диапазоне, вы можете определить, находитесь ли вы в приложении.

Sub TestIsAppendix()
   If IsAppendix(Selection.Range) Then MsgBox "In appendix"
End Sub

Public Function IsAppendix(ByVal para As Range) As Boolean
   Dim headingBlock As Range
   Set headingBlock = para.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel")
   Select Case headingBlock.Paragraphs.Item(1).OutlineLevel
      Case 7 To 9
         IsAppendix = True
      Case Else
         IsAppendix = False
   End Select
End Function
person Timothy Rylatt    schedule 24.09.2020
comment
Большое спасибо. Оно работает. Это именно то, что я искал. Вы и freeflow очень помогли мне своими ответами. Спасибо. - person Kem; 26.09.2020