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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2014, 12:35   #1
LeCrunch
 
Регистрация: 27.09.2009
Сообщений: 7
Вопрос Варианты поиска номера строки

Использую большой макрос, который производит последовательную обработку из Excel документов Word (с поздней привязкой). В числе прочих операций нахожу в документе по нужному слову строку, выделяю её и произвожу дальнейшие необходимые действия с ней (просто обратиться по номеру не получается, т.к. из-за различия документов, этот № может меняться).
Код:
...
With wdDoc.Content.Find
    .ClearFormatting
    .Text = "СЛОВО"
    .Forward = True
    .wrap = 1 ' Const wdFindContinue = 1
    .MatchWildcards = False
    If .Execute = True Then
        .Parent.Select
        WDApp.Selection.expand 5 ' Const wdLine = 5
        Stroka = WDApp.Selection.Text
    End If
End With
...
Однако столкнулся с тем, что при обработке большого количества документов (от сотни и более) макрос начинает сбоить и давать ошибочные результаты, относящиеся именно к результатам этого участка кода, что может даже приводить к некорректному завершению работы Word (при этом нужные рекомендации обеспечиваются - документы/объекты закрываются, объекты обнуляются/уничтожаются, но - ...)

Хотелось бы обойти эту проблему - т.е. просьба подсказать ещё варианты нахождения № строки по нужному слову в документе Word
LeCrunch вне форума Ответить с цитированием
Старый 03.06.2014, 15:36   #2
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Попробуйте без Selection. Например так:
Код:
Dim wdRange As Word.Range
    
    Set wdRange = wdDoc.Range(0, 0)
    With wdRange.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = 1 ' Word.WdFindWrap.wdFindContinue
        .Text = "СЛОВО"
        .Execute Replace:=0 '  Word.WdReplace.wdReplaceNone
    End With
    If wdRange.Find.Found = True Then
        wdRange.SetRange Start:=wdRange.Words.First.Start, _
                         End:=wdRange.Words.Last.End
        Stroka = wdRange.Text
    End If
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 03.06.2014, 20:48   #3
LeCrunch
 
Регистрация: 27.09.2009
Сообщений: 7
По умолчанию

Спасибо за идею, но т.к. нужно выделять не слово, а всю строку, то отредактировал и макрос работает пока без сбоев
Код:
With wdDoc
...
    Dim wdRng1 As Object
    Set wdRng1 = .Range
    With wdRng1
        If .Find.Execute("СЛОВО") Then _
            .expand Unit:=3 ' Const wdSentence = 3
        Stroka = .Text
    End With
...
End With
И вопросы - в частности:
Т.к. автоматизация идет в поздней привязке, то переменную wdRng1 (в Watches видную при выполнении макроса как Variant/Object/Range) пришлось объявить объектом (на Word.Range, WDApp.Range, wdDoc.Range - ругается..) - это правильно?
У меня еще в нескольких местах будет похожий поиск - т.е. лучше для каждого делать wdRng свой?

И несмотря на данное решение - действительно ли, что при общих советах для Excel VBA избегать Select, Selection, Copy, для Word VBA наличие в правильном коде подобных команд - это нормальное явление?
LeCrunch вне форума Ответить с цитированием
Старый 03.06.2014, 22:32   #4
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от LeCrunch Посмотреть сообщение
...на Word.Range, WDApp.Range, wdDoc.Range - ругается...
Подключите Word-овские библиотеки к своему проекту в Excel, не будет ругаться. А так - да, надо объявлять как Object или Variant.
Цитата:
Сообщение от LeCrunch Посмотреть сообщение
...лучше для каждого делать wdRng свой...
Можно и один. Вообще, надо смотреть код, и оптимизировать...
Цитата:
Сообщение от LeCrunch Посмотреть сообщение
...при общих советах для Excel VBA избегать ...Selection...
Я стараюсь избегать Selection в Word, где возможно. По-моему, так и быстрее и надежнее.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклы БД и порядкового номера строки MedwedoS PHP 2 26.02.2014 01:13
Определение номера строки The SCS Общие вопросы Delphi 4 12.05.2012 12:26
Заменить отрицательные элементы суммой номера столбца и номера строки, в которых они находятся gylayko Помощь студентам 5 31.03.2012 18:20
Все возможные варианты строки Vikenty Общие вопросы Delphi 3 29.08.2010 03:30
Варианты поиска значений из массива данных PARTOS Microsoft Office Excel 14 11.01.2010 14:20