VBA早绑定与晚绑定 - 实际性能差异

6 浏览
0 Comments

VBA早绑定与晚绑定 - 实际性能差异

我正在编写一个强大的Word宏,将在多台不同的计算机上使用以处理各种Word文档。我在许多专家VBA论坛上读到,早期绑定始终优于后期绑定,因为它在性能上更为出色。

根据我的逻辑,除非有令人信服的好处,否则就不适用于可用性,因为我不想确保在可能运行的所有计算机上都选择了库引用。

我曾尝试使用`ThisWorkbook.VBProject.References.AddFromGUID "{420B2830-E718-11CF-893D-00A0C9054228}", 1, 0`进行程序添加引用,但需要在计算机上启用安全信任以进行代码操作。

因此,我设置了一个测试来比较早期绑定和后期绑定的字典操作的运行1000次。我还进行了其他测试设置的尝试,如ScreenUpdating、DoEvents、Debug.Print,以查看每个设置的性能影响。

到目前为止,我发现无论在任何设置下(除了任意运行之间的10%波动),早期绑定和后期绑定本身没有明显的性能差异。

VBA大师们,我对这个故事很感兴趣,为什么我应该使用早期绑定,或者在实际使用中它真的有这样的优势吗?

我的测试代码如下:

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

0
0 Comments

VBA Early vs Late binding - real life performance differences

在VBA开发中,我们经常遇到选择使用Early Binding还是Late Binding的问题。Early Binding在开发过程中更受欢迎,因为它具有更快的速度和智能感知功能。而Late Binding常用于分发,因为它可以避免因用户环境不一致而带来的问题。除非你能百分之百确定用户的设置,否则在生产环境中使用Late Binding会更安全。

根据Word MVP网站的描述,Early Binding的优点包括:

- 代码运行速度更快,因为它可以在一开始就进行编译。而Late Binding则需要在运行时进行编译。

- 调试更容易,可以使用调试+编译命令,编译器可以发现在Late Binding中可能被忽略的语法错误。

- 项目中可以完全访问智能感知功能,通过输入关键字并加上点号,可以弹出该关键字支持的属性和方法列表,选择一个插入即可。还可以输入关键字并按下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 

此外,当你输入`.WindowState =`时,会弹出支持的常量列表,可以直接从列表中选择`wdWindowStateMaximize`。

如果使用Late Binding,则需要使用`.WindowState = 1`,并需要在Word的对象浏览器中查找常量`"wdWindowStateMaximize"`的值。

所有这些使得使用Early Binding比使用Late Binding更容易编程。

Late Binding的优点是代码更不容易受版本影响。如果在Word 97项目中设置了对“Microsoft Excel 8.0 Object Library”的引用,那么该项目将在安装了Office 2000的计算机上正常运行。Word 2000会自动将引用更改为“Microsoft Excel 9.0 Object Library”。

但是,如众所周知,具体情况可能有所不同。在某些情况下可能会出现问题。例如,如果在安装了Office 2000的计算机上运行一个包含对Excel 8.0对象库引用的Word 97项目,它将可以正常运行,但可能会偶尔出现“无法打开宏存储区”错误,除非将该项目保存为Word 2000格式。如果将其保存为Word 2000格式,引用将更改为Excel 9.0对象库。

因此,如果你使用Early Binding并支持混合环境,最安全的方式可能是创建单独的Word 97和Word 2000版本的插件,尽管这样会增加维护的工作量。

项目包含的引用越多,文件大小越大,编译时间越长。

有些编程环境不允许创建对另一个应用程序的引用。

我们需要根据具体情况选择使用Early Binding还是Late Binding。Early Binding可以提高代码的运行速度和开发效率,但需要注意版本兼容性和环境一致性。而Late Binding可以避免版本兼容性问题,但可能会牺牲一些开发效率。根据实际需求进行权衡和选择。

0