2017-04-21 85 views
2

我正在使用Excel VBA。我有两种用户形式: ClientInfo和ClientSearchVBA从另一个用户表单调用一个用户表单中的子例程

在ClientSearch中,我搜索Excel工作表以列出具有相同姓氏的所有客户端。从那里,我选择我想要的客户端(通过突出显示列表中的名称并单击命令按钮cmdOpenClientInfo)并确定其ClientID(也在工作表中)。 那么我想这个客户端ID传递到形式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(客户端ID)

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

我已经尝试过在本论坛中提出的各种解决方案,但还没有找到解决方案。

回答

1

您拨打frmClientInfo.show的电话号码为模式模式,因此下一条语句将不会执行,直到新表格关闭。您可以尝试打电话非模态:

frmClientInfo.show Modal:=False 

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

1-修改您的frmClientInfoPopulateClientInfo方法是这样的:

Public Sub PopulateClientInfo(ClientID As Integer) 
    '.... 
    'populate The fields, then: 
    '.... 
    Me.Show ' <-- form shows itself after populating its fields 
End Sub 

2-在ClientSearch形式取出调用frmClientInfo.show

+0

我试过你的建议,但不幸的是,我仍然得到相同的'424'错误。 – Jane

+0

@Jane你使用Option Explicit吗?如果不是这样,我相信如果你设置了错误,我们会有更好的错误信息。 –

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方法但您可以访问其所有控件时,该对象才会显示。要将变量传递给该表单,您可以解决其中的任何一个问题。也许你有一个Tbx应该显示ClientID。您可以访问该Tbx并设置其值。上面的代码将ClientID分配给表单本身的Tag属性。

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

请注意,当ClientInfo表单关闭时,代码将继续在cmdOpenClientInfo_Click过程中运行。因此,一方面,这是从记忆中删除该表格的时候。另一方面,'FrmInfo'对象仍然存在,您可以从它中选择您想要在拨打电话的表单中使用的任何信息。语法非常简单,例如,FrmInfo.Textbox1.Value

相关问题