Vba “91”对象变量/ADODB连接线上未设置块

Vba “91”对象变量/ADODB连接线上未设置块,vba,excel,Vba,Excel,我试图查询数据库以填充列表框以及其他各种任务。我在运行代码时遇到以下错误: 错误: 91 Object variable or With block variable not set 我的代码: Private Sub UserForm_Initialize() On Error GoTo UserForm_Initialize_Err Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim Str

我试图查询数据库以填充列表框以及其他各种任务。我在运行代码时遇到以下错误:

错误:

91 
Object variable or With block variable not set
我的代码:

Private Sub UserForm_Initialize()
    On Error GoTo UserForm_Initialize_Err
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim StrDBPath As String
    Dim strSQL As String


strSQL = "SELECT [Heads A].[Date Entered], [Heads A Issues].Department, [Heads A Issues].Equipment, [Heads A Issues].[Operation Issues], Sum([Heads A Issues].Downtime) AS SumOfDowntime1, IIf([Head A Crew]='3','C-Crew',IIf([Head A Crew]='2','B-Crew','A-Crew')) AS Crew " & _
        "FROM [Heads A] INNER JOIN [Heads A Issues] ON [Heads A].[HeadLineA ID] = [Heads A Issues].[HeadLineA ID]" & _
        " GROUP BY [Heads A].[Date Entered], [Heads A Issues].Department, [Heads A Issues].Equipment, [Heads A Issues].[Operation Issues], IIf([Head A Crew]='3','C-Crew',IIf([Head A Crew]='2','B-Crew','A-Crew'))" & _
        " HAVING ((([Heads A].[Date Entered])>=#" & Sheets("Choices").Cells(2, 1).Value & "# And ([Heads A].[Date Entered])<=#" & Sheets("Choices").Cells(2, 2).Value & "#) And (([Heads A Issues].Department)='" & Sheets("Choices").Cells(2, 3).Value & "') And ((IIf([Head A Crew]='3','C-Crew',IIf([Head A Crew]='2','B-Crew','A-Crew'))) Like IIf('" & Sheets("Choices").Cells(2, 4).Value & "'='all','*-Crew','" & _
        Sheets("Choices").Cells(2, 4).Value & "'))) ORDER BY [Heads A Issues].Department, [Heads A Issues].Equipment;"

StrDBPath = Application.ActiveWorkbook.Path & "\Daily Closing Report V997.accdb"

cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;" & _ 'THIS IS WHERE THE ISSUE IS
                         "Data Source=" & StrDBPath & ";" &_
                         "Jet OLEDB:Engine Type=5;" & _
                         "Persist Security Info=False;"

rst.Open strSQL, cnn, adOpenStatic, adLockOptimistic

CopyText (strSQL)

If (rst.RecordCount = 0) Then
    MsgBox "0 records found."
    Unload UserForm1
    Exit Sub
End If

If rst.RecordCount > 0 Then
    rst.MoveFirst
End If
With Me.ListBox1
    .Clear
    Do While rst.EOF = False
        .AddItem rst![Department,Heads A]
        rst.MoveNext
    Loop
    End With
UserForm_Initialize_Exit:
     On Error Resume Next
     rst.Close
     cnn.Close
     Set rst = Nothing
     Set cnn = Nothing
     Exit Sub
UserForm_Initialize_Err:
     MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!"
     Resume UserForm_Initialize_Exit
End Sub
我已经缩小了错误出现在我打开上面标记的连接的线路上的范围,但我不确定它为什么会出现这种情况。蒂亚

尽早将其绑定为新的

Dim cnn As new ADODB.Connection
你可以按照Don Jewett说的做,分两行:

Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection

这是后期绑定,在您的情况下,只是额外的一行代码。如果您的代码由于逻辑原因可能永远无法建立连接,那么最好在连接打开时进行后期绑定,以便在需要绑定之前不会发生绑定。但是,由于您正在立即使用连接和记录集,您最好尽早绑定它。

在使用对象之前,必须先实例化它们。在cnn之前添加行[Set cnn=New ADODB.Connection]。打开…与rst类似object@DonJewett同样的错误。我以前在VBA中工作过,但没有这行代码,如果我将cnn声明为ADODB.Connection对象,是否有必要?好的,在@TimWilliams的建议下,它工作了,但后来出错了。不过,这本身就是另一个问题。天哪,我在用excel编码时从来没有遇到过这么多麻烦。谢谢大家@瑞安威尔士-是的,这是必要的。你所看到的例子可能是一行而不是两行,比如:Dim cnn,正如New ADODB.ConnectionAs TimWilliams在评论中所说,我必须对我的录音集做同样的事情。这就是我在这方面遇到的问题。谢谢这不是早期/晚期绑定-晚期绑定将是Dim cnn作为对象:Set cnn=CreateobjectADODB.Connection Dim X作为新的Y自动实例化