Word поиск конца строки

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

1 05.02.2010 18:15:40

  • Penniwise
  • сержант
  • Неактивен
  • Зарегистрирован: 04.02.2010
  • Сообщений: 23

Тема: Определение конца строки

Благодарю за грамотный, познавательный, интереснейший сайт. Наткнулся на него пару недель назад, с жадностью впитываю новую для себя информацию…
Дабы не обременять однотипными вопросами админов пытался найти ответ на интересующую меня тему, но не найдя, решил-таки обратиться с вопросом…
Увлёкся форматированием текста (использую замену, в т. ч. в необходимых случаях с использованием подстановочных знаков). Коснулся вопросов расстановки пробелов. Повсеместная расстановка неразрывных пробелов после предлогов, союзов и частиц (далее — ПСЧ) визуально портит текст ввиду особенности этого неразрывного пробела — он нерастягиваемый. Поэтому решил, что было бы неплохо расставлять их только в конце строки.
Вопрос:
Как определить конец строки, которую завершает ПСЧ, и проставить в этом случае неразрывный пробел перед этими ПСЧ? Если не трудно, приведите, пожалуйста, пример такового кода макроса.

2 Ответ от Вождь 05.02.2010 18:52:09

  • Определение конца строки
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 07.01.2010
  • Сообщений: 745
  • Поблагодарили: 181

Re: Определение конца строки

Поможет функция:

Она возвращает True в месте, где текст переходит на следующую строку. Не путать с концом строки! Например, если вставлен символ разрыва строки, то Selection.IPAtEndOfLine=False.
Для перемещения в конец строки к подойдет функция:

Selection.EndOf Unit:=Word.wdLine, Extend:=Word.wdMove

Как перейти на следующую строку думаю догадаетесь…

P.S. Я писал похожий макрос, но до концов строк не додумался. Зато реализовал прикрепление: номеров (Глава 1, 2 место и т.п.), союзов и частиц, крайних слов (в конце предложения, перед/после скобки, кавычки и т.п.)

Макросы под заказ и готовый пакет — mtdmacro.ru

3 Ответ от Penniwise 09.02.2010 16:16:52

  • Penniwise
  • сержант
  • Неактивен
  • Зарегистрирован: 04.02.2010
  • Сообщений: 23

Re: Определение конца строки

К сожалению, мои познания в VBA пока ещё недостаточны для того, чтобы сделать это самому. Вынужден снова обращаться к Вам за помощью. Имеется вот такой нижеприведённый код. За основу взят код неизвестного мне разработчика.

Sub SimpleReplace(what, forwhat, checkCase)
    exitPoint = False
    With Selection
        With .Find
            .ClearFormatting
            .Text = what
            .Replacement.ClearFormatting
            .Replacement.Text = forwhat
            .Forward = True
            .Wrap = wdFindContinue
            .MatchCase = checkCase
            .MatchWildcards = False 'NEW
            .Execute Replace:=wdReplaceAll
            If Not .Found Then
                exitPoint = True
            End If
        End With
    End With
End Sub

...

If MsgBox("Проставить неразрывный пробел после предлогов?", 308, "Шаг 5 из 6") = vbYes Then
    SimpleReplace " в ", " в^s", True
    SimpleReplace " о ", " о^s", True
    SimpleReplace " к ", " к^s", True
    SimpleReplace " от ", " от^s", True
    SimpleReplace " с ", " с^s", True
'   и так далее нужное мне количество вариантов букв
...
End If

Как я понял, в начале макроса определяется некая процедура SimpleReplace, которая в дальнейшем с успехом применяется в нужном количестве раз.
Ума не приложу, честно говоря, куда «всунуть» эту самую Selection.IAPtEndOfLine.
Можно ли её в саму процедуру SimpleReplace включить?
Задача состоит в том, чтобы после этих букв проставлять «неразрывный пробел» ТОЛЬКО, если они находятся в конце строки и после них стоит «пробел».
Буду благодарен, если подскажете, где могу подробнее про это почитать?

Отредактировано Penniwise (09.02.2010 16:22:48)

4 Ответ от Вождь 09.02.2010 18:50:58

  • Определение конца строки
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 07.01.2010
  • Сообщений: 745
  • Поблагодарили: 181
  • За сообщение: 1

Re: Определение конца строки

Вот замена функции SimpleReplace, делающая замены только в конце строк:

Sub SimpleReplaceAtEndOfLine(what, forwhat, checkCase)
    exitPoint = False
    With Selection
        With .Find
            .ClearFormatting
            .Text = what
            .Replacement.ClearFormatting
            .Replacement.Text = forwhat
            .Forward = True
            .Wrap = wdFindStop
            .MatchCase = checkCase
            .MatchWildcards = False
            Do While .Execute(Replace:=wdReplaceNone)
                exitPoint = True
Dim L&, N&
                L = Selection.Characters.Count
                N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
                If (N = 1) And Selection.IPAtEndOfLine Then
                    Selection.MoveEnd Unit:=Word.wdCharacter, Count:=1 - L - N
                    .Execute Replace:=wdReplaceOne
                Else
                    Selection.MoveEnd Unit:=Word.wdCharacter, Count:=2 - L - N
                End If
            Loop
        End With
    End With
End Sub

Непонятно для чего у вас переменная exitPoint. Я ее воткнул приблизительно. В следующий раз выкладывайте весь код  или компилируемый фрагмент.

Почитать могу посоветовать только Help по VBA встроенный в Word.

Макросы под заказ и готовый пакет — mtdmacro.ru

5 Ответ от Penniwise 09.02.2010 19:48:08

  • Penniwise
  • сержант
  • Неактивен
  • Зарегистрирован: 04.02.2010
  • Сообщений: 23

Re: Определение конца строки

Не получилось.
Выкладываю весь макрос.
Изначальный код не мой, я просто разместил объяву, поэтому возможны переменные, смысл которых я пока не знаю. Главное, что я знаю, что они мне пока не мешают, а код я доработал и он функционирует, в принципе, как мне нужно. Исключение составляет лишь этот противный конец строки.
Искомая задача ставится в шаге 5, 6.

Post’s attachments

Tipografic.bas 20 Кб, 9 скачиваний с 2010-02-09 

You don’t have the permssions to download the attachments of this post.

6 Ответ от Вождь 09.02.2010 20:08:34

  • Определение конца строки
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 07.01.2010
  • Сообщений: 745
  • Поблагодарили: 181

Re: Определение конца строки

