473,466 Members | 1,514 Online
Bytes | Software Development & Data Engineering Community
Create Post

Home Posts Topics Members FAQ

Early vs Late Binding

ADezii
8,834 Recognized Expert Expert
The process of verifying that an Object exists and that a specified Property or Method is valid is called Binding. There are two times when this verification process can take place: during compile time (Early Binding) or run time (Late Binding). When you declare an Object Variable as a specific Data Type, you are using Early Binding so the verification can take place during compile time. When you declare a Variable of the generic Object Data Type, you are using Late Binding. In this case, VBA must find and verify the Object information during any execution of VBA statement that includes a Reference to the Object or one of its Properties or Methods. The time difference between Early and Late Binding can be quite significant. Some examples of Early Binding are listed below:
  1. Dim appAccess As Access.Application
  2. Dim appExcel As Excel.Application
  3. Dim winExcel As Excel.Window
  4. Dim winProject As Project.Window
  5. Dim chkBox As CheckBox
  6. Dim cboFinance As ComboBox
  7. Dim chtMain As Chart
  8. Dim lstLookup As ListBox
  9. Dim pvtNew As PivotTable
As an example, I'll refer to an ADO Field as an ADODB.Field and also as an Object (commented out). Benchmark Test Procedures using the code below report a hugh difference in the speed of accessing the ADO Field's Properties, naturally, in favor of Early Binding. The code is listed below.
Expand|Select|Wrap|Line Numbers
  1. Dim rst As ADODB.Recordset, strName As String
  2.  
  3. 'Early Binding. Declaring fld as ADODB.Field results in
  4. 'times that are around 7% of those measured declaring fld
  5. 'as Object. In the case of several hundred Records, the difference
  6. 'would not be significant, but in the case of several hundred
  7. 'thousand Records, the time difference would be enormous.
  8. Dim fld As ADODB.Field
  9.  
  10. 'Late Binding
  11. 'Dim fld As Object
  12.  
  13. Set rst = New ADODB.Recordset
  14. Set rst.ActiveConnection = CurrentProject.Connection
  15. rst.Source = "tblEmployee"
  16. rst.CursorType = adOpenStatic
  17.  
  18. rst.Open
  19.  
  20. rst.MoveFirst
  21.  
  22. Set fld = rst.Fields(0)
  23. Do While Not rst.EOF
  24.   strName = fld.Name
  25.     rst.MoveNext
  26. Loop
  27.  
  28. rst.Close
  29. Set fld = Nothing
  30. Set rst = Nothing
In every case, if at all possible, declare a Variable using the most specific Object Type that you can. For Access Controls, that means using, for example:
Expand|Select|Wrap|Line Numbers
  1. Dim cmd As CommandButton
instead of:
Expand|Select|Wrap|Line Numbers
  1. Dim cmd As Control
or, worst of all:
Expand|Select|Wrap|Line Numbers
  1. Dim cmd As Object
Aug 5 '07 #1
3 16033
dima69
181 Recognized Expert New Member
The process of verifying that an Object exists and that a specified Property or Method is valid is called Binding. There are two times when this verification process can take place: during compile time (Early Binding) or run time (Late Binding). When you declare an Object Variable as a specific Data Type, you are using Early Binding so the verification can take place during compile time. When you declare a Variable of the generic Object Data Type, you are using Late Binding. In this case, VBA must find and verify the Object information during any execution of VBA statement that includes a Reference to the Object or one of its Properties or Methods. The time difference between Early and Late Binding can be quite significant. Some examples of Early Binding are listed below:
  1. Dim appAccess As Access.Application
  2. Dim appExcel As Excel.Application
  3. Dim winExcel As Excel.Window
  4. Dim winProject As Project.Window
  5. Dim chkBox As CheckBox
  6. Dim cboFinance As ComboBox
  7. Dim chtMain As Chart
  8. Dim lstLookup As ListBox
  9. Dim pvtNew As PivotTable
As an example, I'll refer to an ADO Field as an ADODB.Field and also as an Object (commented out). Benchmark Test Procedures using the code below report a hugh difference in the speed of accessing the ADO Field's Properties, naturally, in favor of Early Binding. The code is listed below.
Expand|Select|Wrap|Line Numbers
  1. Dim rst As ADODB.Recordset, strName As String
  2.  
  3. 'Early Binding. Declaring fld as ADODB.Field results in
  4. 'times that are around 7% of those measured declaring fld
  5. 'as Object. In the case of several hundred Records, the difference
  6. 'would not be significant, but in the case of several hundred
  7. 'thousand Records, the time difference would be enormous.
  8. Dim fld As ADODB.Field
  9.  
  10. 'Late Binding
  11. 'Dim fld As Object
  12.  
  13. Set rst = New ADODB.Recordset
  14. Set rst.ActiveConnection = CurrentProject.Connection
  15. rst.Source = "tblEmployee"
  16. rst.CursorType = adOpenStatic
  17.  
  18. rst.Open
  19.  
  20. rst.MoveFirst
  21.  
  22. Set fld = rst.Fields(0)
  23. Do While Not rst.EOF
  24.   strName = fld.Name
  25.     rst.MoveNext
  26. Loop
  27.  
  28. rst.Close
  29. Set fld = Nothing
  30. Set rst = Nothing
