Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2012, 20:08   #1
Dimasick
 
Регистрация: 27.01.2010
Сообщений: 5
Вопрос Выделить текст от слова до нумерованного списка

В документе некоторые абзацы - это часть нумерованного списка в формате "Книга 1", "Книга 2" и т.д. Есть абзацы, начинающиеся словом Автор, словом Аннотация и словом Год. Нужно удалить аннотации и годы. Алгоритмически - это в цикле выделять текст от очередного слова "Аннотация" до ближайшего следующего абзаца, начинающегося как нумерованный список "Книга Х", и выделенный фрагмент удалять.
Подскажите, плз, как это выглядит в VBA?
Здесь фрагмент файла: http://ifolder.ru/28017997
На всякий случай уточню, что Word-2003; ручками это сделать тяжело (в реале в файле много страниц), но, может, можно сделать вордовский макрос?
Dimasick вне форума Ответить с цитированием
Старый 09.01.2012, 20:58   #2
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,166
По умолчанию

начало списка высчитать
конец слова высчитать
а уж какого списка и какого слова только Вы знаете
Ципихович Эндрю вне форума Ответить с цитированием
Старый 09.01.2012, 21:20   #3
Dimasick
 
Регистрация: 27.01.2010
Сообщений: 5
По умолчанию

"начало списка высчитать" - КАК?
"а уж какого списка и какого слова только Вы знаете" - я ж для чего-то выложил ссылку на файл.
Поконкретнее можно?
Dimasick вне форума Ответить с цитированием
Старый 09.01.2012, 22:46   #4
Пименов Александр
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 222
По умолчанию

Код:
Public Sub Macros()
Dim ft As Range, rng As Range
        If InStr(1, Selection.FormattedText.ListFormat.ListString, "Книга") > 0 Then
            Set ft = Selection.FormattedText
        Else
            MsgBox "В нумерации абзаца нет слова «Книга»!!!" & Chr(13) _
                & "Выход из программы!!!", vbCritical
        End If
            For i = 1 To ft.ListFormat.List.ListParagraphs.Count
                Set rng = ActiveDocument.Range(ft.ListFormat.List.ListParagraphs(i).Range.Start, ft.ListFormat.List.ListParagraphs(i).Range.End + 1)
                Set rng = ActiveDocument.Range(rng.Start, rng.Paragraphs(2).Range.End)
                Set rng = ActiveDocument.Range(rng.End + 1, rng.End + 1).Paragraphs(1).Range
                    Debug.Print rng.Words(1).Text
                    Do
                        If InStr(1, rng.Words(1).Text, "Аннотация") > 0 Or InStr(1, rng.Words(1).Text, "Год") > 0 Then
                            rng.Delete
                            Set rng = ActiveDocument.Range(ft.ListFormat.List.ListParagraphs(i).Range.Start, ft.ListFormat.List.ListParagraphs(i).Range.End + 1)
                            Set rng = ActiveDocument.Range(rng.Start, rng.Paragraphs(2).Range.End)
                            Set rng = ActiveDocument.Range(rng.End + 1, rng.End + 1).Paragraphs(1).Range
                            Debug.Print rng.Words(1).Text
                        Else
                            Exit Do
                        End If
                     Loop
            Next i
       j = ft.ListFormat.List.ListParagraphs.Count
            Set rng =  ActiveDocument.Range(ft.ListFormat.List.ListParagraphs(1).Range.Start, ft.ListFormat.List.ListParagraphs(j).Range.End)
                With rng.Find
                    .ClearFormatting
                    .MatchWildcards = True
                    .Text = "[^0013]{2;}"
                    .Forward = True
                    .Replacement.ClearFormatting
                    .Replacement.Text = "^p"
                End With
                    rng.Find.Execute Replace:=wdReplaceAll
End Sub
Вот действующий код, ставите курсор на любой абзац с нумерацией Книга и вперед
Пименов Александр вне форума Ответить с цитированием
Старый 09.01.2012, 22:51   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Если Аннотация представляет собой один АБЗАЦ, то надо просто удалить три абзаца из каждых пяти. Запустите макрос в приложенном файле (Alt+F8).

Файл следует прикладывать к сообщению, т.к. не у всех есть доступ к файлообменникам на работе.
Вложения
Тип файла: doc books-2.doc (34.5 Кб, 9 просмотров)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 09.01.2012, 23:12   #6
Dimasick
 
Регистрация: 27.01.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Если Аннотация представляет собой один АБЗАЦ, то надо просто удалить три абзаца из каждых пяти. Запустите макрос в приложенном файле (Alt+F8).
Увы, аннотация может занимать несколько абзацев

Цитата:
Сообщение от Казанский Посмотреть сообщение
Файл следует прикладывать к сообщению, т.к. не у всех есть доступ к файлообменникам на работе.
Пытался (трижды через "управление вложениями"), но выдавало "Загрузка файла прошла неудачно".
Dimasick вне форума Ответить с цитированием
Старый 09.01.2012, 23:22   #7
Dimasick
 
Регистрация: 27.01.2010
Сообщений: 5
По умолчанию

Александр, Ваш код работает, спасибо большое!
1. Есть одно маленькое "но": на большом файле скрипт дает сбой. То ли из-за того, что слова "книга", "автор", "год", "аннотация" встречаются и внутри аннотаций, то ли еще из-за чего. В связи с этим вопрос: можно ли выделять фрагменты именно от "Аннотация:" (включительно) до следующего ближайшего начала нумерованного списка ("Книга N") и не удалять его, а скажем, помечать как "Скрытый"?
2. Посоветуйте, плиз, самоучитель (книгу) по VBA (под Word), которую можно свободно скачать в инете и научиться самостоятельно писать скрипты для похожих задач, а то мой опыт ограничен записью макросов в самом Word-е (ну, Вы понимаете, просто начинаю запись, жму кнопки, останавливаю запись, - скрипт готов).

Последний раз редактировалось Dimasick; 10.01.2012 в 19:58. Причина: примечание
Dimasick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выделить слова из строки vvsh Общие вопросы C/C++ 2 08.05.2011 08:36
Разбить текст на слова и произвести поиск каждого слова по текстовому массиву Burning_brook Microsoft Office Excel 2 22.05.2010 01:56
Как удалить текст до слова, потом от слова ? littlecoder Общие вопросы Delphi 7 29.12.2008 00:57
Выделить элемент списка Иллидан Microsoft Office Word 5 23.09.2008 09:33