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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2010, 17:32   #1
Rossoman
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 14
По умолчанию Массовая замена

Нужно сделать массу замен в документе ворд, например:
я реализую через функцию

но это же наверно не самый быстрый способ?))
если документ очень большой... это просто невыносимо...

Код:
Public Function Zamena(Stroka As String, NStroka As String, Registr As Boolean, Celoe As Boolean) As Boolean
Selection.StartOf wdStory
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = Stroka
        .Replacement.Text = NStroka
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = Registr
        .MatchWholeWord = Celoe
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Function
Код:
Zamena "^p<!--pagebreak-->^p- ", "- ", False, False
Zamena "^p<!--pagebreak-->^p* ", "* ", False, False
Zamena "^p<!--pagebreak-->^p• ", "• ", False, False
Zamena "^p<!--pagebreak-->^p> ", "> ", False, False
Zamena "***^?^p***", "***", False, False
Zamena "<!--pagebreak-->^p^p^p^p#####", "#####", False, False
Zamena "<!--pagebreak-->^p^p^p#####", "#####", False, False
Zamena "<!--pagebreak-->^p^p#####", "#####", False, False
Zamena "^p***^p^p^p", "^p^p^p", False, False
Zamena "***", "<hr>", False, False
Zamena "см. рис. ^?^?", "", False, False
Zamena "см. рис. ^?", "", False, False
Zamena ", см. рисунок", "", True, False
Zamena "Per. ", "Рег. ", True, False
Zamena "рer. ", "рег. ", True, False
Zamena "Продолжение в следующем номере.", "", False, False
Zamena "[формула]", "", False, False
Zamena "прим, ред", "Прим. ред", False, True
Zamena "показано на рисунке на с. ^?^?", "описано дальше(ниже)", False, False
Zamena "показано на рисунке на с. ^?", "описано дальше(ниже)", False, False
Zamena "показано на рисунке ^?^?", "описано дальше(ниже)", False, False
Zamena "показано на рисунке ^?", "описано дальше(ниже)", False, False
Zamena "показано на диаграмме", "описано дальше(ниже)", False, False
Zamena "показано на диаграммах, представленных на рисунках", "описано дальше(ниже)", False, False
Zamena "показано в таблице ^?(^?)", "описано дальше(ниже)", False, False
Zamena "показано в таблице на стр. ^?^?", "описано дальше(ниже)", False, False
Zamena "показано в таблице на стр. ^?", "описано дальше(ниже)", False, False
Zamena "показано в таблице ^?^?", "описано дальше(ниже)", False, False
Zamena "показано в таблице ^?", "описано дальше(ниже)", False, False
Zamena "показано в таблице", "описано дальше(ниже)", False, False
Zamena "показано в табл. ^?.^?", "описано дальше(ниже)", False, False
Zamena "показано в табл. ^?^?", "описано дальше(ниже)", False, False
Zamena "показано в табл. ^?", "описано дальше(ниже)", False, False
Zamena ":^p^p<!--pagebreak-->", ":", False, False
Zamena "—", "-", False, False
Zamena "^+", "-", False, False
Zamena ": *", ": ^p*", False, False
Zamena ": -", ": ^p-", False, False
Zamena ": •", ": ^p•", False, False
Zamena ": >", ": ^p>", False, False
Rossoman вне форума Ответить с цитированием
Старый 12.05.2010, 22:31   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

А другого способа не существует. Попробуйте заменить Selection на ActiveDocument.Range. Почему сделали функцией, если нигде не возвращаете значение? Сделайте процедурой:
Код:
Public Sub Zamena(Stroka As String, NStroka As String, Registr As Boolean, Celoe As Boolean)
    With ActiveDocument.Range.Find
        .Text = Stroka
        .Replacement.Text = NStroka
        .MatchCase = Registr
        .MatchWholeWord = Celoe
        .Execute Replace:=wdReplaceAll
    End With
    DoEvents 'Это чтобы не зависало
End Sub
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 13.05.2010, 10:13   #3
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Можно ещё заняться контектсным анализом без использования функции Find. Что-то наподобие этого:

Код:
Dim R As Range, T As String
Set R = ActiveDocument.Words.First 'Sentences/Paragraphs/Words'

Do
    Set R = R.Next(Unit:=wdWord, Count:=1)  'wdCharacter/wdSentence/wdParagraph и т.д.'
    T = R.Text 'Получаем текстовое значение'
    'А вот тут вставляем самое интересное - анализ и изменение'
    ...

    R.Text = T  'Возвращаем изменённое текстовое значение'
Loop While Not (R Is Nothing)
Нельзя всегда надеяться только на встроенные возможности Офиса
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 13.05.2010, 12:05   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Да, есть такое дело с перебором через Next. Оно иногда быстрее работает, чем цикл For Each (например, с таблицами), но чтобы быстрее поиска? Да и возможности ограничены словом, символом, предложением и т.д.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 13.05.2010, 12:10   #5
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Да, есть такое дело с перебором через Next. Оно иногда быстрее работает, чем цикл For Each (например, с таблицами), но чтобы быстрее поиска? Да и возможности ограничены словом, символом, предложением и т.д.
Открой тему "как подсчитать количество символов?" и сравни скорости работы вариантов...
Find довольно медленная штука, особенно на больших текстах...
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 13.05.2010, 12:25   #6
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Так там же задача стояла другая. А здесь стоит задача замены выражений. Поиск мне представляется наглядным и простым
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 13.05.2010, 12:45   #7
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Относительно Эйнштейна

Цитата:
Сообщение от viter.alex Посмотреть сообщение
...Поиск мне представляется наглядным и простым
Я, пока не углублялся, тоже так думал
Sasha_Smirnov вне форума Ответить с цитированием
Старый 13.05.2010, 12:48   #8
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Цитата:
Сообщение от Rossoman Посмотреть сообщение
но это же наверно не самый быстрый способ?))
если документ очень большой... это просто невыносимо...
Что значит ОЧЕНЬ БОЛЬШОЙ? для пробы прогнал Вашу программу на файле 1,5МБ - работал 2 сек. Куда быстрее? С поправкой на процессор допускаю 10-15 сек, неужели Вам надо обрабатывать десятки файлов?
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 13.05.2010, 13:26   #9
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

IMHO, оптимален поиск с заменой.
Не оптимальны приведённые в первом посте запросы. (Если это не абстрактный пример) Их явно можно оптимизировать путём объединения.
Skif-F, встречаются увы документы и по 1,5ГБ
Aent вне форума Ответить с цитированием
Старый 13.05.2010, 16:31   #10
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Aent Посмотреть сообщение
…Skif-F, встречаются увы документы и по 1,5ГБ
При том, что текста не может быть более 32Мб!
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массовая очистка TextBox Kveldulv Microsoft Office Excel 2 26.03.2010 14:31
Массовая замена аргументов kzld Microsoft Office Excel 8 07.02.2010 17:57
Массовая обработка файлов bionicle Помощь студентам 2 30.01.2010 12:37
Массовая драка в военной части на Алтае rpy3uH Свободное общение 5 10.07.2009 14:02
Замена кода программы с Delhi5 на Delhi7 либо замена базы данных с Acessa на MySQL DorianLeroy Фриланс 8 18.02.2009 18:52