Excel 如何将值从一个用户窗体的代码传递到另一个用户窗体
我希望用户使用userform中的组合框从工作表中的一列中选择一个值——从那里,程序从该行中提取一个值,特别是一个指向另一个工作簿的超链接。之后,将弹出另一个userform列表框,其中填充了第二个工作簿中某行的值 目前,我遇到的一个问题是将超链接值转换为第二个useform的代码,这样它就可以从超链接指向的工作簿中获取值 我曾尝试公开超链接变量,并尝试复制在internet上找到的类似操作 在第一个用户表单的代码中:Excel 如何将值从一个用户窗体的代码传递到另一个用户窗体,excel,vba,Excel,Vba,我希望用户使用userform中的组合框从工作表中的一列中选择一个值——从那里,程序从该行中提取一个值,特别是一个指向另一个工作簿的超链接。之后,将弹出另一个userform列表框,其中填充了第二个工作簿中某行的值 目前,我遇到的一个问题是将超链接值转换为第二个useform的代码,这样它就可以从超链接指向的工作簿中获取值 我曾尝试公开超链接变量,并尝试复制在internet上找到的类似操作 在第一个用户表单的代码中: Public hyperlink_A As Variant Private
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
有关有状态默认实例的陷阱和警告的更多详细信息,请参阅