Access2016 VBA模块调用Word报编译错误的解决咨询
Access 2016 VBA迁移修改方案
核心问题修复步骤
1. 解决「用户定义类型未定义」错误
这个错误是因为Access未引用Word对象库,有两种处理方式:
- 早绑定(代码提示友好,需手动引用):
打开VBA编辑器(按Alt+F11),点击顶部菜单「工具」→「引用」,在列表里找到「Microsoft Word 16.0 Object Library」(对应Office 2016),勾选后确定。 - 晚绑定(无需引用,兼容性更强):
把代码里的Word类型声明改成通用对象,同时替换Word常量为对应数值:- 将
Dim wApp As Word.Application改为Dim wApp As Object - 将
Set wApp = New Word.Application改为Set wApp = CreateObject("Word.Application") - 将
Dim wDoc As Word.Document改为Dim wDoc As Object - 将所有
wdCharacter替换为数值2(Word常量wdCharacter的对应值)
- 将
2. 初始化Recordset对象
原代码中rs仅声明但未指定数据源,会导致运行时错误,需根据实际场景添加初始化代码:
- 如果是从当前表单读取数据:
Set rs = Me.RecordsetClone - 如果是从指定表/查询读取数据:
Set rs = CurrentDb.OpenRecordset("你的表名或查询名")
3. 完善Word文件路径
打开Word文档时必须指定完整扩展名(如.docx/.doc),否则可能无法正常打开:
Set wDoc = wApp.Documents.Open("U:\WC Files\Pre Employment\Access\New Database\Modules\KasierReferralForm2022.docx")
4. 修复SaveAs2逻辑
- 保存文件时需添加扩展名,同时处理文件名中的非法字符(如
/、\等):Dim safeName As String safeName = Replace(rs!Name, "/", "-") ' 替换非法字符 wDoc.SaveAs2 "U:\WC Files\Pre Employment\Access\New Database\Modules\Test\Kaiser\" & rs!ID & safeName & "_KasierReferralForm2022.docx"
5. 移除冗余的书签删除代码
原代码中填充书签后又删除内容的逻辑完全多余,还会导致书签丢失,直接删除所有wDoc.Bookmarks(...).Range.Delete相关行即可。
修改后的完整代码(晚绑定版本,无需引用)
Option Compare Database Option Explicit Public Sub ExportKaiserReferralForm2022() Dim wApp As Object Dim wDoc As Object Dim rs As DAO.Recordset Dim safeName As String ' 初始化Word应用,调试时可设为Visible=True便于查看 Set wApp = CreateObject("Word.Application") wApp.Visible = True ' 打开Word模板文档(需带完整扩展名) Set wDoc = wApp.Documents.Open("U:\WC Files\Pre Employment\Access\New Database\Modules\KasierReferralForm2022.docx") ' 初始化Recordset(示例为表单数据源,可根据实际修改) Set rs = Me.RecordsetClone If rs.EOF And rs.BOF Then Exit Sub ' 无数据时直接退出 rs.MoveFirst Do Until rs.EOF ' 填充书签内容 wDoc.Bookmarks("Clinic").Range.Text = Nz(rs!Clinic, "") wDoc.Bookmarks("Date_Input").Range.Text = Nz(rs!Date_Appt_Sent_To_Clinic, "") wDoc.Bookmarks("Name").Range.Text = Nz(rs!Name, "") wDoc.Bookmarks("Street_Address").Range.Text = Nz(rs!Street_Address, "") wDoc.Bookmarks("City").Range.Text = Nz(rs!City, "") wDoc.Bookmarks("Zip_Code").Range.Text = Nz(rs!Zip_Code, "") wDoc.Bookmarks("Phone_Contact").Range.Text = Nz(rs!Phone_Contact, "") wDoc.Bookmarks("DOB").Range.Text = Nz(rs!DOB, "") wDoc.Bookmarks("Job_Title").Range.Text = Nz(rs!Job_Title, "") ' 处理文件名并保存 safeName = Replace(Replace(rs!Name, "/", "-"), "\", "-") ' 替换多种非法字符 wDoc.SaveAs2 "U:\WC Files\Pre Employment\Access\New Database\Modules\Test\Kaiser\" & rs!ID & safeName & "_KasierReferralForm2022.docx" rs.MoveNext Loop ' 清理资源 wDoc.Close False wApp.Quit Set wDoc = Nothing Set wApp = Nothing Set rs = Nothing End Sub
内容的提问来源于stack exchange,提问作者Sam9616
相关产品推荐
相关产品推荐

