Excel VBA操作Access导入bas模块运行函数提示找不到对象问题咨询
问题解答
1. 报错触发原因
- 核心原因是调用方法使用错误:
DoCmd.RunMacro是Access用来运行**独立的宏对象(即你在Access界面手动创建的.macro类型文件对象)**的方法,它不会去标准模块的VBA代码里查找自定义函数,你传入函数名后Access只会在宏对象列表检索,找不到对应对象就会抛出该报错。 - 补充注意:你当前使用后期绑定创建Access对象,代码里的内置常量
acCmdCompileAndSaveAllModules没有被定义,实际运行时这行也会报错,需要提前定义该常量值为126,或者切换为前期绑定引用Access类型库。
2. DoCmd.RunMacro调用带参数自定义函数的语法是否正确
完全不正确,该方法本身不支持调用VBA自定义函数:DoCmd.RunMacro的参数定义为:DoCmd.RunMacro(宏名, 运行次数, 运行条件),第二个参数是指定宏重复运行的次数,第三个是判断宏是否运行的条件表达式,完全不是用来给自定义函数传参的。
正确实现方案
要调用Access VBA模块里的自定义过程/函数,使用Application.Run方法即可,修正后的调用代码如下:
' 提前定义后期绑定下缺失的Access常量 Const acCmdCompileAndSaveAllModules = 126 Sub Excel_RunMacroOnAccess() On Error GoTo errHandler ' Access object Dim appAccess As Object ' Create new access object Set appAccess = CreateObject("Access.Application") ' Open the access project appAccess.OpenCurrentDatabase (ActiveSheet.Range("B2").Value) ' Show Access appAccess.Visible = True ' Module to be imported Dim modFile As String: modFile = "C:\dbTest\mod_HelloAccess.bas" ' If module exists If Len(Dir(modFile)) > 0 Then ' Import module appAccess.VBE.ActiveVBProject.VBComponents.Import modFile ' Save modules appAccess.DoCmd.RunCommand acCmdCompileAndSaveAllModules ' 无参函数调用 加模块名前缀可避免重名问题 appAccess.Run "mod_HelloAccess.HelloAccess" ' 带参函数调用 appAccess.Run "mod_HelloAccess.Hello", "World" End If exitRoutine: ' Close database appAccess.CloseCurrentDatabase ' Close Access appAccess.Quit Exit Sub errHandler: Debug.Print Err.Description Resume exitRoutine End Sub
额外提示:需要先把Access数据库所在文件夹加入Access的受信任位置,避免VBA运行权限拦截导致调用失败。
内容的提问来源于stack exchange,提问作者mjRola
相关产品推荐
相关产品推荐

