【问题标题】:VBA Calling a subroutine in one user form from another user formVBA 从另一个用户表单调用一个用户表单中的子例程
【发布时间】:2017-04-21 21:36:50
【问题描述】:

我正在使用 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

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

在上述情况下,我得到运行时错误“424”需要对象。

我尝试了这个论坛中提出的各种解决方案,但没有找到解决方案。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

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

    frmClientInfo.show Modal:=False
    

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

    1- 像这样修改frmClientInfo 的PopulateClientInfo 方法:

    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 的调用。

    【讨论】:

    • 我尝试了您的建议,但不幸的是,我仍然收到相同的“424”错误。
    • @Jane 你在用Option Explicit吗?如果没有,我相信如果你设置了错误,我们会得到更好的信息。
    【解决方案2】:

    您不能从模块外部调用表单模块中的过程。试试这个代码(对不起,我没有)。

    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 属性。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 2019-04-29
      相关资源
      最近更新 更多