1

Тема: Прошу помочь с поиском и заменой абзацев и определенного текста

Вопрос от Владимира:
Помогите, пожалуйста, с макросом для Word 2003!
В большом документе надо отыскивать абзацы, написанные прописными буквами и задавать им определённый стиль (не зашитый в редактор, а пользовательский). Именно абзацы, состоящие только из прописных. То есть ^pИВАНОВ, ПЕТРОВ, СИДОРОВ^p ("ИВАНОВ, Петров, СИДОРОВ" менять не надо).
Кроме того, надо находить служебную строку ("Отчёт") и _предыдущему_ абзацу присваивать другой стиль, тоже пользовательский. Моих знаний явно не хватает. Строка для поиска ^13^13 не работает, потому что под звёздочкой понимаются любые символы, без учёта регистра. Причём искать надо от стандартной шапки до стандартного конца документа (и то и другое - не меняющиеся строки, разумеется).

Такая вот простая проблема, о которую я сломал и зубы, и голову. Или хотя бы подскажите, в каком направлении копать. Как искать ПРОПИСНОЙ АБЗАЦ, чтоб ему пусто было?

2

Re: Прошу помочь с поиском и заменой абзацев и определенного текста

Можно использовать такой шаблон для поиска с подстановочными знаками:
[А-ЯЁ][.," \-А-ЯЁ]@^0013
Но просто поиском и заменой не получится — нужно писать макрос. Для макроса желательно уточнить, какие ещё символы, кроме букв, могут быть в интересующем нас абзаце. Шаблон для поиска макросом такой:

  With Selection.Find
    .Text = "[А-ЯЁ][.,"" \-А-ЯЁ]@^0013"
    .MatchWildcards = True
    While .Execute
      Selection.Paragraphs.First.Style = "Имя стиля абзаца"
      Selection.Collapse wdCollapseEnd
    Wend
    .ClearFormatting
  End With

То же самое со строкой "Отчёт". Поскольку работать нужно с предыдущим абзацем, то тоже только через макрос.

  With ActiveDocument.Range.Find
    .Text = "Отчёт"
     While .Execute
      .Parent.Paragraphs.First.Previous.Style = "Имя стиля абзаца"
    Wend
  End With
Лучше день потерять — потом за пять минут долететь!

3

Re: Прошу помочь с поиском и заменой абзацев и определенного текста

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

Стиль предыдущим абзацам:

Sub стиль_строкам()
'
'--------------------------------------------------------
Dim ring1 As Boolean

   
    Do While Not ring1
    
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "Отчёт"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.TypeText Text:="zzzqqq"
    Selection.HomeKey Unit:=wdLine
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "<*>"
        .Forward = False
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.Style = ActiveDocument.Styles("leader_styler")
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "Отчёт"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveDown Unit:=wdLine, Count:=1

If Not Selection.Find.Found Then
    
            stopper = True
    
    End If

   
    Loop

Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "zzzqqq"
        .Replacement.Text = "Отчёт"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Абзацы прописных:

Sub строки2()
'
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Style = ActiveDocument.Styles("Заглавные")
    'Selection.Find.Replacement.ParagraphFormat.Borders.Shadow = False
    With Selection.Find
        .Text = "^13<[А-Я,0-9^32^=^+\!;:-]@>^13"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub