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: - Dim appAccess As Access.Application
- Dim appExcel As Excel.Application
- Dim winExcel As Excel.Window
- Dim winProject As Project.Window
- Dim chkBox As CheckBox
- Dim cboFinance As ComboBox
- Dim chtMain As Chart
- Dim lstLookup As ListBox
- 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. -
Dim rst As ADODB.Recordset, strName As String
-
-
'Early Binding. Declaring fld as ADODB.Field results in
-
'times that are around 7% of those measured declaring fld
-
'as Object. In the case of several hundred Records, the difference
-
'would not be significant, but in the case of several hundred
-
'thousand Records, the time difference would be enormous.
-
Dim fld As ADODB.Field
-
-
'Late Binding
-
'Dim fld As Object
-
-
Set rst = New ADODB.Recordset
-
Set rst.ActiveConnection = CurrentProject.Connection
-
rst.Source = "tblEmployee"
-
rst.CursorType = adOpenStatic
-
-
rst.Open
-
-
rst.MoveFirst
-
-
Set fld = rst.Fields(0)
-
Do While Not rst.EOF
-
strName = fld.Name
-
rst.MoveNext
-
Loop
-
-
rst.Close
-
Set fld = Nothing
-
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: instead of: or, worst of all: 3 16024
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:- Dim appAccess As Access.Application
- Dim appExcel As Excel.Application
- Dim winExcel As Excel.Window
- Dim winProject As Project.Window
- Dim chkBox As CheckBox
- Dim cboFinance As ComboBox
- Dim chtMain As Chart
- Dim lstLookup As ListBox
- 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. -
Dim rst As ADODB.Recordset, strName As String
-
-
'Early Binding. Declaring fld as ADODB.Field results in
-
'times that are around 7% of those measured declaring fld
-
'as Object. In the case of several hundred Records, the difference
-
'would not be significant, but in the case of several hundred
-
'thousand Records, the time difference would be enormous.
-
Dim fld As ADODB.Field
-
-
'Late Binding
-
'Dim fld As Object
-
-
Set rst = New ADODB.Recordset
-
Set rst.ActiveConnection = CurrentProject.Connection
-
rst.Source = "tblEmployee"
-
rst.CursorType = adOpenStatic
-
-
rst.Open
-
-
rst.MoveFirst
-
-
Set fld = rst.Fields(0)
-
Do While Not rst.EOF
-
strName = fld.Name
-
rst.MoveNext
-
Loop
-
-
rst.Close
-
Set fld = Nothing
-
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: instead of: or, worst of all:
Some drawbacks from early binding.
In order to use early binding to the objects like Excel, i.e. - 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.
Some drawbacks from early binding.
In order to use early binding to the objects like Excel, i.e. - 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.
- 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.
- Public Function fExcelExists() As Boolean
-
Dim ref As Reference
-
-
For Each ref In Application.References
-
If ref.Name = "Excel" Then
-
fExcelExists = True
-
Exit Function
-
End If
-
Next
-
fExcelExists = False
-
End Function
- If fExcelExists() Then
-
'continue normal processing here
-
End If
- 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.
[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. - Public Function fExcelExists() As Boolean
-
Dim ref As Reference
-
-
For Each ref In Application.References
-
If ref.Name = "Excel" Then
-
fExcelExists = True
-
Exit Function
-
End If
-
Next
-
fExcelExists = False
-
End Function
- If fExcelExists() Then
-
'continue normal processing here
-
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 Sign in to post your reply or Sign up for a free account.
Similar topics
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 =...
|
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...
|
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.
...
|
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...
|
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...
|
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...
|
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...
|
by: RN1 |
last post by:
Is this late binding?
--------------------------------------------------------------------------------
Dim dSet As DataSet
dSet = New DataSet...
|
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
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
by: ryjfgjl |
last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
|
by: BarryA |
last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
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...
|
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...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
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...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
| |