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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2013, 21:25   #1
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию Шаблон поиска

Если есть какие-нибудь идеи, как составить шаблон поиска для следующего текста:
решен слово_1 слово_2 слово_3 слово_4 слово_5 слово_6 слово_7 слово_8 слово_9 слово_10 слово_11 от 01.01.2012 №

где:
решен - это корень;
слово_1 - любое слово;
01.01.2012 - любая дата в виде: ##.##.####
просто символ "№"

Условия:
корень "решен" находится в начале слова;
после корня "решен" не должно быть окончания "ми";
слово_1 - количество слов от нуля до 11.

Примерный шаблон я такой делаю:
<решен [!м][!и]( ){1;13}<от [0-9]{2}.[0-9]{2}.[0-9]{4} №

В выложенном файле должен находиться только второй абзац.

Примечание
  1. Сделал такую работу с помощью макросов. Но сейчас на свежую голову пришла идея, что можно сделать с помощью "Найти и заменить", что может работать быстрее, да и кода меньше будет - легче будет ориентироваться в коде.
  2. Использовать нужно именно средства программы Word, а не библиотеку (это в программировании VBA) "Microsoft VBScript Regular Expressions 5.5", т.к. нужно обрабатывать найденный текст и нужно получить доступ к тексту в документе, сохраняя форматирование и всё остальное.
Вложения
Тип файла: zip Шаблон поиска.zip (11.4 Кб, 11 просмотров)
Скрипт вне форума Ответить с цитированием
Старый 10.02.2013, 01:04   #2
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Код:
Sub io()
    Dim Paragraph As Paragraph
    Dim Text As String
    
    With CreateObject("vbscript.regexp")
        .Pattern = "^\s*решен\S*\s+(?:[^_]+_+\d+[\s,.]+){1,15}\D+\d\d\.\d\d\.\d{4}\s*№\s*$"
    
        For Each Paragraph In ThisDocument.Paragraphs
            Text = Paragraph.Range.Text
            
            If .Test(Text) Then
                MsgBox Text
            
                With Paragraph.Range.Find
                    .ClearFormatting
                    
                    ' Нафти внутри абзаца весть текст (не помню, читай доку)
                    '.Execute "*"
                    
                    ' Заменить без потери форматирования
                    ' .Replacement.Text = "some"
                End With
            End If
        Next
    End With
End Sub
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 10.02.2013, 03:45   #3
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Не будет одного шаблона для обычного поиска.

Оптимально:
1. Искать макросом, по шаблону типа такого:
<решен[!^13]@<от [0-9]{2}.[0-9]{2}.[0-9]{4} №
2. Затем дополнительно проверять найденное. Лучше всего способом, предложенным nerv. Перебор параграфов лучше исключить - это тормоза.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 10.02.2013, 07:53   #4
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

А как привязку сделать результата, полученного с помощью Microsoft VBScript Regular Expressions 5.5, к тексту в документе?

Порядковые номера символов в документе Word не всегда совпадают с порядковыми номерами символов, взятых в переменную.

"Microsoft VBScript Regular Expressions 5.5" работает же в переменной, а не в документе Word.
Скрипт вне форума Ответить с цитированием
Старый 10.02.2013, 09:17   #5
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Тем же поиском (Find). У вас есть текст, есть область, осталось поискать.

Утоняющую проверку можно сделать и без RegExp. Например циклом For Each для Words найденной области.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 10.02.2013, 13:20   #6
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от Вождь Посмотреть сообщение
Не будет одного шаблона для обычного поиска.
как правило да. В данном случае я бы тоже разбил на
1. примерно найдено
2. найдено наверняка (этот пункт тоже на подпункты потому, что так проще)
а) надено решен* (найти и вырезать)
б) найдены слова (найти и вырезать)
в) найдена дата

Цитата:
Сообщение от Вождь Посмотреть сообщение
Перебор параграфов лучше исключить - это тормоза.
могу ошибаться, но, думаю, в этом случае это не столь критично, главное качество (поиска). Хотите быстро? Пишите на ассемблере и компилируйте. В данном случае, исходя из файла, одним из критериев отбора является параграф.
Если метод Find обеспечивает доступ к найденному (параграф, символ и т.п., я этого не помню), можно воспользоваться им.
- нашли файндом (можно просто решен*)
- начало параграфа? проверяем дальше этот параграф,
- нет, ищем find'ом дальше

Цитата:
Сообщение от Вождь Посмотреть сообщение
Утоняющую проверку можно сделать и без RegExp. Например циклом For Each для Words найденной области.
гемморой
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 10.02.2013, 13:37   #7
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
...привязку...результата...к тексту в документе?...
...номера символов в документе...не всегда совпадают с...номерами символов, взятых в переменную...
Цитата:
Сообщение от nerv Посмотреть сообщение
...гемморой...
Как же в Word без него?

Человеку нужно получить области (Range) слов, даты и др. И ищется не обычный текст, а наверное поля, судя по цитате. На это и направлены мои советы.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 10.02.2013, 15:34   #8
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Вождь, просто я не знаю, что может быть в Word-документе, поэтому я хотел бы использовать средства самой программы Word.

Можно ли Word-документ представить как переменную с типом данных String? Нет, нельзя. Простой пример - это таблица в Word-документе. Если взять фрагмент Word-документа в переменную с типом данных String, то в переменной будет больше символов, чем есть в объекте Range, поэтому сопоставить данные из переменной и Word-документом просто так не получится - нужно учитывать много факторов.

Последний раз редактировалось Скрипт; 11.02.2013 в 09:57.
Скрипт вне форума Ответить с цитированием
Старый 10.02.2013, 15:37   #9
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Новая идея появилась - сначала искать вот это:
<от [0-9]{2}.[0-9]{2}.[0-9]{4} №

а затем уже влево двигаться (в начало документа) и анализировать, что встречается.

Пока что на макросах остановился.
Скрипт вне форума Ответить с цитированием
Старый 10.02.2013, 15:43   #10
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
nerv: Хотите быстро? Пишите на ассемблере и компилируйте.
Есть особенности в VBA-Word, VBA-Excel, когда можно одно действие заменить другим и будет быстрее. В VBA-Word и VBA-Excel - это, например, использование команды "Find" вместо просмотра всех слов или ячеек.

Цитата:
nerv: В данном случае, исходя из файла, одним из критериев отбора является параграф.
файл неудачный получился (просто лень было делать). Критерий отбора в данном случае - взять нужное слово "решен" и изменить в нём форматирование. В данном случае нужное слово "решен" во втором абзаце. Но абзац здесь не играет роли - просто файл неудачно выложил.
Скрипт вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Форма поиска (несколько параметров поиска) Nastasya83 Microsoft Office Access 1 19.04.2012 15:48
макрос для поиска позиций и вывода данных на лист поиска mr-111 Microsoft Office Excel 12 13.03.2012 15:03
Дано: таблица в Exel (3 столбца, 4000 строк) и шаблон документа. Задача: Распечатать один и тот-же шаблон документа, под Evgenya040305 Помощь студентам 2 24.11.2011 22:21
Форма поиска - задать диапазон поиска VictorM Microsoft Office Excel 9 21.04.2011 00:12