我试图从另一个表单中调用Sub,但是我得到了:
Error 2465: Application defined error or object defined error
我已经知道要从另一个表单调用一个过程,我可以使用语法:
Form(Name).Procedure
但是,在这种情况下,我想从变量(Type Form)引用此表单。
来自表单Parametro_Cadastro
的代码:
Dim formCaller As Form
Set formCaller = Application.Forms("Cadastro_Aluno").Form
If (Not formCaller Is Nothing) Then
'
formCaller.SetDadosParametroCadastro Me.txtKey.Value, dadoAlterado
Set formCaller = Nothing
End If
来自表单Cadastro_Aluno
的代码:
Sub SetDadosParametroCadastro(ByVal KeyValue As String, ByVal DataValue As String)
'
'...
End Sub
Parametro_Cadastro
中的代码在行上显示Error 2465
:
formCaller.SetDadosParametroCadastro Me.txtKey.Value, dadoAlterado`
...甚至在要调用SetDadosParametroCadastro
形式的子Cadastro_Alunos
之前。
在立即窗口中,变量formCaller
已按预期签署为Form\Form_Cadastro_Alunos
。
在这种情况下我该怎么办?
修改
唯一可行的方法是将变量formCaller
分配给Access.Forms(formName)
而不是Application.Forms(formName)
或简称Forms(formName)
,因此代码现在如下所示:
来自表单Parametro_Cadastro
的代码:
Dim formCaller As Form
Set formCaller = Access.Forms("Cadastro_Aluno")
If (Not formCaller Is Nothing) Then
'
formCaller.SetDadosParametroCadastro Me.txtKey.Value, dadoAlterado
Set formCaller = Nothing
End If
当我在Imediate Window中检查变量formCaller
时,我也得到(像以前一样)Forms\Form_Cadastro_Alunos
。
有趣的是,这只是改变使代码按预期工作。也许要调用的Forms成员来自Access Object而不是Applications?
答案 0 :(得分:1)
虽然您 可以 从表单中调用过程,但它通常避免并被视为不良做法。
需要共享的任何Sub
或Function
都应放在单独的共享模块中。
表单代码模块基本上是私有的'在适用范围。它们中定义的函数和子程序通常在相关形式之外不可用 - 尽管实际上可以在表单代码模块中调用范围内定义为
Public
的函数和子例程。那个模块。使用关键字
Public
不仅仅是突然添加一个作为风格的变化。它反映了您希望子程序,函数或变量在相关代码模块范围之外可用...可以从 Modules 选项卡创建或打开的代码模块是公共子例程和函数的常用位置。 命名模块提供了一种按逻辑功能对任务进行分组的方法,如果一致使用,则可以帮助维护。
我在我的应用程序中使用了许多几个命名模块,将自定义链接表维护与用户名解析,电子邮件处理等分开。我还包括一个" General" 模块,其中包含我认为有用且可在多个数据库中重复使用的一般定制函数(例如,返回当前财政年度或当前季度)在其中)。
在可公开访问的代码模块中使用
Public
关键字定义的所有子例程和函数都可以在相关模块之外使用,而那些定义为Private的子例程和函数不能在代码模块的范围之外使用。驻留。
如果由于某种原因,您必须从表单中调用公共子,则语法为:
Call Forms!FormName.SubName
Public
关键字。