Forms MS Access调用/Application.Run过程存储为变量不起作用

Forms MS Access调用/Application.Run过程存储为变量不起作用,forms,ms-access,vba,Forms,Ms Access,Vba,我有一个MS Access表单,其中有一个带有程序列表的列表框。程序代码存储在表单中。还有一个按钮。单击按钮时,我希望它在列表框中循环并从所选项目运行过程。我正在使用Call和Application.Run调用过程,但这两个方法都给出了错误 调用“编译错误:应为子、函数或Proeprty” 应用程序。运行“MS Access找不到过程名称” Private Sub button_Click() With Me.listbox1 For Each varItem In .ItemsSel

我有一个MS Access表单,其中有一个带有程序列表的列表框。程序代码存储在表单中。还有一个按钮。单击按钮时,我希望它在列表框中循环并从所选项目运行过程。我正在使用Call和Application.Run调用过程,但这两个方法都给出了错误

调用“编译错误:应为子、函数或Proeprty”
应用程序。运行“MS Access找不到过程名称”

Private Sub button_Click()

With Me.listbox1
    For Each varItem In .ItemsSelected
        currSub = .ItemData(varItem)
        If Not IsNull(varItem) Then
            Call currSub 'Compile Error: Expected Sub, Function, or Proeprty                
            Application.Run currSub 'MS Access cannot find the procedure 'Name of Procedure'
        End If
    Next
End With

Sub NameOfcurrSub1()
   'some code
End Sub

Sub NameOfcurrSub2()
   'some code
End Sub
etc.

如果要使用
Application.Run
调用sub,则需要将其存储在单独的标准模块(.bas,而不是.cls)中。把你的潜艇移到一个单独的模块,它就会工作


Call
关键字已弃用,并且不会基于字符串调用函数。

如果要使用
应用程序.Run
调用sub,则需要将其存储在单独的标准模块(.bas,而不是.cls)中。把你的潜艇移到一个单独的模块,它就会工作

Call
关键字已弃用,并且不会基于字符串调用函数。

表单是类模块,其运行实例是对象:
应用程序。Run
不会处理对象。如果要调用对象的方法,需要使用
CallByName
并指定对象实例,即
Me
。。。除非您无法将
Me
直接传递给
CallByName
,因此您可以引入一个局部变量来代理调用:

Dim localMe As Object
Set localMe = Me
CallByName localMe, currSub, vbMethod ', arguments would go here
或者,将要调用的过程移动到单独的标准模块,如中所示

calldosomething
DoSomething
完全相同:前者是不推荐的显式调用语法,后者是更常用的隐式调用语法。两者都是编译时验证的,这意味着调用不存在的过程将抛出编译错误,就像调用不存在的过程一样。

表单是类模块,其运行实例是对象:
应用程序。Run
不会关闭对象。如果要调用对象的方法,需要使用
CallByName
并指定对象实例,即
Me
。。。除非您无法将
Me
直接传递给
CallByName
,因此您可以引入一个局部变量来代理调用:

Dim localMe As Object
Set localMe = Me
CallByName localMe, currSub, vbMethod ', arguments would go here
或者,将要调用的过程移动到单独的标准模块,如中所示

calldosomething
DoSomething
完全相同:前者是不推荐的显式调用语法,后者是更常用的隐式调用语法。两者都是编译时验证的,这意味着执行
调用不存在的过程
将抛出编译错误,就像调用
不存在的过程
一样