Вопрос или проблема
Я собираюсь создать шаблон для строк, таких как 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
Объяснение кода
-
Установка текущего документа: Переменная
doc
ссылается на активный документ, в котором вы ищете номера страниц. -
Перебор элементов управления содержимым: Код проходит через все элементы управления содержимым, используя цикл
For Each
. -
Проверка типа элемента: Мы проверяем, является ли элемент управления текстовым полем (
wdContentControlText
). -
Проверка и удаление номера страницы:
- Сначала проверяем, начинается ли текст с
Pg.
. - Затем извлекаем номер страницы, используя
Mid
, начиная с 5-го символа. - С помощью оператора
Like
проверяем, соответствует ли номер страницы формату, содержащему от 1 до 3 цифр.
- Сначала проверяем, начинается ли текст с
-
Удаление номера: Если все условия выполняются, элемент управления заменяется на
Pg.
.
Заключение
Использование VBA позволяет эффективно управлять документами Word, автоматизируя процессы, которые могут быть трудоемкими при ручном решении. Данный код позволит вам быстро и просто удалить вручную вставленные номера страниц, сохранив при этом текстовые метки для дальнейшего форматирования.
На всякий случай, прежде чем запускать макрос, рекомендуется создать резервную копию документа, чтобы избежать нецелевых изменений или потери данных.