我正在使用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'对象必需。
我已尝试在此论坛中提供的各种解决方案,但尚未找到解决方案。
答案 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
。