【问题标题】:Error message that "Either EOF or BOF is true, or the current record has been deleted"“EOF 或 BOF 为真,或当前记录已被删除”的错误消息
【发布时间】:2020-07-13 20:38:36
【问题描述】:

我已经编写了以下代码来将数据从 Access 表导入 Excel,但我在 rs.MoveFirst 阅读时收到一条错误消息:

EOF 或 BOF 为真,或当前记录已被删除

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim ws As Excel.Application
Dim strSQL As String
Dim i As Long

strSQL = "SELECT * FROM salebill where date >= " & _
sale.fromdate.Value & "  And  date <= " & sale.todate.Value & ""

Set cn = New ADODB.Connection

With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=D:\Payroll Soft\Acess\Mobile Shop.mdb;"
    .Open
End With

Set rs = New ADODB.Recordset
rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect

rs.MoveFirst
MsgBox (rs.RecordCount & " Rows Generated")

''Code to Export Data to Export''

Set ws = CreateObject("Excel.Application")
ws.Workbooks.Add
ws.range("a3").Select
ws.Selection.NumberFormat = "0"

For i = 0 To rs.Fields.Count - 1
    ws.ActiveCell.Offset(0, i).Value = rs.Fields(i).Name
Next
ws.range("a4").Select
Do Until rs.EOF
    For i = 0 To`enter code here` rs.Fields.Count - 1
        ws.ActiveCell.Offset(0, i).Value = rs.Fields(i).Value
    Next
    ws.ActiveCell.Offset(1, 0).Select
    rs.MoveNext`enter code here`
Loop
rs.Close

【问题讨论】:

  • 哪一行抛出这个错误?
  • rs.moveFirst.......................错误在这里
  • 那么记录集要么是空的,要么已经在BOF。在尝试访问记录集之前,您应该测试 EOFBOF
  • 请告诉我如何测试 EOF 和 BOF

标签: ms-access vba


【解决方案1】:

在尝试使用记录集之前,您需要测试EOF

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim ws As Excel.Application
Dim strSQL As String
Dim i As Long

strSQL = "SELECT * FROM salebill where date Between #" & _
    sale.fromdate.Value & "#  And #" & sale.todate.Value & "#"


Set cn = New ADODB.Connection

With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=D:\Payroll Soft\Acess\Mobile Shop.mdb;"
    .Open
End With

Set rs = New ADODB.Recordset
rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect

If Not rs.EOF Then
    rs.MoveFirst
    MsgBox (rs.RecordCount & " Rows Generated")

    ''Code to Export Data to Export''

    Set ws = CreateObject("Excel.Application")
    ws.Workbooks.Add
    ws.range("a3").Select
    ws.Selection.NumberFormat = "0"

    For i = 0 To rs.Fields.Count - 1
        ws.ActiveCell.Offset(0, i).Value = rs.Fields(i).Name
    Next
    ws.range("a4").Select
    Do Until rs.EOF
        For i = 0 To rs.Fields.Count - 1
            ws.ActiveCell.Offset(0, i).Value = rs.Fields(i).Value
        Next
        ws.ActiveCell.Offset(1, 0).Select
        rs.MoveNext
    Loop
    If (rs.State And adStateOpen) = adStateOpen Then rs.Close
    Set rs = Nothing

End If

If (cn.State And adStateOpen) = adStateOpen Then cn.Close
Set cn= Nothing

【讨论】:

  • 先生,我已根据您的建议进行了必要的更改,但没有工作。但是当我将 strSQL 查询更改为“从 salebill 中选择 *”时,它工作得很好。所以我认为问题可能出在 strSQL 查询中。你能帮我如何传递 SQL 查询吗?
  • “通过 SQL 查询”是什么意思?如果您的意思是添加两个日期之间的位置,请再次查看答案,我已经更新了它。
  • 更多信息可以在这里找到stackoverflow.com/questions/3725177/…
  • 先生,非常感谢您宝贵的时间...今天我尝试了您的代码,发现查询没有过滤两个日期之间的数据并一次处理整个数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多