2014-09-27 2 views
2

Я пишу макрос Word, который читает около 1000 пар слов из файла Excel и соответственно заменяет файл Word. В самом начале я воспользовался приведенным ниже кодом для замены:Как ускорить многократную замену с помощью VBA в Word?

Selection.Find.ClearFormatting 
    Selection.Find.Replacement.ClearFormatting 
    With Selection.Find 
     .Text = SrcText 
     .Replacement.Text = DestText 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchByte = False 
     .MatchAllWordForms = False 
     .MatchSoundsLike = False 
     .MatchWildcards = False 
     .MatchFuzzy = False 
    End With 
    Selection.Find.Execute Replace:=wdReplaceAll 

Это работало, но оказалось довольно медленным для больших файлов Word. Затем я попытался сначала прочитать весь контент в строковой переменной, найти там, а затем изменить файл Word, когда была найдена какая-либо цель замены (хотя на самом деле я не уверен, что это может быть быстрее).

При этом я столкнулся с несколько странным несоответствием. Например, если вы создаете файл Word, только с таблицей одноклеточный в первом ряду:

enter image description here

затем в редакторе VBA, приведенный ниже код даст вам 2.

Debug.Print Len(ActiveDocument.Characters(2)) 

Я не знаю, существуют ли другие несоответствия такого рода и застряли там.

Есть ли способ обхода или есть ли другой способ ускорить замену?

+1

Конец клетки и конец таблицы характера. Вы даже можете увидеть их на картинке. – Noodles

+0

@Noodles Спасибо, что указали это. Мне любопытно, почему «Персонажи» и «Лен» по-разному подсчитывают конец ячейки и конец символа таблицы. У вас есть какая-то подсказка?Кроме того, это единственный персонаж, который считается по-разному? – null

ответ

3

Для начала не указывайте все эти свойства снова и снова. Если вы не измените их, они не изменятся.

With Selection.Find 
    .ClearFormatting 
    .Replacement.ClearFormatting 
    .Forward = True 
    .Wrap = wdFindContinue 
    .Format = False 
    .MatchCase = False 
    .MatchWholeWord = False 
    .MatchByte = False 
    .MatchAllWordForms = False 
    .MatchSoundsLike = False 
    .MatchWildcards = False 
    .MatchFuzzy = False 

    For loop to go through each word pair 
     .Text = SrcText 
     .Replacement.Text = DestText 
     .Find.Execute Replace:=wdReplaceAll 
    Next 

End With 

Минимизация Dots

Так что, если вы заинтересованы в выполнении минимизации точек (каждая точка является поиск), особенно в циклах.

Существует два способа. Один из них - установить объекты на самый нижний объект, если вы собираетесь получать доступ более одного раза.

например (медленнее)

set xlapp = CreateObject("Excel.Application") 
msgbox xlapp.worksheets(0).name 

(быстрее, потому что вы omitt точечно каждый раз, когда вы используете объект)

set xlapp = CreateObject("Excel.Application") 
set wsheet = xlapp.worksheets(0) 
msgbox wsheet.name 

Второй путь с. У вас может быть только один с активным за раз.

Это пропускает 100 запросов.

with wsheet 
For x = 1 to 100 
msgbox .name 
Next 
end with 

Строка Concatination

И не присоединившиеся строки один символ за один раз. См. Это от программиста VBScript. Для создания 100-символьной строки требуется 50 000 байт и много выделения и освобождения.

http://blogs.msdn.com/b/ericlippert/archive/2003/10/20/53248.aspx

Свойства Чтение

Не перечитать свойства, которые не изменяются, особенно если из процесса или поздно граница. Поместите их в переменную.

Типы объектов

Два понятия здесь - в или из процесса и рано или поздно вяжущие.

exefiles подключены к процессу. Все вызовы распределяются по RPC (сетевой протокол). Dllfiles находятся в процессе, а вызовы функций выполняются напрямую с помощью перехода.

Раннее связывание - set x = objecttype. Функции вызывается, когда вы пишете программу. При выполнении программа жестко закодирована, чтобы перейти к адресу, сохраненному в таблице vtable для этой функции.

Late binding установлено x = createobject("objecttype"). Каждый вызов функции происходит следующим образом. «Привет, у вас есть команда печати». «Да», он отвечает, «команда номер 3». «Привет, вы можете сделать команду номер 3». «Конечно, вот результат».

Из Visual Basic Concepts (часть справки)

Вы можете сделать ваши Visual Basic приложения работать быстрее за счет оптимизации способа Visual Basic устраняющее ссылки на объекты. На скорость, с которой Visual Basic обрабатывает ссылки на объекты, может влиять:

Независимо от того, был ли компонент ActiveX реализован в качестве встроенного сервера или внепроцессного сервера.

Является ли ссылка на объект ранней или поздней. В общем случае, если компонент был реализован как часть исполняемого файла (файл .exe), он является внепроцессным сервером и запускается в своем собственном процессе. Если он был реализован как библиотека динамической компоновки, он является in-process сервером и работает в том же процессе, что и клиентское приложение.

Приложения, использующие встроенные серверы, обычно работают быстрее, чем те, которые используют внепроцессные серверы, потому что приложение не должно пересекать границы процесса, чтобы использовать свойства, методы и события объекта. Дополнительные сведения о серверах в процессе и вне процесса см. В разделе «Серверы, находящиеся в процессе и вне процесса».

Ссылки на объекты ранней привязки, если они используют переменные объекта, объявленные как переменные определенного класса. Ссылки на объекты являются поздними, если они используют переменные объекта, объявленные как переменные общего класса Object. Ссылки на объекты, использующие ранние связанные переменные, обычно работают быстрее, чем те, которые используют поздние связанные переменные.

Excel Конкретная

Смотрите эту ссылку от человека Microsoft. Это скорее excel, чем VBA. Autocalc и другие варианты известково/ScreenUpdating и т.д.

http://blogs.office.com/2009/03/12/excel-vba-performance-coding-best-practices/

+0

Большое спасибо за ваш подробный ответ! Это действительно здорово! Думаю, это потребует меня (новичок в программировании, надеющийся автоматизировать часть своей работы по переводу без использования автономных инструментов CAT), чтобы переварить ее :) – null

Смежные вопросы