Макрос word удалить абзацы в word

VulcanicEskimo

1

Word

Удалить абзац по условию

22.12.2013, 00:47. Показов 17788. Ответов 5


Студворк — интернет-сервис помощи студентам

Здравствуйте, уважаемые форумчане!

Помогите с созданием макроса. Есть файл MS Word, в котором содержится несколько тысяч пунктов (по сути отдельных абзацев). Нужен макрос, который будет удалять абзацы, содержащие определённое слово или словосочетание.

Sasha_Smirnov

5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

22.12.2013, 05:06

2

Создал заново (хоть форумы и кишат…):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Option Explicit     'указание интерпретатору BASIC проверять, что данные объявлены
 
Sub GetOutParagraphsWithUserDefindContent()
Const UDC = "этот абзац я не хочу" 'текст, наличие которого грохает абзац
    Dim i As Long           'счётчик абзацев
    Dim oPars As Object     'переменная для работы с абзацами документа
    Dim oPar As Object      'переменная для работы с каждым абзацем документа
    
    With ActiveDocument 'работаем в активном документе Word
        Set oPars = .Paragraphs
        'переменная oPar стала семейством ActiveDocument.Paragraphs
        .Range.Find.Execute Chr(11), replacewith:=Chr(13), Replace:=wdReplaceAll
        'заменили разрывы строк (код 11) символами абзацев (код 13)
    End With
 
    'Переберём все абзацы и удалим те, в которых есть данный текст
    For Each oPar In oPars
        i = i + 1
    
        If oPars(i).Range.Text Like "*" & UDC & "*" Then
            oPars(i).Range.Delete 'удалили весь абзац, где был текст константы UDC
            i = i - 1       'ненужный абзац удалён - счёт возвращаем назад на единицу
        End If
    Next
End Sub

Миниатюры

Удалить абзац по условию
 

Удалить абзац по условию
 



1



shanemac51

Модератор

Эксперт MS Access

11342 / 4661 / 748

Регистрация: 07.08.2010

Сообщений: 13,508

Записей в блоге: 4

22.12.2013, 14:11

3

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub GetOutParagraphsWithUserDefindContent_131222_1411()
Const UDC = "dao" 'текст, наличие которого грохает абзац
Dim i As Long     'счётчик абзацев
 
With ActiveDocument 'работаем в активном документе Word
    i = .Paragraphs.Count
    '''''''''''''''''''''''''''''''''''''''''это незаконно''''''''
    '.Range.Find.Execute Chr(11), replacewith:=Chr(13), Replace:=wdReplaceAll
    'заменили разрывы строк (код 11) символами абзацев (код 13)
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Переберём все абзацы и удалим те, в которых есть данный текст
    Do While i > 0
        If LCase(.Paragraphs(i).Range.Text) Like "*" & LCase(UDC) & "*" Then
             Debug.Print i, .Paragraphs(i).Range.Text
             .Paragraphs(i).Range.Delete 'удалили весь абзац, где был текст константы UDC
             'ненужный абзац удалён
        End If
        i = i - 1
    Loop
 
End With
 
 
End Sub



0



shanemac51

Модератор

Эксперт MS Access

11342 / 4661 / 748

Регистрация: 07.08.2010

Сообщений: 13,508

Записей в блоге: 4

22.12.2013, 14:26

5

Лучший ответ Сообщение было отмечено как решение

Решение

расширение для удаления выделенного текста
—выделить ненужный кусок теста
—вызвать макрос
—может еще что-то не надо
—вызвать тот же макрос

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub GetOutParagraphsWithUserDefindContent_131222_1411()
dim UDC as string
udc=selection.range.text  'текст, наличие которого грохает абзац
Dim i As Long     'счётчик абзацев
 
With ActiveDocument 'работаем в активном документе Word
    i = .Paragraphs.Count
    '''''''''''''''''''''''''''''''''''''''''это незаконно''''''''
    '.Range.Find.Execute Chr(11), replacewith:=Chr(13), Replace:=wdReplaceAll
    'заменили разрывы строк (код 11) символами абзацев (код 13)
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Переберём все абзацы и удалим те, в которых есть данный текст
    Do While i > 0
        If LCase(.Paragraphs(i).Range.Text) Like "*" & LCase(UDC) & "*" Then
             Debug.Print i, .Paragraphs(i).Range.Text
             .Paragraphs(i).Range.Delete 'удалили весь абзац, где был текст константы UDC
             'ненужный абзац удалён
        End If
        i = i - 1
    Loop
 
End With
 
 
End Sub



2



Sasha_Smirnov

5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

22.12.2013, 14:55

6

Предупредительность — это, конечно, изящно, но рискованно; например:

Цитата
Сообщение от shanemac51
Посмотреть сообщение

Visual Basic
1
LCase

Нужно же предупредить: регистр, мол, не важен! А то будем искать *Вasic* — а найдётся и *basic*!

(На тех же основаниях, на которых вы сочли незаконным мой наворот с переводом строк.)



0



Владимир спрашивает:

Подскажите, что делать в такой ситуации. К примеру, копируем из какого-то другого приложения текст в Word. Зачастую потом приходится с помощью клавиши Delete (иногда в сочетании с пробелом) подтягивать текст, чтобы он нахоился как надо, а не обрывками на каждой строчке. Эту рутичнную работу в принципе можно автоматизировать с помощью Замены. Указать искать знак Конец абзаца и заменить на пустоту (подтянуть и пр.), но тогда в этом случае подтянутся не только строки. но и абзацы. Но абзацы должны оставаться абзацами.

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

