Posted to microsoft.public.excel.programming
|
|
Foolproof way to add ADO reference
Hi Peter,
Thanks for the reply, but I don't get it quite, other than that you say
avoid 2.8.
You are talking about the reference object, but I haven't used that in
that code.
Correct me if I misunderstood.
Doing this from work, so maybe I didn't look properly.
RBS
Peter T wrote:
Hi Bart,
Your add ado ref routine both worked and failed getting your error message.
Somehow it managed to add the ref to v2.8 though as far as I know this
version is not correctly registered on my system. It doesn't normally appear
in tools ref's and things have gone wrong in the past using other people's
wb's with this ref. So I always end up changing to 2.7 or rather 2.5 which
for some reason I find more reliable.
As I say it added the 2.8 ref but when I did this
' r = a vba ref to v2.8
Debug.Print r.Name, r.Description, r.Major, r.Minor
ADODB Microsoft ActiveX Data Objects 2.8 Library 2 8
Debug.Print r.FullPath
' this fails !!
debug.print err, err.description
-2147319779 Method 'FullPath' of object 'Reference' failed
If I change the ref to v2.7 both debug lines work
ADODB Microsoft ActiveX Data Objects 2.7 Library 2 7
C:\Program Files\Common Files\System\ado\msado27.tlb
Maybe something similar to your user.
I have two versions of msado15.dll on my system, one an old v1.5 and the
newer 2.8 (why is it the 2.8 version named msado15.dll ! I also have all the
other versions in your list.
FWIW I recall having problems when trying to upgrade to 2.8, it was a while
ago.
Regards,
Peter T
PS I commented out your code to get file name from an ini and did -
strADOPathFromINI = ThisWorkbook.Name
"RB Smissaert" wrote in message
...
Trying to come up with a foolproof way to add the current ADO library to
the
project's references.
I used to do this by just saving the .xla with a reference to a low
version,
2.5 and that worked fine for
a long time, but then came across a user where this failed.
Then I had a method that got the ADO library file path from registry reads
using code from KeepITCool:
Function GetLibrary(sProgID$) As String
Dim oReg As Object, sDat$
Const HKCR = &H80000000
Set oReg = GetObject( _
"winmgmts:{impersonationLevel=impersonate}!\\.\roo t\default:StdRegProv")
oReg.getstringvalue _
HKCR, sProgID & "\CLSID", vbNullString, sDat
oReg.getstringvalue _
HKCR, "CLSID\" & sDat & "\Inprocserver32", vbNullString, sDat
GetLibrary = sDat
End Function
Except I re-wrote this by using the Windows API.
This solved this one user's problem, but it failed with others, not
exactly
sure why.
Currently I use this method:
Save the .xla with the lowest ADO version I have on my development
machine,
2.1
In the Workbook_Open event remove this reference and add the current
library
like this,
slightly simplified:
Function AddReferenceFromFile(strFilePath As String, _
Optional strWorkbook As String) As Boolean
Dim VBProj As VBProject
On Error GoTo ERROROUT
If Len(strWorkbook) = 0 Then
strWorkbook = ThisWorkbook.Name
End If
Set VBProj = Workbooks(strWorkbook).VBProject
VBProj.References.AddFromFile strFilePath
Exit Function
ERROROUT:
End Function
Sub SetADOReference()
Dim i As Byte
Dim ADOConn As Object
Dim strADOVersion As String
Dim strADOFolder As String
Dim strADOFile As String
Dim strADOPathFromINI As String
Dim arrADOFiles
Const strINIPath As String = "C:\test.ini"
strADOPathFromINI = ReadINIValue(strINIPath, _
"Add-in behaviour", _
"Full path to ADO library")
If InStr(1, strADOPathFromINI, ":\", vbBinaryCompare) 0 Then
If AddReferenceFromFile(strADOPathFromINI) = True Then
Exit Sub
End If
End If
strADOFolder = Left$(Application.Path, 1) & _
":\Program Files\Common Files\System\ADO\"
Set ADOConn = CreateObject("ADODB.Connection")
strADOVersion = Left$(ADOConn.Version, 3)
Set ADOConn = Nothing
Select Case strADOVersion
Case "2.8"
strADOFile = "msado15.dll"
Case "2.7"
strADOFile = "msado27.tlb"
Case "2.6"
strADOFile = "msado26.tlb"
Case "2.5"
strADOFile = "msado25.tlb"
Case "2.1"
strADOFile = "msado21.tlb"
Case "2.0"
strADOFile = "msado20.tlb"
End Select
If AddReferenceFromFile(strADOFolder & strADOFile) = True Then
Exit Sub
End If
arrADOFiles = Array("msado15.dll", "msado27.tlb", "msado26.tlb", _
"msado25.tlb", "msado21.tlb", "msado20.tlb")
For i = 0 To 5
If AddReferenceFromFile(strADOFolder & arrADOFiles(i)) = True Then
Exit Sub
End If
Next
MsgBox "Failed to add the ADO reference" & vbCrLf & vbCrLf & _
"Please contact Bart Smissaert: ",
_
vbExclamation, "adding ADO reference"
End Sub
Sofar this seems to work fine. I know it is overkill, but as this is so
tricky I can't be
careful enough. The .ini file read should always make it possible for the
user to
set the right path, but this can be skipped for starters.
I am not 100% sure the Select Case sequence is right, but then there
always
is the brute force
method with the array.
Have read a lot of postings about this problem, but there doesn't seem to
be
any definite, single best
way how to tackle this.
Any pitfalls here or any suggestions for improvement?
RBS
|