Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 23.03.2023
Сообщений: 7
1
Word

Удаление повторяющихся абзацев с дальнейшей пометкой

07.04.2023, 23:12. Показов 358. Ответов 1

Author24 — интернет-сервис помощи студентам
Здравствуйте. Есть макрос, который удаляет повторяющиеся абзацы и окрашивает первое вхождение этого абзаца. Также есть форма, при помощи которой пользователь контролирует удалять абзац или нет, так как повторы могут быть умышлены. Проблема в следующем: макрос запускается, но находит не все повторы и окрашивает в черный, хотя хочется в желтенький. Вот сам код:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Public FormChsn As Byte
Sub AAA1()
'
' SerADel Макрос
'
'
 
    Dim i, k, parLen(), parNum, markedNum As Integer, a As String, clr As Variant, matchfound, cnt As Boolean
 
    markedNum = 0 ' Счетчик первых вхождений
    With ActiveDocument
    parNum = .Paragraphs.count
    ReDim parLen(parNum)
    For i = 1 To parNum
        If Not .Paragraphs(i).Range.Information(wdWithInTable) Then _
            parLen(i) = Len(.Paragraphs(i).Range.Text)
    Next
    For i = 1 To parNum
        If parLen(i) > 1 Then 'непустой и непомеченный
            curParLen = parLen(i)
            a = ""
            matchfound = False
            cnt = False
            For k = i + 1 To parNum
                If parLen(k) = curParLen Then 'может быть совпадение!
                    If a = "" Then
                        a = .Paragraphs(i).Range.Text
                    End If
                    If a = .Paragraphs(k).Range.Text Then
                        matchfound = True
                        .Paragraphs(k).Range.Select
                        If cnt Then
                            parLen(k) = 0 'помечяем абзац как закрашенный
                        Else
                            FormQ.Show
                            If FormChsn = 1 Then ' выбрано удалить
                                .Paragraphs(k).Range.Delete
                            ElseIf FormChsn = 2 Then 'выбрано пропустить
                                parLen(k) = 0 'помечяем абзац
                            Else 'выбрано пропустить все
                                cnt = True
                                parLen(k) = 0
                            End If
                        End If
                    End If
                End If
            Next
            If matchfound Then
                markedNum = markedNum + 1
                .Paragraphs(i).Range.Shading.BackgroundPatternColor = wdColorYellow25 'Цвет для обозначения первого вхождения
            End If
        End If
    Next
    MsgBox "Найдено повторяющихся абзацев: " & markedNum, , "Готово"
End With
End Sub
Также вот форма:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub CommandButton1_Click()
    FormChsn = 1
    FormQ.Hide
End Sub
 
Private Sub CommandButton2_Click()
    FormChsn = 2
    FormQ.Hide
End Sub
 
Private Sub CommandButton3_Click()
    FormChsn = 3
    FormQ.Hide
End Sub
Прилагаю также файл, на котором делались проверки и скрин формы, ну точнее как она выглядит, вдруг кому-то надо
Мне кажется, что это из-за того, что я удаляю некоторые абзацы, но тогда как же это исправить? Или всё-таки дело в другом. Помогите пожалуйста.
Миниатюры
Удаление повторяющихся абзацев с дальнейшей пометкой  
Вложения
Тип файла: docx Сем3.docx (16.6 Кб, 5 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2023, 23:12
Ответы с готовыми решениями:

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

Как удалить объекты с пометкой на удаление?
Работаю недавно в 8.2 редактировала управление торговлей, теперь не знаю как быть. вот моя...

Удаление всех абзацев в строке
Есть строка символов. Из неё нужно удалить все теги <p> </p> и весь текст который заключен между...

Удаление условно пустых абзацев в документе
Уважаемые форумчане, ай нид хелп... Стоит задача.. Есть Word документ, генерируемый из БД, в нем...

1
Модератор
Эксперт MS Access
11963 / 4831 / 779
Регистрация: 07.08.2010
Сообщений: 14,149
Записей в блоге: 4
08.04.2023, 12:05 2
Цитата Сообщение от SO4HYY Посмотреть сообщение
Мне кажется, что это из-за того, что я удаляю некоторые абзацы, но тогда как же это исправить?
удалять надо, идя с последнего абзаца к первому, после всей обработки
в основном цикле абзац надо помечать на удаление, например
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
              If FormChsn = 1 Then ' выбрано удалить
                '.Paragraphs(k).Range.Delete
                parLen(k) = -2  'пометка удалить
              ElseIf FormChsn = 2 Then 'выбрано пропустить
                parLen(k) = -1 'помечяем абзац
              Else 'выбрано пропустить все
                cnt = True
                parLen(k) = -1
              End If
            End If
''''''''''''''''''''''''''''''''''''''''''''
  Debug.Print "Найдено повторяющихся абзацев: " & markedNum, , "Готово"
  For i = parNum To 1 Step -1
  If parLen(i) = -2 Then
  Debug.Print Mid(.Paragraphs(i).Range.Text, 1, 30)
  .Paragraphs(i).Range.Delete
  End If
  Next i
  
End With
End Sub
0
08.04.2023, 12:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2023, 12:05
Помогаю со студенческими работами здесь

Макросы в word: сколько в тексте абзацев и есть ли среди этих абзацев хотя бы один, длиннее 200 символов
Написать макрос, который по произвольному тексту определяет, имеет ли этот текст определенные...

Удаление повторяющихся элементов
Имеется текст: ads.57-ads.57 ads.51-ads.48 ads.51-max2.K13 ads.50-ads.50 ads.50-ads.47...

Удаление повторяющихся точек
в общем, делаю курсовик, вот его задание: "Даны N точек на плоскости. Для всех треугольников,...

Удаление повторяющихся чисел
вот мой код vector<int> array; ifstream f("test.txt"); while (!f.eof()) { int tmp; f >>...

Удаление повторяющихся записей
Здравствуйте! есть запрос, который выбирает повторяющиеся записи SELECT * FROM `test` GROUP...

Удаление повторяющихся значений
Кто нибудь знает SQL запрос на удаление повторяющихся значений, если допустим в табилице у...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru