Статьи из блога

Статьи из блога

Удаление текста между двумя фрагментами другого текста

Денис интересуется:

Имеется следующая задача: есть документ, в этом документе имеется ненужный текст. Текст соответственно разбросан по всему документу. Перед началом каждого такого "ненужного" текста имеется фрагмент - фрагмент №1, в конце этого "ненужного" текста имеется фрагмент №2 (то есть в начале ненужного текста написано фрагмент №1 , а в конце фрагмент №2). И так по всему документу.

Хотелось бы макрос, который ищет этот "ненужный" текст и удаляет его. И, соответственно, затем (или одной задачей) удалял эти фрагменты - фрагмент №1 и фрагмент №2.

Денис, вот вариант решения (не макрос, так как он излишен в данном случае), подсказанный Александром Витером.

 

Допустим, по вашим условиям у вас имеется в документе такой текст:

"фрагмент №1 некий текст фрагмент №2"

Нужно удалить и "некий текст" и обе надписи "фрагмент".

 

Откройте диалоговое окно Найти и заменить (CTRL+H) и в поле Найти введите следующее выражение:

([Фф]рагмент №1)*([Фф]рагмент №2)

Поле Заменить оставить пустым.

Установить флажок на параметре Подстановочные знаки.

Нажмите кнопку Заменить все и вы получите то, что вы хотели.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

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

  1. Владимир
    11.09.2009 в 07:48 | #1

    А что делать если фрагмент№2 всегда разный? Нужен макрос...

  2. Евгений
    05.11.2009 в 23:35 | #2

    Здравствуйте, а что делать, если мне надо удалить такую штуку:

    *знак обзаца*

    *набор из чисел и знаков пробел* *знак обзаца*

    *знак обзаца*

    Например так:

    *знак обзаца*

    16161 178189 1 *знак обзаца*

    *знак обзаца*

    Вот такое все вместе как удалить? Скажите пожалуйста, буду очень благодарен.

  3. 06.11.2009 в 10:13 | #3

    Евгений, попробуйте в поле "Найти" ввести выражение:

    ^13[0-9]{5}^32[0-9]{6}^32[0-9]{1}^32^13{2}

    а в поле "Заменить" то, на что заменяете или оставьте пустым.

    Установите флажок на опции "Подстановочные знаки".

    П.С. Я взял за основу исключительно ваш пример.

  4. Евгений
    06.11.2009 в 12:58 | #4

    Извините, а не могли бы вы рассказать, что в подстановочных знаках значат такие символы как *знак обзаца*, *пробел*. Вообще, не могли бы вы подсказать расшифровки этих знаков в формуле? Откуда взялись эти знаки и где их посмотреть, если не трудно. Заранее благодарен.

  5. 06.11.2009 в 13:29 | #5

    Евгений, я вам очень рекомендую ознакомиться с этой заметкой и обязательно изучить статью С.Хозяинова (ссылка в заметке).

  6. 06.11.2009 в 13:35 | #6

    В данном случае знак абзаца выражен через код 13, а пробел - 32; числа выражены через диапазон значений (в квадратных скобках), а их количество задано в фигурных скобках.

  7. Евгений
    06.11.2009 в 15:52 | #7

    Спасибо большое!

  8. Георгий
    17.03.2010 в 15:05 | #8

    Появилась очень похажая задача, но после 2-х часов мучений над ней (все ссылки уже изучил здесь) так ничего и не вышло.

    Суть проблемы в следующем. Есть текст такого вида:

    +++++*конец абзаца*

    русская фраза*конец абзаца*

    -----*конец абзаца*

    Нужно каким-то образом пронумеровать все строки "русская фраза".

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

  9. 17.03.2010 в 15:12 | #9

    Георгий, приложите ваш документ. Не забудьте сообщить ссылку на файл.

  10. 17.03.2010 в 15:52 | #10

    Георгий, эту задачу можно решить за два шага.

    Шаг первый:

    Ищете текст тем выражением, которое работает, но его нужно немного изменить:

    (^0013?)(русская фраза)(^0013) и делаем замену таким выражением(пока без форматирования): \1@#$%\2@#$%\3. Тем самым русская фраза станет уникальной и её можно будет найти не привязываясь к другим элементам текста.

    Шаг второй:

    Ищем выражение (@#$%)(русская фраза)(@#$%) и заменяем на \2, но уже с нужным форматированием. Я так понял, вы хотите применить стиль нумерованного списка?

    Вместо @#$% можно использовать любые другие сочетания символов, которые точно не встречаются в документе.

  11. Георгий
    17.03.2010 в 15:57 | #11

    Антон, спасибо, что отозвались, без вас у меня никак ничего не получается :)

    Эх, не хотел захлямлять комментарии, но видимо придётся. Структуру файлика залил: http://slil.ru/28809888

    Теперь что касается конечного результат, собственно самой цели, которую нужно достичь. Нужно пронумеровать все названия в тексте, причём не обычной нумерацией, а просто поставив некий счётчик после названия, т.е. "Название 01", "Название 02" и т.д. После этого всё экспортируется в обычный текстовый документ. Я разбил задачу на 2 этапа:

    1. В ворде пронумеровать все названия и экспотировать результат в текст.

    2. В новом созданном текстовом документе (обычный текст) поменять местами число перед названием и само название. Для этого этапа шаблон для поиска и замены сделать у меня получилось.

    В идеале было бы здорово создать макрос, но времени на изучение уйдёт куда больше, чем несколько раз в неделю всё делать ручками.

    Такая вот ситуация.

  12. Георгий
    17.03.2010 в 16:00 | #12

    Александр, спасибо!

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

  13. 18.03.2010 в 09:24 | #13

    Что ж, Георгий, здесь без макроса не обойтись:

    Sub AutoNumberCaptions()
      Selection.HomeKey wdStory
      With Selection.Find
        .ClearFormatting 'Очищаем форматирование поиска
        .Text = "Название текста^p" 'Искомое выражение
        'Делаем, пока выражение найдено
        While .Execute
          With Selection
            .Collapse wdCollapseStart 'снимаем выделение
            'Добавляем поле SEQ для последовательной нумерации
            .Fields.Add .Range, wdFieldSequence, "МоёНазвание " & "\# 00"
            'После поля ставим неразрывный пробел
            .TypeText ChrW(160)
            'Перемещаем курсор в конец абзаца для продолжения поиска
            .EndOf wdParagraph
          End With
        Wend
        .ClearFormatting
        .Execute
      End With
    End Sub

  14. Георгий
    19.03.2010 в 12:47 | #14

    Александр, огромное спасибо!

    Я немного подправил макрос и всё заработало как положено, теперь куча рутинной работы превратилось в одно нажатие кнопки :)

    Вот что изменил:

    Sub AutoNumberCaptions()
      Selection.HomeKey wdStory
      NameString$ = "Название текста"
      With Selection.Find
        .ClearFormatting 'Очищаем форматирование поиска
        .Text = "^p" + NameString$ + "^p" 'Искомое выражение
        'Делаем, пока выражение найдено
        While .Execute
          With Selection
            .TypeText ChrW(13)
            .TypeText NameString$ + ChrW(160)
            .Fields.Add .Range, wdFieldSequence, "МоёНазвание " & "\# 00"
            'После поля ставим неразрывный пробел
            'Перемещаем курсор в конец абзаца для продолжения поиска
            .EndOf wdParagraph
          End With
        Wend
        .ClearFormatting
        .Execute
      End With
    End Sub

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

  15. 19.03.2010 в 14:34 | #15

    Вот именно потому, что первое выражение не находится, я сделал условие поиска с одним абзацем в конце. Можно, конечно, добавить абзац в начало документа, тогда макрос будет выглядеть так (я так понял, что номер нужнжо ставить после текста):

    Sub AutoNumberCaptions()
      Dim NameString As String 'Объявляем переменную
      'Вставляем абзац в начало документа
      Selection.Document.Range.InsertParagraphBefore
      'Переходим в начало документа
      Selection.HomeKey wdStory
      NameString = "Название текста"
      With Selection.Find
        .ClearFormatting 'Очищаем форматирование поиска
        .Text = "^p" & NameString & "^p" 'Искомое выражение
        'Делаем, пока выражение найдено
        While .Execute
          With Selection
            .EndKey wdLine 'Курсор в конец абзаца
            .TypeText ChrW(160) 'Неразрывный пробел
            .Fields.Add .Range, wdFieldSequence, "МоёНазвание " & "\# 00"
          End With
        Wend
        .ClearFormatting
        .Execute
      End With
      'Удаление первого добавленного абзаца
      Selection.Document.Paragraphs.First.Range.Delete
    End Sub

  16. Георгий
    23.03.2010 в 17:18 | #16

    Александр, протестровал скрипт - это просто нечто, теперь полный автомат. Большое вам спасибо! Всё-таки ворд + vb - это сила.

  17. Аноним
    19.06.2010 в 03:53 | #17

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

    Пример (было):
       Абзац, который трогать нельзя.
       Два-три предложения в сл. абзаце, который нужно сделать полужирным и поставить между ним, и следующим за ним, ключевым словом пустую строку.
       КЛСЛОВО
    Пример (стало):
       Абзац, который трогать нельзя.
       <b>Два-три предложения в сл. абзаце, который нужно сделать полужирным и поставить между ним, и следующим за ним, ключевым словом пустую строку.</b>
       КЛСЛОВО

    p.s.: встроенный в движок сайта редактор удаляет пустые строки…

  18. 20.06.2010 в 13:28 | #18

    Предложу такой вариант:

    Selection.HomeKey wdStory
      With Selection.Find
        .Text = "КЛСЛОВО"
        While .Execute
          Selection.Paragraphs.First.Previous.Range.Font.Bold = True
          Selection.Paragraphs.First.Previous.Range.InsertParagraphAfter
          Selection.Collapse wdCollapseEnd
        Wend
      End With

  19. Сергей
    06.05.2011 в 16:28 | #19

    А у меня немного другая задача - выбрать уникальный текст МЕЖДУ фрагментами. Поможете?

  20. Владислав
    10.08.2011 в 17:52 | #20

    Распознаю словарь. В нем кроме русских статей есть примечания на английском. Они выделены квадратными скобками [ и ]. Хотел бы автоматом удалить этот текст, но не получается. Словарь слишком большой (600 стр.) чтобы делать это вручную. Помогите.

  21. Владислав
    12.08.2011 в 20:47 | #21

    решил

  22. Елена
    15.08.2011 в 14:24 | #22

    Доброе время суток, умные люди!

    Может, у кого-то найдётся минутка помочь "блондинке" с макросом? :)

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

    Например:

    «Американский пирог» (American Pie) США, 1999 г.

    А нужно:

    «Американский пирог» США, 1999 г.

    Заранее спасибо!

  23. Елена
    15.08.2011 в 15:45 | #23

    Спасибо всем за внимание. Ничто так не стимулирует мозг, как признание себя "блондинкой". Если кому интересно решение этой задачки:

    With Selection.Find

    .Text = " \(([A-Za-z0-9-:.,'\?\! ]{1;})\)"

    .Replacement.Text = ""

    .MatchWildcards = True

    .Wrap = wdFindContinue

    End With

Оставьте комментарий!

(обязательно)

^ Наверх