In every case, if at all possible, declare a Variable using the most specific Object Type that you can. For Access Controls, that means using, for example:
Expand|Select|Wrap|Line Numbers
  1. Dim cmd As CommandButton
instead of:
Expand|Select|Wrap|Line Numbers
  1. Dim cmd As Control
or, worst of all:
Expand|Select|Wrap|Line Numbers
  1. Dim cmd As Object
Some drawbacks from early binding.
In order to use early binding to the objects like Excel, i.e.
Expand|Select|Wrap|Line Numbers
  1. Dim appExcel As Excel.Application
you must explicitly set the reference to that object library. This can cause your code to stop running on the user machine, (If, for example, he doesn't have Excel installed) - without any chance of error handling.
On the other hand, although late binding is much slower, you usually don't need to set it more than once, so the difference can hardly be noticed in overall application performance.
Aug 6 '07 #2
ADezii
8,834 Recognized Expert Expert
Some drawbacks from early binding.
In order to use early binding to the objects like Excel, i.e.
Expand|Select|Wrap|Line Numbers
  1. Dim appExcel As Excel.Application
you must explicitly set the reference to that object library. This can cause your code to stop running on the user machine, (If, for example, he doesn't have Excel installed) - without any chance of error handling.
On the other hand, although late binding is much slower, you usually don't need to set it more than once, so the difference can hardly be noticed in overall application performance.
  1. I would still much rather explicitly check for the Reference, and if it exists, use the much faster Early Binding. You could always, as a last resort, resort to Late Binding - something similar to Conditional Compilation.
    Expand|Select|Wrap|Line Numbers
    1. Public Function fExcelExists() As Boolean
    2. Dim ref As Reference
    3.  
    4. For Each ref In Application.References
    5.   If ref.Name = "Excel" Then
    6.     fExcelExists = True
    7.       Exit Function
    8.   End If
    9. Next
    10.     fExcelExists = False
    11. End Function
    Expand|Select|Wrap|Line Numbers
    1. If fExcelExists() Then
    2.   'continue normal processing here
    3. End If
  2. In the illustrated code demo demonstrating Early vs Late Binding, (ADODB.Field vs Object), the difference was staggering. ADODB.Field process time was only 7% of the parallel Object approach.
Aug 6 '07 #3
dima69
181 Recognized Expert New Member
[list=1][*] I would still much rather explicitly check for the Reference, and if it exists, use the much faster Early Binding. You could always, as a last resort, resort to Late Binding - something similar to Conditional Compilation.
Expand|Select|Wrap|Line Numbers
  1. Public Function fExcelExists() As Boolean
  2. Dim ref As Reference
  3.  
  4. For Each ref In Application.References
  5.   If ref.Name = "Excel" Then
  6.     fExcelExists = True
  7.       Exit Function
  8.   End If
  9. Next
  10.     fExcelExists = False
  11. End Function
Expand|Select|Wrap|Line Numbers
  1. If fExcelExists() Then
  2.   'continue normal processing here
  3. End If
The only problem with this code is that it will not work if the reference is actually missing. Although checking for reference validity at runtime is possible, it is much more complicated, and still the solution is not 100% robust. The most complete explanation I saw on this is here: http://www.trigeminal.com/usenet/usenet026.asp
Aug 6 '07 #4

Sign in to post your reply or Sign up for a free account.

Similar topics

4
by: Olaf Meding | last post by:
Is there a way to find out if I am using early or late binding given the reference ("excel" in the example below) returned by Dispatch()? >>> import win32com.client >>> excel =...
8
by: deko | last post by:
When using automation (and especially with early binding) I've heard it is best to use explicit references to everything. For example: Dim xlChart as Excel.Chart rather than Dim objChart...
2
by: Mystery Man | last post by:
We are developing a C# application that has many interfaces to the Microsoft suite (eg Word, Excel, Outlook, Powerpoint, etc). We need to support Office 97, 2000, 2002 and any future versions. ...
5
by: Plat | last post by:
Summary: I've got some *.ASPX pages that still use COM objects. I'd like to enable Option Strict, but I get "error BC30574: Option Strict On disallows late binding" errors. How can I bypass this...
2
by: mark | last post by:
I understand that writing programs with option strict on is the best way to obtain stable applications. I have also found the applications to run much faster. Option strict on disallows late...
21
by: ManningFan | last post by:
I need to use late binding in a project because it's company standard to not include references which aren't MS defaults, so I can't add the scripting runtime. I need to be able to search...
2
by: kogrover | last post by:
ISSUE: COM Excel Sort works with Early Binding, but not Late Binding, but py2exe only does Late Binding I have code similar to this (type from notes, so there may be a typo...) import...
0
by: RN1 | last post by:
Is this late binding? -------------------------------------------------------------------------------- Dim dSet As DataSet dSet = New DataSet...
1
by: pedestrian via DotNetMonster.com | last post by:
What are the example of early binding? How about late binding? Thank you for replying. (: -- Warmest Regards, Pedestrian Message posted via DotNetMonster.com
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
1
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.