Ádá*_*zki 2 performance binding vba ms-word
我正在编写一个强大的 Word 宏,该宏将用于多种不同机器上的各种 Word。
我在许多 VBA 专家论坛上读到过,早绑定总是比晚绑定更受欢迎,因为它在性能上要好得多。
然而,对于我的逻辑,感觉如此 - 除非好处被令人信服地证明 - 在可用性方面恰恰相反,因为我不希望确保那些 lib-references 在它可能运行的所有机器上打勾的痛苦。
我已经尝试过 `ThisWorkbook.VBProject.References.AddFromGUID "{420B2830-E718-11CF-893D-00A0C9054228}", 1, 0`。它将以编程方式添加引用,但它需要在机器上启用安全信任以进行代码操作。
然后我设置了一个测试来比较 1000 次早期和晚期 bindt 字典操作的运行。我还尝试了其他测试设置,例如 ScreenUpdating、DoEvents、Debug.Print,以查看每个设置的性能影响。
到目前为止,我看到的是,早期与晚期绑定本身在任何设置中都没有可测量的性能差异(除了任何运行之间 10% 的随机波动)。
VBA Guru-s 我对你对这个故事的理解很感兴趣,那我为什么要使用早期绑定,或者它在现实生活中真的有这样的优势。
我的测试代码是这样的:
Sub HeadingDefinitionWords_test()
Application.ScreenUpdating = False
Dim tm As Long
tm = timeGetTime
Dim DefinitionRangeBackup As Range, DefinitionRange As Range
Dim kEy As Variant, i As Long, k As Integer
Dim TempList As Object: Set TempList = CreateObject("Scripting.Dictionary")
'Dim TempList As Scripting.Dictionary: Set TempList = New Scripting.Dictionary
For i = 1 To 1000
'Call HeadingDefinitionWords(Selection.Range.Duplicate, TempList)
'''
Set DefinitionRange = Selection.Range.Duplicate
Set DefinitionRangeBackup = DefinitionRange.Duplicate
'-
With DefinitionRange.Find: .ClearFormatting: .Text = "([a-z])([A-Z])"
.Forward = True: .Wrap = wdFindStop: .Format = False: .MatchCase = False: .MatchWholeWord = False: .MatchAllWordForms = False
.MatchSoundsLike = False: .MatchWildcards = True
End With
'-
With DefinitionRange: While .Find.Execute And .InRange(DefinitionRangeBackup)
'-
.Expand Unit:=wdWord
'-
If Not TempList.Exists(Trim(DefinitionRange.Text)) Then TempList.Add Trim(DefinitionRange.Text), Trim(DefinitionRange.Text)
'-
DefinitionRange.Collapse wdCollapseEnd
Wend: End With
'''
For Each kEy In TempList
'Debug.Print kEy
If k = 50 Then
'Debug.Print k
k = 1
Else
k = k + 1
End If
'DoEvents
Next
Next
Dim tma As Long
tma = timeGetTime
Debug.Print tma - tm
Application.ScreenUpdating = True
End Sub
Run Code Online (Sandbox Code Playgroud)
不确定这应该作为答案,但是嘿,
早期绑定是开发工作(速度和智能感知)的首选。正是出于您提到的原因,后期绑定经常用于分发。在生产中使用后期绑定要安全得多,除非您可以绝对 100% 确定您的用户设置。
早期绑定的优势
您的代码将运行得更快,因为它可以全部预先编译。使用后期绑定,与您声明为对象的应用程序相关的代码实际上必须在运行时进行编译。
因为您的代码都可以预先编译,所以调试要容易得多——选择调试 + 编译,编译器将能够发现如果您使用后期绑定可能会遗漏的语法错误。
您在您的项目中拥有对智能感知的完全访问权限(键入一个关键字和一个点以获取该关键字支持的属性和方法的弹出列表,选择一个将其插入;键入一个关键字并按 F1 以启动该关键字的帮助主题)。
您可以通过对象浏览器和 VBA 帮助完全访问应用程序的对象模型。
您可以访问应用程序的内置常量。例如,如果您要从 Excel 自动化 Word,您可以使用:
Dim objWord As Word.Application
Set objWord = New Word.Application
With objWord
.Visible = True
.Activate
.WindowState = wdWindowStateMaximize
.Documents.Open ("c:\temp\temp.doc")
End With
Run Code Online (Sandbox Code Playgroud)
此外,当您键入
.WindowState =
Run Code Online (Sandbox Code Playgroud)
您将获得支持常量的弹出列表,并且可以简单地wdWindowStateMaximize从列表中进行选择。
如果您使用后期绑定,则需要使用:
.WindowState = 1
Run Code Online (Sandbox Code Playgroud)
.. 并且您需要知道(通过在 Word 的对象浏览器中查找)常量的值"wdWindowStateMaximize"恰好是 1。
所有这些使得使用早期绑定的编程比使用后期绑定要容易得多。
后期绑定的优势
主要优点是使用后期绑定的代码更确定与版本无关
如果您将 Word 97 项目中的引用设置为“Microsoft Excel 8.0 对象库”,则该项目将在安装了 Office 2000 的机器上正常运行。Word 2000 即时将引用更改为“Microsoft Excel 9.0 对象库”。
但正如他们所说,YMMV。在某些情况下发现了问题。例如,如果您在安装了 Office 2000 的计算机上运行包含对 Excel 8.0 对象库的引用的 Word 97 项目,它将运行正常,但除非您保存该项目,否则您可能偶尔会遇到“无法打开宏存储”错误在 Word 2000 中。如果将其保存在 Word 2000 中,则引用将更改为 Excel 9.0 对象库。
因此,如果您使用早期绑定并支持混合环境,那么创建单独的 Word 97 和 Word 2000 版本的插件可能是最安全的,尽管存在维护开销。
项目包含的引用越多,文件越大,编译所需的时间就越长。
某些编程环境不允许您创建对另一个应用程序的引用。
如果您真的想开始深入研究 COM 对象、v-tables 等,可以从以下参考开始:
参考:
| 归档时间: |
|
| 查看次数: |
1806 次 |
| 最近记录: |