Excel 如何将值从一个用户窗体的代码传递到另一个用户窗体

Excel 如何将值从一个用户窗体的代码传递到另一个用户窗体,excel,vba,Excel,Vba,我希望用户使用userform中的组合框从工作表中的一列中选择一个值——从那里,程序从该行中提取一个值,特别是一个指向另一个工作簿的超链接。之后,将弹出另一个userform列表框,其中填充了第二个工作簿中某行的值 目前,我遇到的一个问题是将超链接值转换为第二个useform的代码,这样它就可以从超链接指向的工作簿中获取值 我曾尝试公开超链接变量,并尝试复制在internet上找到的类似操作 在第一个用户表单的代码中: Public hyperlink_A As Variant Private

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

目前,我遇到的一个问题是将超链接值转换为第二个useform的代码,这样它就可以从超链接指向的工作簿中获取值

我曾尝试公开超链接变量,并尝试复制在internet上找到的类似操作

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

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
在第二个userform的代码中:

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 hyperlink_A打开一个带有第二个工作簿路径的MsgBox,当前它返回一个空MsgBox。第二个userform确实显示但显然是空的

初始化处理程序在创建表单类的实例时运行-由于您是根据表单的默认实例进行编码,因此无法控制何时发生

任何具有VB_PredeclaredId属性设置为True的类(不仅仅是userforms)的默认实例在被引用时都会自动创建。在这种情况下,假设这是此执行路径中首次引用此表单,则如下所示:

With uf_ColSelectA
如果将断点F9放在这一行之后,您将看到在执行到达.hyperlink\u a=hyperlink\u a指令之前弹出空消息框

如果您想继续使用有状态的userform默认实例,可以通过将Initialize处理程序中的代码移动到Activate事件的处理程序中来实现,激活事件将在表单激活时触发,因为这是一个模式表单,因此无论何时都可以运行此代码块。显示该表单

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
如果您想控制对象的创建方式,那么您需要自己创建新的类。因此,与此相反:

With uf_ColSelectA
    '...
    .Show
End With
您将执行以下操作:

With New uf_ColSelectA
    '...
    .Show
End With
有关有状态默认实例的陷阱和警告的更多详细信息,请参阅