Access VBA中IsError()检测记录集字段值失效触发3021错误原因咨询
问题根本原因
IsError()函数的作用仅为检测表达式的返回值是否为VBA内置错误类型值(比如表格公式返回的#N/A、#DIV/0!对应的VBA错误值),无法捕获代码运行时主动抛出的异常。你遇到的运行时错误3021就是DAO空记录集访问字段时的典型报错。- 当SQL无返回结果时,调用
OpenRecordset得到的是空记录集,此时rs.BOF和rs.EOF同时为True,代表没有任何可用记录。此时直接访问rs.Fields("Name").Value属于「尝试读取不存在的记录的字段」,会直接触发运行时错误,不会返回一个错误类型的值给IsError判断,因此IsError完全不会生效,程序直接中断。
正确的实现方案
方案1:先判断记录集是否为空(推荐)
这是最稳妥的写法,不会触发任何异常:
Dim rs As DAO.Recordset Dim db As DAO.Database Dim Variable As Variant Set db = CurrentDb Set rs = CurrentDb.OpenRecordset(SQL-Statement) ' 先判断是否为空记录集 If rs.EOF And rs.BOF Then MsgBox "查询无匹配结果" Else Variable = rs.Fields("Name").Value ' 此处添加后续业务逻辑 End If ' 用完释放资源,避免内存泄漏 rs.Close Set rs = Nothing Set db = Nothing
方案2:用错误捕获做兼容
如果不想提前判断记录集状态,也可以通过VBA的错误捕获机制处理:
Dim rs As DAO.Recordset Dim db As DAO.Database Dim Variable As Variant Set db = CurrentDb Set rs = CurrentDb.OpenRecordset(SQL-Statement) On Error Resume Next ' 临时跳过运行时错误 Variable = rs.Fields("Name").Value If Err.Number <> 0 Then MsgBox "读取失败:" & Err.Description Err.Clear ' 清除错误标记 End If On Error GoTo 0 ' 恢复默认的错误抛出逻辑 ' 释放资源 rs.Close Set rs = Nothing Set db = Nothing
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