Sub delPar() 
Dim sPar As String 
Dim par As Paragraph 
Dim i As Integer 
i = 0 
For Each par In ActiveDocument.Paragraphs 
   If Right(par, 2) = Chr(46) & Chr(13) Then 
       i = i + 1 
   Else 
      If Right(par, 1) = Chr(13) Then 
         par.Range.Text = Replace(par.Range.Text, Chr(13), " ") 
      End If 
   End If 
Next par 
End Sub

Could somebody please help me with a MS Word Macro that would search for a specific symbol in every paragraph throughout the document and delete paragraphs that DO NOT contain that symbol.

I know practically nothing about VBA, but just received a huge & unwieldy document I need to edit real fast.

shruti1810's user avatar

shruti1810

3,8202 gold badges15 silver badges28 bronze badges

asked May 6, 2009 at 14:41

Here’s a quick macro that should do what you want — use with caution, and don’t forget to backup!

Set the value of ‘search’ to be the text that you’re looking for. It’s very crude, and will delete the paragraph if your text does not appear somewhere within it.

Sub DeleteParagraphContainingString()

    Dim search As String
    search = "delete me"

    Dim para As Paragraph
    For Each para In ActiveDocument.Paragraphs

        Dim txt As String
        txt = para.Range.Text

        If Not InStr(LCase(txt), search) Then
            para.Range.Delete
        End If

    Next

End Sub

I’ve tried this on Office 2007. Bit scary, but seems to work!

answered May 6, 2009 at 16:17

Paul Ellery's user avatar

Paul ElleryPaul Ellery

1,6155 gold badges17 silver badges31 bronze badges

0

Paul’s answer is a good start, but I think out of date. I had the same question as the OP, but had to modify Paul’s answer to work in Word 2016. Keep in mind, If InStr returns 0 then it means that it couldn’t find a match, if it returns >0 then it means it did find a match. So if you want to flip the code to delete only found matches, change the ‘=’ to a ‘>’.
I hope this helps future readers.
PS: This code is amazing for helping clean up auto-transcripts from Zoom calls!

   Dim search As String
search = "delete me"

Dim para As Paragraph
For Each para In ActiveDocument.Paragraphs

    Dim txt As String
    txt = para.Range.Text

    If InStr(LCase(txt), LCase(search)) = 0 Then
        para.Range.Delete
    End If

Next

answered Apr 6, 2022 at 18:42

Steven's user avatar

StevenSteven

1501 gold badge2 silver badges14 bronze badges

Sub GetOutParagraphsWithUserDefindContent_131222_1411()
dim UDC as string
udc=selection.range.text  'текст, наличие которого грохает абзац
Dim i As Long     'счётчик абзацев
 
With ActiveDocument 'работаем в активном документе Word
    i = .Paragraphs.Count
    '''''''''''''''''''''''''''''''''''''''''это незаконно''''''''
    '.Range.Find.Execute Chr(11), replacewith:=Chr(13), Replace:=wdReplaceAll
    'заменили разрывы строк (код 11) символами абзацев (код 13)
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Переберём все абзацы и удалим те, в которых есть данный текст
    Do While i > 0
        If LCase(.Paragraphs(i).Range.Text) Like "*" & LCase(UDC) & "*" Then
             Debug.Print i, .Paragraphs(i).Range.Text
             .Paragraphs(i).Range.Delete 'удалили весь абзац, где был текст константы UDC
             'ненужный абзац удалён
        End If
        i = i - 1
    Loop
 
End With
 
 
End Sub

Удаляем пустые абзацы из документа Word

Ужос, что за уродство Word? Понадобилось в большом объёме текста удалить лишние пустые абзацы, вставленные при копировании с Web-страницы после каждой строки. Но на попытку указать ^P (символ «Абзац») в поле «Найти» стандартного окна поиска и замены, Word XP/2003 выдал «^P нельзя использовать как специальный символ в поле Найти». Пришлось быстренько подключить макрос.

Чтобы его «повесить» у себя, зайдите в меню Word Сервис, Макрос, Редактор Visual Basic, вставьте в модуль NewMacros текст процедуры, закройте Visual Basic, в верхнем меню Word зайдите Сервис, Настройка, в категории Макросы найдите макрос delVoidParagraphs и перетащите его иконку из этого окна на нужную панель инструментов Word. Потом правая кнопка на добавленном значке, выбрать Основной стиль, затем так же правой кнопкой можно выбрать или нарисовать значок. Процедура описана для офиса XP/2003, в 2007/10 как-то так же, но неудобней, как и всё в нём.

У меня работает отлично, вот текст макроса:

Sub delVoidParagraphs()
'Удаление пустых абзацев в выделенном фрагменте
With Selection.Find
   .ClearFormatting
   .Replacement.ClearFormatting
   .Text = "^0013{2;}"
   .Replacement.Text = "^p"
   .MatchWildcards = True
   .Format = False
   .Forward = True
   If Selection.Type = wdSelectionIP Then
      .Wrap = wdFindContinue
   Else
      .Wrap = wdFindStop
   End If
   .Execute Replace:=wdReplaceAll
End With
Selection.Collapse direction:=wdCollapseStart
End Sub

Избавиться от лишних символов разрыва строки, которые тоже часто появляются при копировании текста из интернета в Word, ещё проще: окно «Найти и заменить», в поле «Найти» указываем специальный символ ^l (крышечка и буква l — «эль» латинская малая), поле «Заменить на» оставляем пустым и нажимаем кнопку «Заменить всё».

31.01.2011, 16:09 [21220 просмотров]


Понравилась статья? Поделить с друзьями:
  • Макрос word сохранить как pdf
  • Макрос microsoft excel это
  • Макрос word создание нового документа
  • Макрос microsoft excel 2010
  • Макрос word слияние документов