错误尝试从另一个表单运行过程

时间:2018-04-09 18:37:56

标签: vba ms-access access-vba procedure calling-convention

我试图从另一个表单中调用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?

1 个答案:

答案 0 :(得分:1)

虽然您 可以 从表单中调用过程,但它通常避免并被视为不良做法。

需要共享的任何SubFunction都应放在单独的共享模块中。

来自Stewart @ Bytes.com的一些优秀建议:

  

表单代码模块基本上是私有的'在适用范围。它们中定义的函数和子程序通常在相关形式之外不可用 - 尽管实际上可以在表单代码模块中调用范围内定义为Public的函数和子例程。那个模块。

     

使用关键字Public不仅仅是突然添加一个作为风格的变化。它反映了您希望子程序,函数或变量在相关代码模块范围之外可用...

     

可以从 Modules 选项卡创建或打开的代码模块是公共子例程和函数的常用位置。 命名模块提供了一种按逻辑功能对任务进行分组的方法,如果一致使用,则可以帮助维护。

     

我在我的应用程序中使用了许多几个命名模块,将自定义链接表维护与用户名解析,电子邮件处理等分开。我还包括一个" General" 模块,其中包含我认为有用且可在多个数据库中重复使用的一般定制函数(例如,返回当前财政年度或当前季度)在其中)。

     

在可公开访问的代码模块中使用Public关键字定义的所有子例程和函数都可以在相关模块之外使用,而那些定义为Private的子例程和函数不能在代码模块的范围之外使用。驻留。

"如果你必须......"

如果由于某种原因,您必须从表单中调用公共子,则语法为:

Call Forms!FormName.SubName
  • 请注意,被调用的子项必须指定Public关键字。

更多信息: