如何将值从一种用户窗体的代码传递给另一种

时间:2019-06-05 16:06:18

标签: excel vba

我希望用户使用用户窗体中的组合框从工作表的列中选择一个值-从那里,程序从该行中提取一个值(特别是指向另一个工作簿的超链接)。之后,应该弹出另一个用户窗体(列表框),其中填充了第二个工作簿中一行的值。

当前,我遇到的问题是将超链接值(这是一个变体)转移到第二个useform的代码,以便它可以从超链接指向的工作簿中获取值。

我尝试将超链接变量设为公开,并尝试复制在互联网上发现的类似操作。

在第一个用户表单的代码中:

Public hyperlink_A As Variant

Private Sub findColumns_button_Click()  'within uf_TestSelector
    With uf_ColSelectA
        .hyperlink_A = hyperlink_A
        .Show
    End With
    fillData    'not relevant
End Sub

在第二个用户窗体的代码中:

Option Explicit
Public mainWorkbook As Workbook
Public hyperlink_A As Variant

Private Sub UserForm_Initialize()    'uf_ColSelectA
    With Application.ActiveWindow
        Me.Left = .Left + (.Width - Me.Width) / 2
        Me.Top = .Top + (.Height - Me.Height) / 2
    End With

    MsgBox hyperlink_A  'shows empty MsgBox so hyperlink_A = empty
                        'MsgBox only for debugging purposes

    Dim wb As Workbook
    Set wb = Workbooks.Open(Filename:=hyperlink_A)
End Sub

我期望MsgBox超链接_A打开带有第二个工作簿路径的MsgBox,当前它返回一个空的MSgBox。第二个用户窗体确实显示了(但显然是空的)

1 个答案:

答案 0 :(得分:1)

Initialize处理程序在创建表单类的实例时运行-并且由于您是针对表单的默认实例进行编码的,因此,不控制何时发生。

一经引用,便会自动创建一个类的默认实例(将VB_PredeclaredId属性设置为True的任何类-不仅是用户表单)。在这种情况下,假设这是在此执行路径中首次引用此表单,则在这里:

With uf_ColSelectA

如果您在此行后立即放置一个断点( F9 ),您将看到在 执行到达.hyperlink_A = hyperlink_A之前弹出一个空消息框。指示。

如果您想继续使用有状态的用户窗体默认实例,可以通过将Initialize处理程序中拥有的代码移到Activate事件的处理程序中进行操作-每当表单是 activated 激活的-因为这是 modal 表单,所以只要您.Show该表单,该代码段就可以运行。

Private Sub UserForm_Activate()    'uf_ColSelectA
    With Application.ActiveWindow
        Me.Left = .Left + (.Width - Me.Width) / 2
        Me.Top = .Top + (.Height - Me.Height) / 2
    End With

    MsgBox hyperlink_A 

    Dim wb As Workbook
    Set wb = Workbooks.Open(Filename:=hyperlink_A)
End Sub

如果您想控制对象的创建方式(强烈建议),那么您需要自己New上课。所以代替这个:

With uf_ColSelectA
    '...
    .Show
End With

您将执行以下操作:

With New uf_ColSelectA
    '...
    .Show
End With

有关有状态默认实例的陷阱和警告,请参见UserForm1.Show