Excel VBA:后期绑定参考

Tro*_*lsH 4 excel vba reference late-binding

我正在尝试为 Excel 中的加载项编写一些代码,该加载项从 SQL Server 获取一些数据。代码本身运行完美,但不知何故有些东西被损坏了。

看起来代码可以正常工作几次,然后突然触发 Excel 崩溃。经过很长一段时间,我确定它与引用有关,好像在崩溃时我将引用“Microsoft ActiveX Data Objects 2.8 Library”更改为其他内容,然后再次返回,加载项将工作再次。

鉴于重建加载项不起作用,我开始探索后期绑定的选项。我似乎不明白该怎么做。

Private Sub RetrieveToWorksheet(SQL As String, WriteTo As Range, Optional WriteColumnNames As Boolean = True)

If GetStatus = "True" Then
MsgBox ("Database is currently being updated. Please try again later.")
Exit Sub
End If

Application.ScreenUpdating = False

Dim Connection As ADODB.Connection
Dim RecordSet As ADODB.RecordSet
Dim Field As ADODB.Field
Dim RowOffset As Long
Dim ColumnOffset As Long

     On Error GoTo Finalize
Err.Clear
Set Connection = New ADODB.Connection
Connection.ConnectionTimeout = 300
Connection.CommandTimeout = 300
Connection.ConnectionString = "Provider=sqloledb;Data Source=vdd1xl0001;Initial Catalog=SRDK;User Id=SRDK_user;Password=password;Connect Timeout=300"
Connection.Mode = adModeShareDenyNone
Connection.Open
Set RecordSet = New ADODB.RecordSet
RecordSet.CursorLocation = adUseServer
RecordSet.Open SQL, Connection, ADODB.CursorTypeEnum.adOpenForwardOnly
RowOffset = 0
ColumnOffset = 0

If WriteColumnNames = True Then
For Each Field In RecordSet.Fields
    WriteTo.Cells(1, 1).Offset(RowOffset, ColumnOffset).Value = Field.Name
    ColumnOffset = ColumnOffset + 1
Next
ColumnOffset = 0
RowOffset = 1
End If

WriteTo.Cells(1, 1).Offset(RowOffset, ColumnOffset).CopyFromRecordset RecordSet

Finalize:

    If Not RecordSet Is Nothing Then
        If Not RecordSet.State = ADODB.ObjectStateEnum.adStateClosed Then RecordSet.Close
        Set RecordSet = Nothing
    End If
    If Not Connection Is Nothing Then
        If Not Connection.State = ADODB.ObjectStateEnum.adStateClosed Then Connection.Close
        Set Connection = Nothing
    End If
    If Err.Number <> 0 Then Err.Raise Err.Number, Err.Source, Err.Description
End Sub
Run Code Online (Sandbox Code Playgroud)

长话短说:我只希望加载项自动添加引用“Microsoft ActiveX Data Objects 2.8 Library”。

非常感谢所有帮助!

Deg*_*taf 6

在回答有关后期绑定的问题时,这涉及替换代码行

Dim Connection As ADODB.Connection
Run Code Online (Sandbox Code Playgroud)

Dim Connection As object
Run Code Online (Sandbox Code Playgroud)

并更换

Set Connection = New ADODB.Connection
Run Code Online (Sandbox Code Playgroud)

Set Connection = GetObject(, "ADODB.Connection")
Run Code Online (Sandbox Code Playgroud)

对于该库中的其他对象也是如此。

现在,我不确定这是否能解决您遇到的实际问题。听起来 ActiveX 库中存在一个错误,而您正在遇到它,尽管您所做的一切似乎都不是特别深奥。