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自动实例化