Как удалить созданные вручную элементы управления номерами страниц с помощью VBA?

Вопрос или проблема

Я собираюсь создать шаблон для строк, таких как Pg. 125 или Pg. 397, и полагал, что это будет Pg\. ([0-9]{1,3}).

У меня есть документ, в который я вручную вставил различные номера страниц, и числовая часть является простым текстовым управлением содержимым:

Пример повестки дня

Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую модуль поиска и замены со строкой, он не захватывает её. Он захватывает Pg. и ([0-9]{1,3}) отдельно, но не вместе.

В конечном итоге цель состоит в том, чтобы создать макрос VBA, который сбросит номера страниц к их оригинальным текстам-заполнителям и удалит текущие значения, чтобы я мог перенумеровать страницы, когда обновлю шаблон.

Ниже представлен код, который я пытался использовать, но не был успешен:

Sub FindAndEraseValue()
    Dim rng As Range
    Dim pattern As String
    pattern = "Pg. [0-9]{1,3}"
    
    ' Начнем с начала документа
    Set rng = ActiveDocument.Content
    
    With rng.Find
        .ClearFormatting
        .Text = "Pg. [0-9]{1,3}"
        .MatchWildcards = True

        ' Цикл для поиска всех вхождений
        Do While .Execute
            ' Установите диапазон на найденный текст
            Set rng = rng.Duplicate

            ' Определите часть, которую нужно сохранить (часть "Pg.")
            If rng.Text Like "Pg. [0-9]{1,3}" Then
                ' Замените числа на пустую строку
                rng.Text = "Pg. "
            End If
        Loop
    End With
End Sub

Я думаю, что нечто подобное должно сработать:

Sub trickymatch()
Dim r As Word.Range
Dim ccrange As Word.Range
Set r = ActiveDocument.Range
With r.Find
  .ClearFormatting
  .Text = "[0-9]{1,3}"
  .MatchWildcards = True
  Do
    .Execute Forward:=True, Wrap:=wdFindStop
    If .Found Then
      If r.Information(wdInContentControl) Then
        If ActiveDocument.Range(r.Start - 5, r.Start - 1).Text = "Pg. " Then
          Set ccrange = ActiveDocument.Range(r.Start - 1, r.Start).ContentControls(1).Range
          If ccrange = r Then
            r.Text = ""
          End If
          Set ccrange = Nothing
        End If
      End If
    End If
  Loop Until Not .Found
End With
End Sub

Совпадение с использованием подстановочных знаков является проблемой, потому что начало и конец управления содержимым представлены нулевыми символами, и это останавливает процесс сопоставления шаблона от совпадения полного шаблона Pg. [0-9]{1,3}.

Вы можете это увидеть, если выберете, скажем, Pg. 137 в вашем текстовом примере и используете VBA, чтобы посмотреть на Selection.Text и Selection.Characters.

Selection.Text будет Pg. 137, как и ожидалось, а Len(Selection.Text) будет 7.

Но Selection.Characters.Count будет либо 8, либо 9 (в зависимости от того, выбрали ли вы конец управления содержимым или нет). Символы с 1 по 4 будут Pg. , а с 6 по 8 будут 137, но если вы попытаетесь посмотреть на AscW(Selection.Characters(5)), вы увидите ошибку.

Если вы попробуете:

Dim s As String
s = Selection.Characters(5)
Debug.Print Len(s)

Вы, как я думаю, увидите 0. s фактически соответствует vbNullString (а не vbNullChar, что технически отличается).

Кроме того, оператор VBA Like позволяет использовать некоторые подстановочные знаки, но не конструкцию {1,3}, которая у вас в коде.

Так что цель моего кода — искать числовые строки длиной до 3 цифр. Если одна найдена, убедитесь, что она находится в управлении содержимым и предшествует Pg. . Если так, убедитесь, что числовая строка имеет такую же длину, как и содержимое управления содержимым (в противном случае это может быть на самом деле строка из 4 цифр, например). Если так, установите строку на “”).

Это всего лишь быстрая попытка решения. Но в зависимости от вашего текста может быть проще искать текст Pg. и искать следующее управление содержимым.

Ответ или решение

Удаление вручную созданных элементов управления номером страницы с использованием VBA

Необходимость в удалении вручную вставленных номеров страниц, которые оформлены в виде элементов управления содержимым, часто возникает при обновлении шаблонов документов. Наиболее удобным способом решения этой задачи является использование VBA (Visual Basic for Applications). Приведём подробные рекомендации о том, как организовать такой процесс.

Понимание задачи

В вашем случае текст, который нужно найти, имеет определённый шаблон, например Pg. 125 или Pg. 397. Элементы управления содержимым в Microsoft Word обрабатываются несколько иначе, чем обычный текст, поэтому необходимо учитывать особенности их реализации.

VBA Код для удаления номеров страниц

Ниже приведен рабочий код VBA, который позволит вам удалить значения, содержащие номера страниц, и оставить только текст Pg..

Sub RemovePageNumbers()
    Dim doc As Document
    Dim cc As ContentControl
    Dim ccRange As Range
    Dim ccText As String
    Dim pageNumber As String

    ' Устанавливаем текущий документ
    Set doc = ActiveDocument

    ' Перебираем все элементы управления содержимым в документе
    For Each cc In doc.ContentControls
        ' Проверяем, что это текстовое поле
        If cc.Type = wdContentControlText Then
            ccText = cc.Range.Text

            ' Проверяем, начинается ли текст с "Pg." и следует ли за ним номер страницы
            If Left(ccText, 3) = "Pg." Then
                pageNumber = Mid(ccText, 5) ' Извлекаем номер страницы

                ' Проверяем, что номер страницы содержит только цифры и состоит из 1-3 цифр
                If pageNumber Like "[0-9][0-9][0-9]?" Then
                    cc.Range.Text = "Pg. " ' Оставляем только текст "Pg."
                End If
            End If
        End If
    Next cc
End Sub

Объяснение кода

  1. Установка текущего документа: Переменная doc ссылается на активный документ, в котором вы ищете номера страниц.

  2. Перебор элементов управления содержимым: Код проходит через все элементы управления содержимым, используя цикл For Each.

  3. Проверка типа элемента: Мы проверяем, является ли элемент управления текстовым полем (wdContentControlText).

  4. Проверка и удаление номера страницы:

    • Сначала проверяем, начинается ли текст с Pg..
    • Затем извлекаем номер страницы, используя Mid, начиная с 5-го символа.
    • С помощью оператора Like проверяем, соответствует ли номер страницы формату, содержащему от 1 до 3 цифр.
  5. Удаление номера: Если все условия выполняются, элемент управления заменяется на Pg..

Заключение

Использование VBA позволяет эффективно управлять документами Word, автоматизируя процессы, которые могут быть трудоемкими при ручном решении. Данный код позволит вам быстро и просто удалить вручную вставленные номера страниц, сохранив при этом текстовые метки для дальнейшего форматирования.

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

Оцените материал
Добавить комментарий

Капча загружается...