Penniwise пишет:

Не получилось…

Да, работать не будет.
Подправьте начало моей процедуры:

Sub SimpleReplaceAtEndOfLine(what, forwhat, checkCase)
    With Selection
        .SetRange 0, 0
        With .Find
...

Макросы под заказ и готовый пакет — mtdmacro.ru

7 Ответ от Penniwise 09.02.2010 23:18:04

  • Penniwise
  • сержант
  • Неактивен
  • Зарегистрирован: 04.02.2010
  • Сообщений: 23

Re: Определение конца строки

Работает!!! (смайлик с выпученными глазами)
Огромное спасибо!!!

8 Ответ от Penniwise 05.03.2010 11:48:07

  • Penniwise
  • сержант
  • Неактивен
  • Зарегистрирован: 04.02.2010
  • Сообщений: 23

Re: Определение конца строки

С момента внедрения данной функции в макрос работать стало приятнее.
Однако, выявлен баг — макрос, выполняя свои итерации, вешает процесс winword.exe, вынуждая жёстко его завершать. Происходит это в случае, когда в документе присутствуют перекрёстные ссылки, оглавление. Курсор «добегает» до какой-нибудь перекрестной ссылки (как правило текстовой и, предположительно, содержащей в себе буквосочетание, которое ищет макрос) и останавливается, продолжая очень часто моргать.
С чем это может быть связано? Как это ликвидировать?

Отредактировано Penniwise (05.03.2010 11:48:38)

9 Ответ от Вождь 05.03.2010 14:35:27

  • Определение конца строки
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 07.01.2010
  • Сообщений: 745
  • Поблагодарили: 181
  • За сообщение: 1

Re: Определение конца строки

Penniwise пишет:

..выявлен баг … в случае, когда … присутствуют … ссылки…

Модификация под ссылки и т.п.:

Sub SimpleReplaceAtEndOfLine(what, forwhat , checkCase)
    With Selection
        .SetRange 0, 0
        With .Find
            .ClearFormatting
            .Text = what
            .Replacement.ClearFormatting
            .Replacement.Text = forwhat
            .Forward = True
            .Wrap = wdFindStop
            .MatchCase = checkCase False
            .MatchWildcards = False
            Do While .Execute(Replace:=wdReplaceNone)
Dim R As Word.Range
Dim EOL As Boolean
Dim N&
                Set R = Selection.Range
                N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
                EOL = Selection.IPAtEndOfLine
                R.Select
                If (N = 1) And EOL Then
                    Selection.Collapse Direction:=Word.wdCollapseStart
                    .Execute Replace:=wdReplaceOne
                Else
                    Selection.Collapse Direction:=Word.wdCollapseEnd
                End If
            Loop
        End With
    End With
End Sub

Отредактировано Вождь (05.03.2010 14:37:38)

Макросы под заказ и готовый пакет — mtdmacro.ru

10 Ответ от Penniwise 12.03.2010 11:14:44

  • Penniwise
  • сержант
  • Неактивен
  • Зарегистрирован: 04.02.2010
  • Сообщений: 23

Re: Определение конца строки

Благодарю. Теперь работает.
Теперь буду сам пытаться разобраться, как сделать, чтобы после отработки макросом этой его части, курсор и экран возвращался бы в то место, с которого он начал выполнение.

11 Ответ от andrkar 15.03.2010 19:34:18

  • andrkar
  • Модератор
  • Неактивен
  • Откуда: Томск
  • Зарегистрирован: 10.03.2010
  • Сообщений: 431
  • Поблагодарили: 26
  • За сообщение: 1

Re: Определение конца строки

может подойдет такое решение для возврата:

1. Добавление закладки
    With CurrentDoc.Bookmarks
        .Add Range:=Selection.Range, Name:=»Имя_закладки» ‘Добавление закладки
        .DefaultSorting = wdSortByName
        .ShowHidden = False
    End With

2. Переход к нужной закладке
   Selection.GoTo What:=wdGoToBookmark, Name:=»Имя_закладки»
    Selection.Find.ClearFormatting
    With Selection.Find
        .Forward = True
        .Wrap = wdFindContinue
    End With

3. Удаление закладки
CurrentDoc.Bookmarks(«Имя_закладки»).Delete ‘ Удаление закладки

12 Ответ от viter.alex 15.03.2010 21:01:20

  • Определение конца строки
  • viter.alex
  • Модератор
  • Неактивен
  • Откуда: Харьков, Украина
  • Зарегистрирован: 21.12.2009
  • Сообщений: 884
  • Поблагодарили: 140

Re: Определение конца строки

Поясню пример andrkar. Т.е. перед выполнением действий с документом, нужно поставить закладку в то место, где находится курсор, а затем, когда всё сделаем, перейти к этой закладке и удалить её.
Эта часть кода для перехода к закладке не нужна:

    With Selection.Find
        .Forward = True
        .Wrap = wdFindContinue
    End With

Лучше день потерять — потом за пять минут долететь!

13 Ответ от andrkar 15.03.2010 21:22:47

  • andrkar
  • Модератор
  • Неактивен
  • Откуда: Томск
  • Зарегистрирован: 10.03.2010
  • Сообщений: 431
  • Поблагодарили: 26

Re: Определение конца строки

Вождь

.MatchCase = checkCase False

у меня vb на данную строку ругается…

14 Ответ от viter.alex 15.03.2010 21:32:05

  • Определение конца строки
  • viter.alex
  • Модератор
  • Неактивен
  • Откуда: Харьков, Украина
  • Зарегистрирован: 21.12.2009
  • Сообщений: 884
  • Поблагодарили: 140
  • За сообщение: 1

Re: Определение конца строки

False удали

Лучше день потерять — потом за пять минут долететь!

15 Ответ от Penniwise 25.03.2010 17:01:24

  • Penniwise
  • сержант
  • Неактивен
  • Зарегистрирован: 04.02.2010
  • Сообщений: 23

Re: Определение конца строки

На сообщение от 15.03.2010 20:34:18:
По поводу CurrentDoc.Bookmarks у меня говорит, что Variable not defined.
А как что её определить я не знаю.

16 Ответ от andrkar 25.03.2010 19:01:13

  • andrkar
  • Модератор
  • Неактивен
  • Откуда: Томск
  • Зарегистрирован: 10.03.2010
  • Сообщений: 431
  • Поблагодарили: 26

Re: Определение конца строки

Ну конечно будет выдавать.. Нужно еще вот что сделать:

