我有一个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.
答案 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
一样。