Access 365中打开Excel文件触发编译错误的问题排查
Access 365中点击按钮打开Excel文件报错“User defined type not defined”的解决方法
问题根源
你遇到的编译错误,核心原因是用了早期绑定的Excel类型声明,但没在Access中添加Excel对象库的引用。Dim excelapp As Excel.Application这种写法属于早期绑定,需要Access提前识别Excel的对象类型,没加引用的话,Access就认不出Excel.Application这个自定义类型,所以报错。
两种解决方法
方法一:添加Excel对象库引用(早期绑定,代码提示友好)
- 打开VBA编辑器(按Alt+F11)
- 点击顶部菜单【工具】→【引用】
- 在弹出的引用列表里,找到Microsoft Excel xx.x Object Library(xx.x对应你的Office版本,比如365是16.0),勾选它后点击【确定】
- 修正代码里的两处错误:
- 把
Dim wbTarget As Excel.Workbooks改成Dim wbTarget As Excel.Workbook(Workbooks是集合,单个工作簿用Workbook) - 把
Set wbTarget = Excel.Workbooks.Open(...)改成Set wbTarget = excelapp.Workbooks.Open(...)(要调用你之前创建的excelapp实例,而不是新启动Excel)
- 把
修正后的代码:
Private Sub cmdcopyfieldsonly_Click() Dim excelapp As Excel.Application Dim wbTarget As Excel.Workbook Dim qdfquerytest As QueryDef Dim rsquerytest As Recordset Set qdfquerytest = CurrentDb.QueryDefs("OpenComplaintsQuery") Set rsquerytest = qdfquerytest.OpenRecordset() Set excelapp = CreateObject("Excel.Application") excelapp.Visible = True Set wbTarget = excelapp.Workbooks.Open("C:\Desktop\copytest.xlsx") wbTarget.Worksheets("Sheet1").Range("B8").Value = rsquerytest(2).Value End Sub
方法二:改用晚期绑定(无需添加引用,兼容性更强)
这种方式不需要引用Excel库,适配不同Office版本的环境,把所有Excel相关的类型声明改成Object即可:
Private Sub cmdcopyfieldsonly_Click() Dim excelapp As Object Dim wbTarget As Object Dim qdfquerytest As QueryDef Dim rsquerytest As Recordset Set qdfquerytest = CurrentDb.QueryDefs("OpenComplaintsQuery") Set rsquerytest = qdfquerytest.OpenRecordset() Set excelapp = CreateObject("Excel.Application") excelapp.Visible = True Set wbTarget = excelapp.Workbooks.Open("C:\Desktop\copytest.xlsx") wbTarget.Worksheets("Sheet1").Range("B8").Value = rsquerytest(2).Value End Sub
额外说明
- 错误不是出在代码更靠后的位置,就是
Dim excelapp As Excel.Application这行的类型识别问题 - 两种方法都能解决问题:早期绑定有代码智能提示,晚期绑定不用依赖特定Office版本,按需选择即可
内容的提问来源于stack exchange,提问作者Kemidan2014
相关产品推荐
相关产品推荐