Dim CurrentDoc As Document
Set CurrentDoc = ActiveDocument

17 Ответ от aequit 08.02.2017 10:53:16

  • aequit
  • сержант
  • Неактивен
  • Зарегистрирован: 31.03.2015
  • Сообщений: 13

Re: Определение конца строки

Вождь пишет:

Модификация под ссылки и т.п.:

Столкнулся с необходимостью поиска и замены в конце строки с использованием Wildcards. Если изменяю код из 9 сообщения на

то макрос выполняется только до первого совпадения и потом завершается. Как заставить его продолжать работу?
И ещё, можно ли ограничить диапазон поиска и замены только выделением, так как

сразу переносит курсор в начало документа и начинается обработка всего текста документа sad

18 Ответ от Вождь 08.02.2017 12:04:26

  • Определение конца строки
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 07.01.2010
  • Сообщений: 745
  • Поблагодарили: 181
  • За сообщение: 1

Re: Определение конца строки

aequit пишет:

…Если изменяю код из 9 сообщения…то макрос выполняется только до…Как заставить его продолжать работу?…

Откуда ж я знаю, не видя ВАШЕГО кода smile
Хотя бы ВАШИ значения what и forwhat сообщите.

Макросы под заказ и готовый пакет — mtdmacro.ru

19 Ответ от aequit 08.02.2017 12:48:16

  • aequit
  • сержант
  • Неактивен
  • Зарегистрирован: 31.03.2015
  • Сообщений: 13

Re: Определение конца строки

Вождь пишет:

aequit пишет:

…Если изменяю код из 9 сообщения…то макрос выполняется только до…Как заставить его продолжать работу?…

Откуда ж я знаю, не видя ВАШЕГО кода smile
Хотя бы ВАШИ значения what и forwhat сообщите.

Sub test1()
   SimpleReplaceAtEndOfLine1 "([Нн]а)( )", "1^s" 
End Sub
Sub SimpleReplaceAtEndOfLine1(what, forwhat)
    With Selection
        .SetRange 0, 0
        With .Find
            .ClearFormatting
            .Text = what
            .Replacement.ClearFormatting
            .Replacement.Text = forwhat
            .Forward = True
            .Wrap = wdFindStop
            .MatchCase = False
            .MatchWildcards = True
            Do While .Execute(Replace:=wdReplaceNone)
Dim R As Word.Range
Dim EOL As Boolean
Dim N&
                Set R = Selection.Range
                N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
                EOL = Selection.IPAtEndOfLine
                R.Select
                If (N = 1) And EOL Then
                    Selection.Collapse Direction:=Word.wdCollapseStart
                    .Execute Replace:=wdReplaceOne
                Else
                    Selection.Collapse Direction:=Word.wdCollapseEnd
                End If
            Loop
        End With
    End With
End Sub

Если «На» или «на» и после пробел стоят в конце строки, нужно пробел заменить на неразрывный пробел…
Доходит до первого совпадения и останавливается sad
Можно ли ограничить поиск конкретным диапазоном или выделением, чтобы по всему документу не отрабатывал?

20 Ответ от Вождь 08.02.2017 14:38:38

  • Определение конца строки
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 07.01.2010
  • Сообщений: 745
  • Поблагодарили: 181
  • За сообщение: 3

Re: Определение конца строки

Для заданной области и подстановочных знаков, где-то так:

Sub test1()
    ActiveDocument.ActiveWindow.View.Type = wdPrintView
    'ActiveDocument.Range(0, 0).Select
    SimpleReplaceAtEndOfLine1 Selection.Range, "(<[Нн]а)([ ]@<)", "1^s"
End Sub

Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
    Set R = FindRange.Duplicate
    R.Collapse Direction:=wdCollapseStart
    With R.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindStop
        .MatchWildcards = True
        .Text = What
        .Replacement.Text = ForWhat
    End With
    Do While R.End < R.StoryLength - 1
        R.Collapse Direction:=wdCollapseEnd
        R.Find.Execute Replace:=wdReplaceNone
        If R.Find.Found <> True Then Exit Do
        If FindRange.Start < FindRange.End Then
            If R.InRange(FindRange) <> True Then Exit Do
        End If
        ' обработка
        R.Select
        N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
        EOL = Selection.IPAtEndOfLine
        If (N = 1) And EOL Then
            R.Collapse Direction:=wdCollapseStart
            R.Find.Execute Replace:=wdReplaceOne
        End If
    Loop
End Sub

Учтите, что после вставки неразрывного, ваше НА перескочит на следующую строку. Значит, концом строки может стать другое «НА», что стояло перед этим НА. НАдеюсь понятно smile

Макросы под заказ и готовый пакет — mtdmacro.ru

21 Ответ от aequit 08.02.2017 15:54:57

  • aequit
  • сержант
  • Неактивен
  • Зарегистрирован: 31.03.2015
  • Сообщений: 13

Re: Определение конца строки

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

22 Ответ от Forthwalker 21.01.2020 15:54:11

  • Forthwalker
  • рядовой
  • Неактивен
  • Зарегистрирован: 21.01.2020
  • Сообщений: 3

Re: Определение конца строки

Вождь, спасибо большое!
Немножко переработал Ваш код, дополнив его справочником предлогов (в массиве arrWhat, однобуквенные слова там же, в конце) трёхкратным прогоном макроса и проверкой на выделение (останавливает, если обрабатываемый текст не выделен). Надеюсь пригодится народу.
Я — дилетант, потому код не эталонный, возможна критика за неэффективные или некрасивые решения.

Sub PerenosPredlogov()    ActiveDocument.ActiveWindow.View.Type = wdPrintView    'ActiveDocument.Range(0, 0).Select    SimpleReplaceAtEndOfLine1 Selection.Range, "", "1^s"

