Как сопоставить шаблон с неизвестным количеством символов - PullRequest
1 голос
/ 05 апреля 2020

Во-первых, я не очень опытен в программировании. У меня есть несколько макросов, чтобы помочь мне в работе, но мне нужны были четкие примеры для их создания.

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

Я просматривал сайт и онлайн, но не вижу как сделать это с неизвестным количеством подчеркиваний.

Если бы кто-то мог указать мне правильное направление, я был бы очень благодарен. Спасибо.

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Все, что вам нужно сделать, это использовать символы подстановки!

Эта строка кода может сделать это:

ActiveDocument.Content.Find.Execute "_{5,30}", _
    MatchWildcards:=True, Replace:=wdReplaceAll, _
    ReplaceWith:="__________", Wrap:=wdFindContinue

Примечание:

Часть {5,30} оставил бы подчеркивания менее 5 или более 30.

Вы можете изменить его на {,30}, чтобы заменить 30 или менее подчеркиваний

или {1,}, чтобы заменить 1 или более подчеркиваний

Простую статью о подстановочных знаках можно найти здесь .

1 голос
/ 05 апреля 2020

Вы можете

1) заменить все "двойные" подчеркивания на "одинарные", пока не сохранятся только "одиночные" подчеркивания

2) заменить все "одиночные" подчеркивания на "_____"

With Selection.Find
    .ClearFormatting
    .Replacement.ClearFormatting

    Do
        .Text = "__"
        .Replacement.Text = "_"
        .Wrap = wdFindContinue
        .Format = False
        .MatchWholeWord = False

        .Execute Replace:=wdReplaceAll
    Loop While .Found

    .Text = "_"
    .Replacement.Text = "_____"
    .Wrap = wdFindContinue
    .Format = False
    .MatchWholeWord = False

    .Execute Replace:=wdReplaceAll

End With

измените Selection на фактическую часть документа, с которой вы хотите иметь дело (для instace ActiveDocument.Content для всего документа

...