我希望用户使用用户窗体中的组合框从工作表的列中选择一个值-从那里,程序从该行中提取一个值(特别是指向另一个工作簿的超链接)。之后,应该弹出另一个用户窗体(列表框),其中填充了第二个工作簿中一行的值。
当前,我遇到的问题是将超链接值(这是一个变体)转移到第二个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。第二个用户窗体确实显示了(但显然是空的)
答案 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。