End Sub

Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
If FindRange.Duplicate = "" Then
MsgBox "Выделите текст!", vbInformation, "Обработка невозможна!"
Exit Sub
End If
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Dim arrWhat
arrWhat = Array("(<[Нн]а)", "(<[Ии]ли)", "(<[Вв]о)", "(<[Вв]иду)", "(<[Вв]опреки)", "(<[Вв]след)", "(<[Вв]следствие)", "(<[Дд]ля)", "(<[Дд]о)", "(<[Ии]з)", "(<[Ии]з-за)", "(<[Зз]а)", "(<[Ии]сключая)", "(<[Кк]о)", "(<[Кк]роме)", "(<[Нн]а)", "(<[Мм]ежду)", "(<[Нн]ад)", "(<[Нн]е)", "(<[Оо]б)", "(<[Оо]бо)", "(<[Оо]коло)", "(<[Оо]т)", "(<[Пп]еред)", "(<[Пп]о)", "(<[Пп]од)", "(<[Пп]ред)", "(<[Пп]ри)", "(<[Пп]ро)", "(<[Пп]ротив)", "(<[Пп]ри)", "(<[а-яА-Яa-zA-Z]{1})")
Dim i As Integer
i = 1
For i = 1 To 3
    For Each mark In arrWhat
    Set R = FindRange.Duplicate
    R.Collapse Direction:=wdCollapseStart
    With R.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindStop
        .MatchWildcards = True
        .Text = mark & "([ ]@<)"
        .Replacement.Text = ForWhat
    End With
    Do While R.End < R.StoryLength - 1
        R.Collapse Direction:=wdCollapseEnd
        R.Find.Execute Replace:=wdReplaceNone
        If R.Find.Found <> True Then Exit Do
        If FindRange.Start < FindRange.End Then
            If R.InRange(FindRange) <> True Then Exit Do
        End If
        ' обработка
        R.Select
        N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
        EOL = Selection.IPAtEndOfLine
        If (N = 1) And EOL Then
            R.Collapse Direction:=wdCollapseStart
            R.Find.Execute Replace:=wdReplaceOne
        End If
    Loop
    Next
i = i + 1
Next
End Sub

23 Ответ от Forthwalker 21.01.2020 16:13:17

  • Forthwalker
  • рядовой
  • Неактивен
  • Зарегистрирован: 21.01.2020
  • Сообщений: 3

Re: Определение конца строки

Может прошлое сообщение отправилось на модерацию, а я этого не понял (тогда прошу простить), потому повторю.
Немножко переделал код Вождя. Добавлен справочник предлогов + однобуквенные слова (массив arrWhat), трёхкратный прогон всего кода. Не профессионал, делал под свои нужды, надеюсь пригодится

Sub PerenosPredlogov()
    ActiveDocument.ActiveWindow.View.Type = wdPrintView
    'ActiveDocument.Range(0, 0).Select
    SimpleReplaceAtEndOfLine1 Selection.Range, "", "1^s"

End Sub

Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
If FindRange.Duplicate = "" Then
MsgBox "Выделите текст!", vbInformation, "Обработка невозможна!"
Exit Sub
End If
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Dim arrWhat
arrWhat = Array("(<[Нн]а)", "(<[Ии]ли)", "(<[Вв]о)", "(<[Вв]иду)", "(<[Вв]опреки)", "(<[Вв]след)", "(<[Вв]следствие)", "(<[Дд]ля)", "(<[Дд]о)", "(<[Ии]з)", "(<[Ии]з-за)", "(<[Зз]а)", "(<[Ии]сключая)", "(<[Кк]о)", "(<[Кк]роме)", "(<[Нн]а)", "(<[Мм]ежду)", "(<[Нн]ад)", "(<[Нн]е)", "(<[Оо]б)", "(<[Оо]бо)", "(<[Оо]коло)", "(<[Оо]т)", "(<[Пп]еред)", "(<[Пп]о)", "(<[Пп]од)", "(<[Пп]ред)", "(<[Пп]ри)", "(<[Пп]ро)", "(<[Пп]ротив)", "(<[Пп]ри)", "(<[а-яА-Яa-zA-Z]{1})")
Dim i As Integer
i = 1
For i = 1 To 3
    For Each mark In arrWhat
    Set R = FindRange.Duplicate
    R.Collapse Direction:=wdCollapseStart
    With R.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindStop
        .MatchWildcards = True
        .Text = mark & "([ ]@<)"
        .Replacement.Text = ForWhat
    End With
    Do While R.End < R.StoryLength - 1
        R.Collapse Direction:=wdCollapseEnd
        R.Find.Execute Replace:=wdReplaceNone
        If R.Find.Found <> True Then Exit Do
        If FindRange.Start < FindRange.End Then
            If R.InRange(FindRange) <> True Then Exit Do
        End If
        ' обработка
        R.Select
        N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
        EOL = Selection.IPAtEndOfLine
        If (N = 1) And EOL Then
            R.Collapse Direction:=wdCollapseStart
            R.Find.Execute Replace:=wdReplaceOne
        End If
    Loop
    Next
i = i + 1
Next
End Sub

24 Ответ от Forthwalker 10.02.2020 14:19:29

  • Forthwalker
  • рядовой
  • Неактивен
  • Зарегистрирован: 21.01.2020
  • Сообщений: 3

Re: Определение конца строки

Переделал код. Теперь словарь на виду (можно редактировать), и код отрабатывает правильно. Добавил подсчёт переносов, отображение прогресса (в статус баре) и финальное сообщение.Советую добавлять код в шаблон Normal, чтобы был доступен во всех документах.

Dim RC As Integer
Sub PerenosPredlogov()
    If VBA.Len(Selection.Range.Text) = 0 Then
    MsgBox "Выделите текст!", vbInformation, "Обработка невозможна!"
    Exit Sub
    End If
ActiveDocument.ActiveWindow.View.Type = wdPrintView
Application.ScreenUpdating = False
Dim FRange As Word.Range
Set FRange = Selection.Range
Dim arrWhat
Dim What$, i As Byte, p%, h%, prog%
'список членов предложения для переноса
    arrWhat = Array(0, "на", "во", "виду", "вопреки", "вслед", "для", "до", "из", "из-за", "за", "ко", "кроме", "на", "между", _
"над", "не", "об", "обо", "около", "от", "перед", "по", "под", "пред", "при", "про", "против", "со", "то", "да", "даже", _
"едва", "если", "затем", "либо", "когда", "как", "однако", "отчего", "перед", "пока", "после", "потому", "так", "также", "тем", _
"тоже", "тогда", "хотя", "чем", "что", "чтоб", "чтобы", "не", "ни", "это", "или") ', "поскольку", "исключая", "вследствие", "притом", "причем")
'переменные для отображения прогресса
p = 0
h = (UBound(arrWhat) + 1) * 3
prog = 0
RC = 0
Application.StatusBar = "Выполнено: 1 %" & ". Количество переносов: " & RC
i = 1
For i = 1 To 3
    For Each mark In arrWhat
        If mark <> 0 Then
        What = "(<[" & UCase(Left(mark, 1)) & Left(mark, 1) & "]" & Mid(mark, 2) & ")([ ]@<)" 'обработка предлогов для regex
        Else
        What = "(<[а-яА-Яa-zA-Z]{1})([ ]@<)" 'одиночные символы
        End If
        SimpleReplaceAtEndOfLine1 FRange, What, "1^s"
        'счёт прогресса
        p = p + 1
        prog = p / h * 100
        Application.StatusBar = "Выполнено: " & prog & "%" & ". Количество переносов: " & RC
     Next
