Vba 加速多重替换

Vba 加速多重替换,vba,replace,ms-word,Vba,Replace,Ms Word,我正在编写一个Word宏,它从Excel文件中读取大约1000个单词对,并相应地替换Word文件。一开始,我使用以下代码进行替换: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = SrcText .Replacement.Text = DestText .Forward

我正在编写一个Word宏,它从Excel文件中读取大约1000个单词对,并相应地替换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文件第一行中只有一个单单元格表:

然后在VBA编辑器中,下面的代码将为您提供2

    Debug.Print Len(ActiveDocument.Characters(2))
我不知道是否还存在其他类似的不一致性,并因此陷入了困境


是否有任何解决方法或其他方法来加速替换?

首先,不要反复指定所有这些属性。除非你改变它们,否则它们不会改变

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
最小化圆点

所以,如果您对性能感兴趣,每个点都是一个查找,尤其是在循环中

有两种方法。一种方法是,如果要多次访问,则将对象设置为最低的对象

慢点

set xlapp = CreateObject("Excel.Application")
msgbox xlapp.worksheets(0).name 
更快,因为每次使用对象时都会忽略一个点

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
弦缩合

不要一次连接一个字符的字符串。从VBScript程序员那里可以看到这一点。它需要50000字节以及许多分配和释放来生成一个100个字符的字符串

阅读特性

不要重新读取未更改的属性,尤其是在进程外或后期绑定时。将它们放入一个变量中

对象类型

这里有两个概念-进程内或进程外和早期或晚期绑定

EXE文件连接到进程外。所有调用都通过网络协议进行编组。Dllfiles正在处理中,函数调用通过跳转直接进行

早期绑定设置为x=objecttype。编写程序时会查找函数。在执行时,程序被硬编码为跳转到该函数的vtable中存储的地址

后期绑定设置为x=CreateObjectType。每个函数调用都是这样的。嗨,你有打印命令吗。是的,它回答,命令3号。嗨,物体,你能做3号命令吗。当然,结果是这样的

来自Visual Basic概念的帮助部分

通过优化Visual Basic解析对象引用的方式,可以使Visual Basic应用程序运行得更快。Visual Basic处理对象引用的速度可能受到以下因素的影响:

ActiveX组件是否已实现为进程内服务器或进程外服务器

对象引用是早期绑定还是后期绑定。通常,如果组件已作为可执行文件.exe文件的一部分实现,则它是进程外服务器,并在其自己的进程中运行。如果它已实现为动态链接库,则它是进程内服务器,并与客户端应用程序在同一进程中运行

使用进程内服务器的应用程序通常比使用进程外服务器的应用程序运行得更快,因为应用程序不必跨越进程边界来使用对象的属性、方法和事件。有关进程内和进程外服务器的更多信息,请参阅进程内和进程外服务器

如果对象引用使用声明为特定类变量的对象变量,则对象引用是早期绑定的。如果对象引用使用声明为泛型对象类变量的对象变量,则它们是后期绑定的。使用早期绑定变量的对象引用通常比使用晚期绑定变量的对象引用运行得更快

Excel专用

请从Microsoft人员处查看此链接。这是excel特有的,而不是VBA。自动计算和其他计算选项/屏幕更新等


单元格结尾和表结尾字符。您甚至可以在图片中看到它们。@谢谢您指出这一点。我很好奇为什么Characters和Len对单元格结尾和表结尾字符的计数不同。你有什么线索吗?此外,这是唯一一个以不同方式计算的角色吗?非常感谢您的详细回复!真是太棒了!我想这将花费我一个编程新手的时间,他希望自动化他的部分翻译工作,而不用使用独立的CAT工具来消化: