Форум по VBA, Excel и Word

Word => Макросы в Word => Тема начата: Посетитель от 24 января 2023, 10:03

Название: Замена регулярным выражением
Отправлено: Посетитель от 24 января 2023, 10:03
У меня сейчас такая задача: Регулярным выражением превратить фразу:
"Инструкция: Настоящим актом, Заказчик, подтверждает свое согласие с тем что документы предварительно им изучены;Согласовано"
в
"Инструкция: Согласовано"
То что нужно удалить все время разное, приходится копать в сторону регулярок.

Вот пока до чего дошел - не работает.

Макрос
Sub Макрос2()

Dim strOriginal As String 'Оригинальная строка
Dim strResult As String 'Результат после замены
Dim strPattern As String 'Регулярное выражение
Dim strReplace As String 'На что меняем
strOriginal = "Инструкция: Настоящим актом, Заказчик, подтверждает свое согласие с тем что документы предварительно им изучены;Согласовано"


strPattern = "[^;]+"

strReplace = ""
strResult = Replace(strOriginal, strPattern, strReplace)


MsgBox strResult


End Sub
[свернуть]
Название: От: Замена регулярным выражением
Отправлено: Администратор от 24 января 2023, 10:20
В вашем коде Replace - это функция библиотеки VBA, т.е. это VBA.Replace.
У этой функции нет возможности работать с регулярными выражениями. Вот справка по этой функции: https://learn.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/replace-function

Вам нужно использовать библиотеку: Microsoft VBScript Regular Expressions 5.5
Эта библиотека не будет работать на Mac OS, т.к. этой библиотеки нет на этой операционной системе.

Или можно использовать объект Word.Find. В самом Ворде это окно "Найти и заменить". В этом объекте есть возможность использовать регулярные выражения.
Название: От: Замена регулярным выражением
Отправлено: Посетитель от 24 января 2023, 10:37
Я подключил Microsoft VBScript Regular Expressions 5.5
Не подскажете как сделать замену регуляркой?
Название: От: Замена регулярным выражением
Отправлено: Администратор от 24 января 2023, 10:47
Опишите словами, что нужно найти и на что заменить? Опишите словами, что делает это выражение: "[^;]+"
Название: От: Замена регулярным выражением
Отправлено: Посетитель от 24 января 2023, 10:50
Ну я посчитал, что находит во фразе все, что до ";"

И еще вопрос: пытаюсь выполнить макросы с регулярками, которые нашел в интернете, но они все выдают ошибку: compile error
sub or function not defined
Название: От: Замена регулярным выражением
Отправлено: Посетитель от 24 января 2023, 10:50
Регулярным выражением мне нужно превратить фразу:
"Инструкция: Настоящим актом, Заказчик, подтверждает свое согласие с тем что документы предварительно им изучены;Согласовано"
в
"Инструкция: Согласовано"
Название: От: Замена регулярным выражением
Отправлено: Администратор от 24 января 2023, 10:53
Эта часть меняется:? Инструкция: Настоящим актом, Заказчик, подтверждает свое согласие с тем что документы предварительно им изучены

Эта часть постоянная:? ;Согласовано
Название: От: Замена регулярным выражением
Отправлено: Посетитель от 24 января 2023, 10:56
Настоящим актом, Заказчик, подтверждает свое согласие с тем что документы предварительно им изучены
Эта часть все время разная. Все остальное постоянно
Название: От: Замена регулярным выражением
Отправлено: Администратор от 24 января 2023, 10:57
Нужно найти выражение:? Инструкция:Изменяющаяся_часть;Согласовано
И сделать:? Инструкция: Согласовано
Название: От: Замена регулярным выражением
Отправлено: Посетитель от 24 января 2023, 10:58
да, именно
Название: От: Замена регулярным выражением
Отправлено: Администратор от 24 января 2023, 11:08
Написал вам два письма на почту с заголовком "Письмо с Форума по VBA, Excel и Word". Написал именно на почту, а не на форум.

Может быть нет необходимости использовать объект RegExp, а достаточно использовать Word.Find.
Этот макрос делает замену в основной части документа (не в колонтитулах и других местах), во всё тексте.

Макрос
Sub Макрос()

    With ActiveDocument.Range.Find
        .Text = "(Инструкция:)(*;)(Согласовано)"
        .Replacement.Text = "\1 \3"
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
    End With

End Sub
[свернуть]

Но нужно учитывать, что если есть другие выражения, в которых есть фраза "Инструкция:", но нет "Согласовано", то будет сделана замена не там, где надо. Например, в документе десять абзацев. Первый абзац начинается "Инструкция:", но дальше в этом абзаце нет "Согласовано". А согласовано есть в десятом абзаце. То будет удалён весь текст в документе от "Инстрация:" до "Согласовано".

Тогда нужно делать замену не сразу по всему документу, а нужно двигаться по каждому абзацу и уже в каждом абзаце делать замену. Или придумать другое выражение, я пока не знаю, какое.
Название: От: Замена регулярным выражением
Отправлено: Посетитель от 24 января 2023, 11:12
Огромное спасибо за помощь. Почту я утратил
Название: От: Замена регулярным выражением
Отправлено: Администратор от 24 января 2023, 11:15
Я добавил пояснения в сообщение #10.
Название: От: Замена регулярным выражением
Отправлено: Посетитель от 24 января 2023, 11:19
Я понял, спасибо. Пытаюсь вывести результат на экран: MsgBox Text  но выводит исходную фразу
Название: От: Замена регулярным выражением
Отправлено: Администратор от 24 января 2023, 11:22
Не смогу помочь, спросите на другом форуме.