DoEvents
Next i
MsgBox "Выполнено! " & " Количество переносов: " & RC
Application.ScreenUpdating = True
End Sub
Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Set R = FindRange.Duplicate
R.Collapse Direction:=wdCollapseStart
    With R.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindStop
        .MatchWildcards = True
        .Text = What
        .Replacement.Text = ForWhat
    End With
        ' поиск
        Do While R.End < R.StoryLength - 1
            R.Collapse Direction:=wdCollapseEnd
            R.Find.Execute Replace:=wdReplaceNone
            If R.Find.Found <> True Then Exit Do
            If FindRange.Start < FindRange.End Then
                If R.InRange(FindRange) <> True Then Exit Do
            End If
            ' обработка
            R.Select
            N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
            EOL = Selection.IPAtEndOfLine
            If (N = 1) And EOL Then
                R.Collapse Direction:=wdCollapseStart
                R.Find.Execute Replace:=wdReplaceOne
                RC = RC + 1
            End If
        DoEvents
        Loop
End Sub

25 Ответ от aequit 21.01.2021 11:33:32

  • aequit
  • сержант
  • Неактивен
  • Зарегистрирован: 31.03.2015
  • Сообщений: 13

Re: Определение конца строки

Столкнулся с неправильной работой процедуры SimpleReplaceAtEndOfLine1 в случае, если после предлога в конце строки стоит кавычка. Не срабатывает, если, например, в конце строки стоит предлог

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

У Word есть мощные возможности поиска, которые позволяют искать вам текст, числа, форматы, параграфы, разрывы страниц, использовать подстановочные символы, коды полей и многое другое. Используя подстановочные символы, вы можете искать просто всё что угодно в вашем документе. Поскольку функция поиска совмещена с заменой, то вы можете также выполнять весьма замысловатые преобразования текста.

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

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

Подстановочные символы (wildcards) — это * (звёздочка), . (точка) и ? (знак вопроса), которые имеют в регулярных выражениях специальное значение. Например, символ * (звёздочка) обозначает любое количество любых символов, а ? (знак вопроса) означает любой один символ.

Давайте начнём знакомство с продвинутыми возможностями поиска в Word!

Как использовать подстановочные символы в продвинутом поиске

В ленте Word переключитесь на вкладку «Главная» и нажмите кнопку «Заменить»:

В окне «Найти и заменить» кликните «Больше >>», чтобы развернуть диалоговое окно и увидеть дополнительные опции. Если вы увидели кнопку «<< Меньше», значит всё прошло удачно.

В раскрывшемся окне для показа опций поиска, включите флажок «Подстановочные знаки».

Обратите внимание, что после того, как вы включили опцию «Подстановочные знаки», Word сразу под полем «Найти:» показывает, что эта опция включена. Также когда выбран флажок «Подстановочные знаки», некоторые опции становятся недоступными для включения, а именно: «Учитывать регистр», «Только слово целиком», «Учитывать префикс», «Учитывать суффикс».

Теперь нажмите кнопку «Специальный» для просмотра списка подстановочных знаков.

В Word доступны следующие подстановочные символы:

Символ Значение
? Любой знак
[-] Символ в диапазоне
< В начале слова
> В конце слова
() Выражение — единая последовательность символов. Также применяется для обратных ссылок
[!] Не
{;} Число вхождений
@ Предыдущий 1 или более
* Любое число знаков
^t Знак табуляции
^^ Знак крышки
^n Знак столбца
^+ Длинное тире
^= Короткое тире
^g Графический объект
^l Разрыв строки
^m Разрыв страницы / раздела
^~ Неразрывный дефис
^s Неразрывный пробел
^- Мягкий перенос

Наконец выберите подстановочный символ для вставки в ваши критерии поиска. После выбора подстановочного знака, символ добавляется в строку поиска. Когда запомните значения, вы также можете использовать клавиатуру для ввода символов вместо вставки их путём выбора из списка. Меню «Специальный» работает как справка в случае если вы не помните, какие доступны специальные символы и их значения.

Готовые увидеть как работают подстановочные символы? Давайте ознакомимся с конкретными примерами использования регулярных выражений и подстановочных символов в Word.

Для чего используются подстановочные символы?

В меню «Специальный» содержит много специальных символов, которые вы можете использовать для поиска по документу Word, но на самом деле не все они являются подстановочными символами. Большинство из них нужны для поиска каких-то специфичных и, иногда, скрытых символов Word, таких как пробелы, разного вида тире, разрывы страницы.

Здесь мы заострим внимание в первую очередь на подстановочных знаках, которые означают один или более символов текста или модифицируют поиск на основе другого символа в вашем поиске.

Использование звёздочки для указания любого количества символов

Скорее всего, самым часто используемым подстановочным символом для вас станет звёздочка. Она означает, что вы хотите найти любое количество символов. Например, чтобы найти все слова, начинающиеся с «отм», напечатайте «отм*» в строке поиска и затем кликните кнопку «Найти далее». Наше регулярное выражение означает любое количество букв (* звёздочка), следующих после «отм».

В качестве альтернативы ввода символа звёздочки с клавиатуры, вы можете использовать выбор специального символа из списка подстановочных знаком. Вначале наберите «отм» в строке «Найти». Поставьте галочку «Подстановочные знаки». Затем кликните кнопку «Специальный» и выберите «Любое число символов». После этого нажмите кнопку «Найти далее»:

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

Вы должны помнить важную вещь: при включении подстановочных знаков, поиск автоматически становится чувствительным к регистру (такова особенность регулярных выражений, частью которых являются подстановочные символы). Поэтому поиск «отм*» и «Отм*» даст различные результаты.

Использование знака вопроса для поиска определённого количества символов

В то время как звёздочка означает любое количество символов, знак вопроса в регулярном выражении означает единичный (один) символ. Например, если «отм*» будет искать строки начинающиеся с «отм» за которыми идёт любое количество символов, то «отм?» будет искать строки, начинающиеся с «отм», за которой идёт только один символ.

Как и звёздочку, знак вопроса можно использовать в любой части слова — в том числе в начале и в середине.

