EOF/BOF错误-Excel VBA

EOF/BOF错误-Excel VBA,excel,vba,Excel,Vba,当我尝试从excel文件查询数据库时,收到以下错误: Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record. 为什么会出现这个错误?我已经在数据库中测试了我的SQL,它可以正常工作,我已经检查了4次没有输入错误 我计划将此数据的特定行附加到列表框中,并对其余数据执行各种其他操作。为了测试我的SQL,我想我应该迈出这第一步 我

当我尝试从excel文件查询数据库时,收到以下错误:

Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
为什么会出现这个错误?我已经在数据库中测试了我的SQL,它可以正常工作,我已经检查了4次没有输入错误

我计划将此数据的特定行附加到列表框中,并对其余数据执行各种其他操作。为了测试我的SQL,我想我应该迈出这第一步

我的代码:

Private Sub UserForm_Initialize()
    Check = True
    On Error GoTo UserForm_Initialize_Err
    Dim cnn As Object
    Dim rst As Object
    Dim StrDBPath As String
    Dim strSQL As String
    Set cnn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    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;" & _
                             "Data Source=" & StrDBPath & ";" & _
                             "Jet OLEDB:Engine Type=5;" & _
                             "Persist Security Info=False;"
     rst.Open strSQL, _
              cnn, adOpenStatic
     rst.MoveFirst
     With Me.ListBox1
         .Clear
         Do
             .AddItem rst![Department]
             rst.MoveNext
         Loop Until rst.EOF
     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

在不知道您在哪一行上得到错误的情况下,我假设它在这一节中

 rst.MoveFirst
 With Me.ListBox1
     .Clear
     Do
         .AddItem rst![Department]
         rst.MoveNext
     Loop Until rst.EOF
 End With
我会做出这些改变

 If rst.recordcount > 0 then
     rst.MoveFirst
 End if
 With Me.ListBox1
     .Clear
     Do while rst.eof = false
         .AddItem rst![Department]
         rst.MoveNext
     Loop
 End With
我还建议对您的记录集使用锁。看看阿德洛克乐观主义者和阿德洛克悲观主义者

rst.Open strSQL, cnn, adOpenStatic, adLockOptimistic 
为了回答您最后的评论,我将尝试声明不同的对象。并不是说你的做法有什么问题,因为它没有产生任何错误。像这样试试

Dim cnn As new adodb.connection
Dim rst As new adodb.recordset
这是早期绑定。因此,您可以取出设置cnn=CreateObject并设置rst=CreateObject
看看这能不能把你带到任何地方

很抱歉,我没有指定行。我会试试你的编辑@欢迎来到stackoverflow。让我知道更改是否有效。如果它们确实有效,请接受答案。这确实会使错误消失,但是列表框没有填充。这本身就是另一个问题,所以我会看看我能做些什么,然后从那里开始。谢谢是,如果记录集是eof或bof,则查询不会返回任何记录。这使您更接近解决方案。我建议在messagebox中显示strSQL,这样您就可以看到您正在查询的变量中得到了什么。或者,如果您熟悉IDE,也可以在构建后中断,并在即时窗口中显示。如果您需要调试该IDE的帮助,请告诉我。