Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA早期绑定与后期绑定-实际性能差异 我正在编写一个健壮的Word宏,它将用于多台不同机器上的各种单词 我在许多VBA专家论坛上读到,早期绑定总是比后期绑定更受欢迎,因为它在性能上要优越得多 然而,就我的逻辑而言,除非能令人信服地证明其好处,否则在可用性方面,情况恰恰相反,因为我不希望在它可能运行的所有机器上确保那些lib引用被勾选的痛苦。 我已经尝试过“ThisWorkbook.VBProject.References.AddFromGUID”{420B2830-E718-11CF-893D-00A0C9054228}”,1,0“。它将以编程方式添加引用,但随后需要在计算机上启用安全信任以进行代码操作 因此,我设置了一个测试来比较1000次早期和晚期bindt字典操作。我还使用了其他测试设置,如屏幕更新、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_Vba_Performance_Binding_Ms Word - Fatal编程技术网

VBA早期绑定与后期绑定-实际性能差异 我正在编写一个健壮的Word宏,它将用于多台不同机器上的各种单词 我在许多VBA专家论坛上读到,早期绑定总是比后期绑定更受欢迎,因为它在性能上要优越得多 然而,就我的逻辑而言,除非能令人信服地证明其好处,否则在可用性方面,情况恰恰相反,因为我不希望在它可能运行的所有机器上确保那些lib引用被勾选的痛苦。 我已经尝试过“ThisWorkbook.VBProject.References.AddFromGUID”{420B2830-E718-11CF-893D-00A0C9054228}”,1,0“。它将以编程方式添加引用,但随后需要在计算机上启用安全信任以进行代码操作 因此,我设置了一个测试来比较1000次早期和晚期bindt字典操作。我还使用了其他测试设置,如屏幕更新、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

VBA早期绑定与后期绑定-实际性能差异 我正在编写一个健壮的Word宏,它将用于多台不同机器上的各种单词 我在许多VBA专家论坛上读到,早期绑定总是比后期绑定更受欢迎,因为它在性能上要优越得多 然而,就我的逻辑而言,除非能令人信服地证明其好处,否则在可用性方面,情况恰恰相反,因为我不希望在它可能运行的所有机器上确保那些lib引用被勾选的痛苦。 我已经尝试过“ThisWorkbook.VBProject.References.AddFromGUID”{420B2830-E718-11CF-893D-00A0C9054228}”,1,0“。它将以编程方式添加引用,但随后需要在计算机上启用安全信任以进行代码操作 因此,我设置了一个测试来比较1000次早期和晚期bindt字典操作。我还使用了其他测试设置,如屏幕更新、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,vba,performance,binding,ms-word,Vba,Performance,Binding,Ms Word,不确定这是否应该作为答案,但是嘿 早期绑定是开发工作的首选(速度和智能感知)。由于您提到的原因,后期绑定经常用于分发。在生产中使用后期绑定要安全得多,除非您可以完全100%确定您的用户设置 引自 早期绑定的优势 您的代码将运行得更快,因为它可以提前编译。对于后期绑定,与声明为对象的应用程序相关的代码实际上必须在运行时编译 因为您的代码都可以提前编译,所以调试要容易得多–选择Debug+Compile,编译器将能够发现语法错误,如果您使用后期绑定,这些错误将被忽略 您在项目中拥有对intellis

不确定这是否应该作为答案,但是嘿

早期绑定是开发工作的首选(速度和智能感知)。由于您提到的原因,后期绑定经常用于分发。在生产中使用后期绑定要安全得多,除非您可以完全100%确定您的用户设置

引自

早期绑定的优势

您的代码将运行得更快,因为它可以提前编译。对于后期绑定,与声明为对象的应用程序相关的代码实际上必须在运行时编译

因为您的代码都可以提前编译,所以调试要容易得多–选择Debug+Compile,编译器将能够发现语法错误,如果您使用后期绑定,这些错误将被忽略

您在项目中拥有对intellisense的完全访问权限(键入关键字和点以获取该关键字支持的属性和方法的弹出列表,选择一个以插入该关键字;键入关键字并按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 =
您将获得受支持常量的弹出列表,只需从列表中选择
wdwindowstatemize

如果使用后期绑定,则需要使用:

.WindowState = 1
。。您需要知道(通过在Word的对象浏览器中查找它)常量
“wdWindowsStateMaximize”
的值恰好是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表等可能从以下参考开始:

参考资料:

  • Microsoft简介:

  • 谢谢你的快速回答。我认为这很有用。我将等待几天,看看是否有任何其他评论到达,这将改变我们的观点,否则我将选择您的作为解决方案。感谢额外的信息,我对此表示不满,除了“您的代码将运行得更快”部分,因为我上面的测试没有证明这一点。(已授予解决方案)与其他操作的成本相比,在您的示例中调用字典的成本微不足道。这就是为什么在早期绑定和后期绑定之间没有任何区别。