Также можно использовать вместе несколько знаков вопроса вместе, тогда они будут обозначать несколько букв.

Например, регулярное выражение для поиска «о?о?о» оно означает букву «о», за которой идёт любой символ, затем снова идёт буква «о», затем опять любой символ и затем опять буква «о» найдёт следующие слова:

  • потоков
  • многополосных
  • многополосных
  • которое
  • правового
  • такового
  • такого основания

Можно найти слова с четырьмя буквами «о», шаблон «о?о?о?о»:

  • которого
  • многополосных

Или с тремя буквами «а», шаблон «а?а?а»:

  • наказания
  • задача
  • аппарата
  • высказана
  • началах

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

Например, чтобы найти слова, в которых первая буква «з», затем идёт любой другой символ, а затем буква «к» и вновь любой символ, шаблон для поиска «з?к?» найдёт:

  • закономерности
  • законодательно

Использование знака собачка (@) и фигурных скобок ({ and}) для поиска вхождений предыдущего символа

Вы можете использовать знак собачка (@) для указания одного или более вхождения предыдущего символа. Например, «ro@t» найдёт все слова, которые начинаются на «ro» и заканчиваются на «t» и которые имеют любое количество букв «o» между этими частями. Поэтому по этим условиям поиска будут найдены слова «rot», «root» и даже «roooooot».

Для большего контроля поиска предыдущих символов, вы можете использовать фигурные скобки, внутри которые укажите точное число вхождений предыдущего символа, который вы хотите найти. Например, поиск «ro{2}t» найдёт «root», но не найдёт «rot» или «roooooot».

Также поддерживает синтаксис вида {n;} — означает искать количество вхождений символа более n раз; {;m} — означает искать количество вхождений символа менее m раз; {n;m} — означает искать количество вхождений символа более n раз, но менее m раз.

Чтобы показать более практический пример, немного забежим вперёд, следующий поиск использует набор символов (будут рассмотрены в этой статье чуть ниже), в результате, будут найдены все слова, в которых подряд идут четыре согласных буквы:

[бвгджзйклмнпрстфхцчшщ]{4}

Использование угловых скобок (< и >) для обозначения начала и конца слова

Думаю, вы заметили, особенно когда составляли поисковые запросы со звёздочкой, что пробел считается за обычный символ и могут быть найдены довольно неожиданные фрагменты большого размера, либо фрагменты, состоящие из двух слов. Вы можете использовать угловые скобки (символы «больше чем» и «меньше чем») для обозначения начала и конца слова поиска. Например, вы можете искать «<но>» и Word найдёт все вхождения «но», но не найдёт слова вроде «новости», «законодатель».

Это довольно полезно, но эта техника становится более мощной, когда вы комбинируете её с другими подстановочными символами. Например, с помощью «<з????>» вы можете найти все слова, которые начинаются на «з» и состоят ровно из пяти букв.

Вам необязательно использовать обе угловые скобки в паре. Вы можете обозначить просто только начало или конец слова, используя только одну соответствующую скобку. Например «ство>» найдёт слова

  • руководство
  • множество
  • средство
  • количество

Использование квадратных скобок ([ и ]) для поиска определённых символов или диапазонов символов

Вы можете использовать квадратные скобки для указания любых символов или диапазонов символов. Например «[а]» будет искать любые вхождения буквы «а».

В следующем примере, будет искаться строка, которая начинается на «р», затем идёт любая гласная, а затем снова буква «р»: «р[аеиоуэюя]р»

Далее аналогичный пример, но между буквами «р» должно быть две любых гласных: «р[аеиоуэюя]{2}р», будет найдено, к примеру, слово «приоритет».

Вы также можете искать квадратные скобки для поиска диапазонов символов, например «[a-z]» найдёт любую из этих букв в нижнем регистре. Поиск «[0-9]» найдёт любую из этих цифр.

Пример р[а-и]{2}р найдёт строку, которая начинается и заканчивается на букву «р» между которыми две любые буквы из указанного диапазона.

Следующий пример довольно сложный, но при этом и довольно интересный:

[А-Я]{1}[а-я0-9 ,-]{1;}.

В начале строки должна стоят любая заглавная буква ([А-Я]) ровно один раз ({1}). Затем должны идти маленькие буквы, цифры, пробелы, запятые и тире ([а-я0-9 ,-]) хотя бы один раз и более ({1;}), в самом конце должна стоять точка (.)

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

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

Использование скобок для группировки поисковых терминов в последовательности

Вы можете использовать круглые скобки в вашем поиске для группировки последовательностей символов.

Можно использовать довольно простые шаблоны, например «(го){3;}» найдёт строки, в которых «го» встречается три и более раза подряд.

Но настоящую силу эта конструкция покажет при использовании в операциях поиска и замены.

Показанная далее техника называется «обратные ссылки». Начнём с конкретного примера, чтобы было проще понять. Предположим, нам нужно во всём документе поменять местами два слова, допустим, имя и фамилию. К примеру, во всём тексте множество раз упоминается «Милосердов Алексей», а нам нужно, чтобы было «Алексей Милосердов».

Для этого в строке поиска мы вставляем «(Милосердов) (Алексей)», а в строке «Заменить на» пишем «2 1».

Скобки не участвуют в поиске, то есть в результате будет искаться фраза «Милосердов Алексей» При этом то, что было найдено в первых скобках, будет присвоено как значение «1», а то, что было найдено во вторых скобках, станет значением «2». При этом найденная строка заменится на «Алексей Милосердов».

Можно сделать по-другому, допустим вместо фамилии и имени, я хочу заменить на фамилию и инициалы, тогда в строке поиска я ищу «(Милосердов) (Алексей)», а в строке «Заменить на» пишу «1 А.В.».

В скобках можно писать не только слова, там могут использоваться подстановочные символы в разных сочетаниях, а также кванторы количества. Когда находится целая фраза, то Word автоматически пронумеровывает эти группы слева направо (это происходит «под капотом» — мы это не видим), поэтому в поле «Заменить на» мы можем использовать эти группы по их номеру, перед которым нужно поставить обратный слэш.

Рассмотрим более жизненный пример. Допустим, у нас по всему документу имеются даты вида 31.12.2019 (то есть в формате день.месяц.год), а мы хотим чтобы все эти даты были в формате 2019.12.31 (то есть год.месяц.день).

Тогда для поиска любых дат составляем регулярное выражение с подстановочными символами:

