VBA从另一个用户表单调用一个用户表单中的子例程

时间:2017-04-21 21:36:50

标签: vba excel-vba excel

我正在使用Excel VBA。我有两个用户表单: ClientInfo和ClientSearch

在ClientSearch中,我搜索excel工作表以列出具有相同姓氏的所有客户端。从那里,我选择我想要的客户端(通过突出显示列表中的名称并单击命令按钮cmdOpenClientInfo)并确定其ClientID(也在工作表中)。 然后,我想将此ClientID传递给ClientInfo表单,以便使用工作表中的相关数据填充此表单上的所有文本框:

以ClientSearch表格编码:

Private Sub cmdOpenClientInfo_Click()

 Dim ClientID As Integer

 ClientID = textSrchClientID.value

'user msgbox to check to make sure I get the correct ClientID ... and I do

 msgbox(ClientID)

 Me.Hide

 frmClientInfo.show

Call frmClientInfo.PopulateClientInfo(ClientID)  'this is where it fails

End Sub

以ClientInfo形式编码:

Sub PopulateClientInfo(ClientID As Integer)

  'this is where I would populate the text field

End Sub

例程总是卡在 CALL frmClientInfo.PopulateClientInfo(ClientID)

在上面的例子中,我得到运行时错误'424'对象必需。

我已尝试在此论坛中提供的各种解决方案,但尚未找到解决方案。

2 个答案:

答案 0 :(得分:1)

您对frmClientInfo.show的呼叫处于模态模式,因此在新表单关闭之前,下一个语句不会执行。您可以尝试将呼叫设为非模态:

frmClientInfo.show Modal:=False

但这可能是其他问题的根源。最好继续在模态模式下工作,但在显示之前将ClientID参数传递给表单

1-修改PopulateClientInfo的{​​{1}}方法,如下所示:

frmClientInfo

2-删除Public Sub PopulateClientInfo(ClientID As Integer) '.... 'populate The fields, then: '.... Me.Show ' <-- form shows itself after populating its fields End Sub 表单中对frmClientInfo.show的来电。

答案 1 :(得分:0)

您无法从该模块外部调用表单模块中的过程。试试这段代码(抱歉,我没有)。

Private Sub cmdOpenClientInfo_Click()

    Dim ClientID As Integer
    Dim FrmInfo As frmClientInfo

    ClientID = textSrchClientID.Value

    'user msgbox to check to make sure I get the correct ClientID ... and I do

    MsgBox (ClientID)

    Me.Hide

    Set FrmInfo = New frmClientInfo
    With FrmInfo
        .Tag = ClientID
        .Show

        ' make this call in the FrmInfo Activate event procedure
        ' PopulateClientInfo(cint(Me.Tag)
    End With
    Unload FrmInfo
    Set FrmInfo = Nothing
End Sub

我假设您有一个名为frmClientInfo的表单。您可以使用命令Set FrmInfo = New frmClientInfo创建该表单的实例。在调用Show方法但您可以访问其所有控件之前,不会显示此对象。要将变量传递给该表单,您可以解决其中任何一个问题。也许你有一个应该显示ClientID的Tbx。您可以访问该Tbx并设置其值。上面的代码将ClientID分配给表单本身的Tag属性。

调用Show方法时,将发生表单的Activate事件。那将是运行PopulateClientInfo过程的时刻(当然是在frmClientInfo模块中),从Tag属性中检索ClientId。

请记住,当ClientInfo表单关闭时,代码将继续在cmdOpenClientInfo_Click过程中运行。所以,一方面是从内存中删除该表单的时候了。另一方面,'FrmInfo'对象仍然存在,您可以从中选择您可能希望在进行调用的表单中使用的任何信息。语法非常简单,例如FrmInfo.Textbox1.Value