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

时间:2017-11-21 21:09:35

标签: vba forms ms-access access-vba

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

调用'编译错误:预期的子,函数或启示
Application.Run'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.

2 个答案:

答案 0 :(得分:2)

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

不推荐使用Call关键字,并且不会根据字符串调用函数。

答案 1 :(得分:2)

表单是类模块,其运行实例是对象Application.Run不会处理对象。如果要调用对象的方法,则需要使用CallByName并指定对象实例,这将是Me ...除非您特别不能通过{{ 1}}直接到Me,所以你可以引入一个局部变量代理调用:

CallByName

或者,将您要调用的过程移至单独的标准模块,如Erik's answer中所示。

Dim localMe As Object Set localMe = Me CallByName localMe, currSub, vbMethod ', arguments would go here Call DoSomething完全相同:前者是不推荐的显式调用语法,后者是更常用的隐式调用语法。两者都经过编译时验证,这意味着执行DoSomething会抛出编译错误,就像调用Call NonExistingProcedure一样。