«[0-9]{2}.[0-9]{2}.[0-9]{4}»

«[0-9]» — это диапазон, обозначающий все цифры, «{2}» — это квантор количества, который говорит, что предыдущий символ должен встречаться ровно два раза. То есть будет искаться строка длиной ровно два символа, состоящая из цифр. Затем идёт точка, затем снова аналогичная строка и точка, и в конце строка из четырёх цифр.

Строка подходит для поиска, но чтобы были созданы обратные ссылки, мы заключаем нужные нам элементы в круглые скобки: «([0-9]{2}).([0-9]{2}).([0-9]{4})» — она будет работать точно также, как и предыдущая.

Теперь составляем строку «Заменить на». В начале идёт год, то есть третья группа, она обозначается как «3», затем точка, затем вторая группа, затем опять точка и затем первая группа, получаем «3.2.1».

Используйте обратный слэш () если вам нужно искать символы, которые являются подстановочными знаками

А что если вам нужно найти в документе символ, который используется как подстановочный? Например, если вам нужно найти звёздочку? Если просто её вставите, то она сработает как подстановочный знак и будет найдено всё что угодно. Есть два способа искать символы в их буквальном значении.

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

Заключение

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

Связанные статьи:

  • Как в Microsoft Word сделать массовую замену или удаление текста (74%)
  • Как убрать лишние пробелы в Microsoft Word (74%)
  • Как выделить текст цветом в Word (66.3%)
  • Как вставить музыкальный символ, ноты в Word (57.7%)
  • Как напечатать диапазон страниц документа Word из нескольких разделов (57.7%)
  • Как заблокировать текстовые поля в Word (RANDOM — 50%)

Word: специальные символы и подстановочные знаки

В окне «Найти и заменить» Microsoft Word есть два типа подстановок — специальные символы и подстановочные знаки.
Те и другие можно вводить в строки поиска и замены, включив используя список «Special» («Специальный») в полностью открытом окне «Найти и заменить» (нажать комбинацию клавиш Ctrl+H, потом кнопку «Больше>>«).

Специальные символы — это те, которых нет на клавиатуре или которые нельзя непосредственно вписать в строки поиска/замены,
например, разрыв строки.

Если в окне поиска/замены включен чекбокс Use wildcards (Подстановочные знаки), то можно задавать достаточно сложные условия поиска и замены, потому что подстановчные знаки — это офисная реализация всё тех же регулярных выражений.

Чекбокс "Подстановочные знаки" в работе - убираем лишние пробелы в тексте

Чекбокс «Подстановочные знаки» в работе — убираем лишние пробелы в тексте

Некоторые символы и знаки можно использовать только в строке поиска, а некоторые — только в строке замены.
При этом возможность применения
части символов зависит от того, включен ли чекбокс Use wildcards (Подстановочные знаки).

Полный список подстановок в самом Word отсутствует или я его не нашёл, поэтому ниже приводится более-менее адекватный список, актуальный для всех версий Word плюс немного примеров.

1. Строка поиска
Специальные символы, которые можно использовать только если опция Use wildcards (Подстановочные знаки) выключена

Спец. символы Обозначение (англ.) Обозначение (рус.)
^p Paragraph mark (¶) Конец абзаца (¶)
^? Any character Любой символ
^# Any digit Любая цифра
^$ Any letter Любая буква
^e Endnote mark Концевая сноска
^d Field Поле
^f Footnote mark Нижняя сноска
^b Section break (===End of section===) Разрыв секции
^w Whitespace Любое количество и комбинация обыкновенных и неразрываемых пробелов, табуляций и концов абзаца
Специальные символы, использование которых не зависит от опции Use wildcards (Подстановочные знаки)

Спец. символы Обозначение (англ.) Обозначение (рус.)
^t Tab character Символ табуляции
^a Comment mark Комментарий
^0nnn ANSI or ASCII characters Любой ANSI или ASCII символ с кодом nnn
^^ Caret character Символ ^
^g Graphic Графика
^n Column break (···Column Break···) Разрыв колонки
^l Manual line break Принудительный разрыв строки
^m Manual page break (—Page Break—) Принудительный разрыв страницы (—Page Break—). Если опция Use wildcards включена, то ищет принудительный разрыв и страницы, и секции
^+ Em dash (—) Длинное тире (—). Символ с кодом 0151
^= En dash (–) Короткое тире (–). Символ с кодом 0150
^s Nonbreaking space (°) Неразрывный пробел (°)
^~ Nonbreaking hypen (-) Неразрывный дефис (-)
^- Optional hypen (¬) Мягкий перенос (¬)
Подстановочные знаки, которые можно использовать только если опция Use wildcards (Подстановочные знаки) включена

Подстановочные знаки Обозначение (рус.) Пример строки поиска Примеры результатов поиска (в кавычках)
? Один любой символ б?к «бак», «бок», «бук», «б5к», «б¶к»
* Любое количество любых символов б*к «бык», «бардак», «белый¶
полковник»
[] Один из указанных символов б[аоу]к «бак», «бок», «бук»
[-] Один символ из диапазона.
Диапазон должен быть указан в порядке возрастания кодов символов.
[а-яё] Любая строчная русская буква
[А-ЯЁ] Любая прописная русская буква
[0-9] Любая цифра
[!] Один любой символ, не указанный после восклицательного знака б[!ы]к «бак», «бок», но не «бык»
[!x-z] Один любой символ, не входящий в диапазон, указанный после восклицательного знака [!а-яё]ок «Бок», «Док», но не «бок», «док»
[!0-9] Любой символ, кроме цифр
{n} Строго n вхождений предыдущего символа или выражения.
Выражением является все то, что заключено в круглые скобки. Выражение может состоять как из конкретных символов, так и содержать спец. символы.
10{3} «1000», но не «100», «10000»
10(20){2} «102020», но не «1020», «10202020»
{n;} n и более вхождений предыдущего символа или выражения 10{3;} «1000», «10000», «100000», но не «100»
{n;m} От n до m включительно вхождений предыдущего символа или выражения 10{3;4} «1000», «10000», но не «100», «100000»
@ Ноль или более вхождений предыдущего символа или выражения 10@ «10», «100», «1000», «10000»
< Начало слова <бок «боксёр», но не «колобок»
> Конец слова бок> «колобок», но не «боксёр»
2. Строка замены
Специальные символы, использование которых не зависит от опции Use wildcards (Подстановочные знаки)

