Excel VBA ADO SQL连接错误 - 找不到该对象

时间:2016-08-19 07:07:46

标签: excel vba excel-vba ado

我从@Ryan Wildry的上一个问题得到了一个精彩的答案,但我想我会就同一个代码问一个不同的问题:这里有。

背景资料

我有一个共享(网络/服务器)Excel模板文件,它既是输入文件又是数据源(尽管在不同的工作表上)。我们称之为Input.xltm

代码基本上选取Input Sheet范围内的输入,取前两个字母并从Code Sheet中找到最接近的代码,然后使用前五个结果填充UserForm ListBox。

问题

问题出现在用户启动UserForm并且错误通常返回时:

Run-time error '-2147467259' The Microsoft Access database engine could not find the object 'C:\Users\user.name\Documents\Input1'. Make sure the object exists and that you spell its name and the path name correctly.......etc

我认为可能与Excel在文件名后面放一个数字有关,因为它是一个模板文件虽然我不知道!实际上知道了!

代码

以下是代码:

Public MyConnection As New ADODB.Connection
Public MyRecordset  As New ADODB.Recordset

Private Sub UserForm_Initialize()
Dim ColumnName As String: ColumnName = "[Variant code]"
Dim SearchStr  As String: SearchStr = Left(Sheets("Input Sheet").Range("B4").Value2, 2)
Dim dbstring As String

dbstring = ThisWorkbook.FullName

Application.ScreenUpdating = False

If MyConnection.State <> adStateOpen Then
    With MyConnection
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbstring & _
                            ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';"
        .Open
    End With
End If

If MyRecordset.State = adStateOpen Then MyRecordset.Close
MyRecordset.Open "Select top 5 " & ColumnName & " from [Code Sheet$] where " & ColumnName & _
                 " like '%" & SearchStr & "%'", MyConnection, adOpenForwardOnly, adLockReadOnly

Me.ListBox1.Clear
If Not MyRecordset.EOF Then MyRecordset.MoveFirst

Application.ScreenUpdating = True

Do Until MyRecordset.EOF
    Me.ListBox1.AddItem MyRecordset.Fields(0).Value
    MyRecordset.MoveNext
Loop

End Sub

我只需要通过服务器访问文件的每个人都能够获取正确的数据源(仅在下一页中)并填充ListBox。

我要感谢任何建议!感谢

#UPDATE

我已经检查过,现在如果你打开(然后保存)实际的模板文件,那么就没有&#39; 1&#39;在文件名之后,代码按预期工作。仅当模板正常打开并且数字自动附加后才停止工作。

1 个答案:

答案 0 :(得分:1)

您似乎不首先对MyConnectionMyRecordset进行早期绑定。

您可以通过

进行后期绑定

第1步。

更改

Public MyConnection As New ADODB.Connection
Public MyRecordset  As New ADODB.Recordset

Public MyConnection As object
Public MyRecordset  As object

第2步。

添加

Set MyConnection = createobject("adodb.connection")
Set MyRecordset = createobject("adodb.recordset")

之前If MyConnection.State <> adStateOpen Then