如何修复MS Access VBA中EnumFields提示子过程/函数未定义的错误
报错原因
EnumFields不是Access VBA内置函数,也不是DAO/ADO官方库提供的方法,它是微软Access开发文档中所有DAO示例通用的自定义辅助过程,作用是将Recordset(记录集)的查询结果按指定列宽打印到VBA立即窗口。官方示例默认使用者已经提前将该过程添加到VBA项目中,未手动添加该过程的情况下直接调用,就会触发「子过程或函数未定义」错误。
修复步骤
- 打开VBA编辑器(打开数据库后按
Alt+F11即可调出),在左侧项目资源管理器右键点击当前数据库项目,选择「插入」-「模块」,新建一个标准公共模块(不要将该过程写在窗体、报表的类模块中) - 将以下
EnumFields过程代码粘贴到新建的标准模块中:
Sub EnumFields(rst As Recordset, intFldLen As Integer) Dim lngRecCount As Long Dim lngFieldCount As Long Dim i As Long, j As Long ' 定位记录集获取总数 rst.MoveLast rst.MoveFirst lngRecCount = rst.RecordCount lngFieldCount = rst.Fields.Count ' 打印字段名表头 For j = 0 To lngFieldCount - 1 Debug.Print Left(rst.Fields(j).Name & Space(intFldLen), intFldLen); Next Debug.Print ' 打印表头分隔线 For j = 0 To lngFieldCount - 1 Debug.Print Left(String(intFldLen, "-") & Space(intFldLen), intFldLen); Next Debug.Print ' 逐行打印记录内容 For i = 0 To lngRecCount - 1 For j = 0 To lngFieldCount - 1 Debug.Print Left(Nz(rst.Fields(j).Value, "") & Space(intFldLen), intFldLen); Next Debug.Print rst.MoveNext Next i rst.MoveFirst End Sub
- 补充前置依赖检查:在VBA编辑器顶部菜单栏选择「工具」-「引用」,在列表中找到并勾选
Microsoft DAO 3.6 Object Library(或更高版本的DAO库,根据你的Office版本选择),避免Database、Recordset类型报定义错误。 - 运行原有代码前,按
Ctrl+G调出VBA立即窗口,EnumFields打印的查询结果会直接输出在该窗口中。 - 额外注意:你代码中调用的
Northwind.mdb示例数据库,如果没有放在当前Access项目的同目录下,需要在OpenDatabase方法中填写数据库文件的完整绝对路径,否则会触发找不到文件的错误。
内容的提问来源于stack exchange,提问作者Alberto Capitani
相关产品推荐
相关产品推荐