Спец. символы Обозначение (англ.) Обозначение (рус.)
^p Paragraph mark (¶) Разрыв абзаца (¶)
^t Tab character Символ табуляции
^0nnn ANSI or ASCII characters Любой ANSI или ASCII символ с кодом nnn
^^ Caret character Символ ^
^c Clipboard contents Содержимое буфера обмена
^& Contents of the Find what box Содержимое строки поиска (или то, что найдено)
^n Column break
(···Column Break···)
Разрыв колонки
^l Manual line break (¿) Принудительный разрыв строки
^m Manual page break (—Page Break—) Принудительный разрыв страницы
^+ Em dash (-) Длинное тире (-). Символ с кодом 0151
^= En dash (–) Короткое тире (–). Символ с кодом 0150
^s Nonbreaking space (°) Неразрывный пробел (°)
^~ Nonbreaking hypen (-) Неразрывный дефис (-)
^- Optional hypen (¬) Мягкий перенос (¬)
Подстановочные знаки, которые можно использовать только если опция Use wildcards (Подстановочные знаки) включена

Спец. символы Обозначение (англ.) Обозначение (рус.)
n Expression n Выражение номер n из строки поиска

Примечание 1. В операторах {n;} и {n;m} точка с запятой означает List separator (Разделитель элементов списка) из настроек операционной системы, зависящих от локали
(например, в США — запятая, в России — точка с запятой).

Примечание 2. Для поиска в документе символов, которые в строке поиска «заняты» как специальные перед ними ставится обратный слэш ().
Например, если включена опция Use wildcards (Подстановочные знаки), для поиска восклицательного знака в строке поиска вводится !

3. Примеры для поиска
Строка поиска Что ищет
[!^0013]^0013[!^0013] Конец абзаца в окружении двух других символов
^0032{2;} Два и более пробелов
[.,:;!?] Знак препинания
<[0-9]@,[0-9]@> Вещественное число, набранное через запятую
<[А-яЁё]@> Русское слово (зависит от кодировки)
4. Примеры для замены

Подстановочные знаки включены!

Строка поиска Строка замены Что заменяет
(^0013){2;} 1 Удаление пустых строк (если они создавались нажатием Enter)
^0032([.,:;!?]) 1 Удаление пробелов перед знаками препинания
([0-9])^0032([0-9]) 1^s2 Замена пробелов между цифрами на неразрывные пробелы
-([0-9]) ^01501 Замена дефисов перед цифрами на правильный символ «минус»
Ивано([а-я]@>) Петро1 Замена Ивановых на Петровых во всех падежах сразу (конечно, фамилии должны склоняться одинаково)
(<[0-9]@).([0-9]@>) 1,2 Замена десятичных точек между цифрами на запятые

24.09.2020, 10:16 [28919 просмотров]


Невозможно использовать встроенный Find Word для определения конца строки, созданной автоматическим макетом Word. Единственный вид «конца строки», который можно найти, — это перенос строки вручную, вставляемый нажатием Shift + Enter. Ручной разрыв строки соответствует специальному символу поиска ^l.

Если вам нужно найти и продолжить до конца строки, вам нужно использовать макрос (VBA). Следующий пример кода делает то, что вам нужно. Обратите внимание, что с кодом как он есть по завершении макроса будет выбрано только последнее вхождение поискового запроса. Вам нужно встроить в него конечный результат, который вы ищете.

Или просто удалите строки Do While и Loop, и макрос найдет первый член.

Sub FindThenToEndOfLine()
    Dim r As Range, rDoc As Word.Range
    Dim bFound As Boolean

    bFound = True
    Set r = ActiveDocument.content
    Set rDoc = r.Duplicate

    r.Find.ClearFormatting
    Do While bFound
        With r.Find
            .text = "Fedora[0-9][0-9]:[a-z]*[A-Z]*" 
            .Forward = True
            .wrap = wdFindStop
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = True
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            bFound = .Execute
        End With

        If bFound Then
            r.Select
            Selection.EndKey Unit:=wdLine, Extend:=True
        End If
    Loop
End Sub

#regex #vba #ms-word #newline #wildcard

Вопрос:

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

 These are numbers: one, two, three
These are colors: yellow, blue, green
 

Я хочу найти строку «числа: один, два, три», и я использовал следующий шаблон:

 Public Sub TEST()
        
    Set regex = CreateObject("VBScript.RegExp")
    regex.Global = True
    
    For Each Match In findRegEx(ActiveDocument.Range, "numbers: .*")
        Debug.Print Match.Value
    Next
End Sub
 

Все объяснения метасимвола «подстановочный знак», которые я нашел, наводят меня на мысль, что он будет находить все символы, кроме символов новой строки, но этот шаблон также возвращает вторую строку вместо только первой. Я не уверен, правильно ли я понимаю природу подстановочного знака или новых строк в Word.

Комментарии:

1. Пожалуйста, укажите код, который вы используете для запуска этого регулярного выражения, а не только само регулярное выражение.

2. может быть, использовать numbers: .*r для вашего регулярного выражения?

3. Я попробовал r , но и это не сработало.

4. Является ли конец строки на самом деле возвратом каретки или чем-то еще?

5. Вот в чем вопрос, я не знаю, что именно обозначает конец строки. Я пробовал r , n , vbCr , vbNewline , и Chr(13) , и ни один из них не дал желаемого результата.

Ответ №1:

Попросите регулярное выражение не совпадать с символом конца строки.

Поэтому замените "numbers: .*" , "numbers: [^n]*" что можно прочитать как «сопоставьте строки, начинающиеся с»чисел:», и любой символ, не являющийся символом конца строки».

Если в вашей строке используются другие символы конца строки , вам придется настроить n на один или комбинацию , возможно, в обычном случае n r.

Не пытайтесь использовать vbCr vbNewLine или Chr(13) как часть определения шаблона — это литералы. Синтаксис регулярных выражений ожидает, что эти значения будут обозначаться специальными символами.


Обратите внимание, что после двоеточия»: «стоит пробел.

Комментарии:

1. Это сработало! Почти. единственный символ конца строки, который я могу заставить работать,-это Chr(13): "numbers: [^] amp; Chr(13) amp; "]*" Это работает так, как задумано. Спасибо!

2. Спасибо, Доминик — я исправлю ответ, как только проверю некоторые детали.

Понравилась статья? Поделить с друзьями:
  • Word поиск доступных принтеров
  • Word поиск в надписи
  • Word позволяет форматировать документы на уровне
  • Word позволяет создать списки
  • Word позволяет создавать списки какие