如何获得 MSForms.ComboBox 对象所在的用户窗体?
How does one get the UserForm where MSForms.ComboBox Object is located?
您好,有一个 Class 叫做 "FilterLine",它由 3 个组合框组成,根据所有其他已选择的过滤器进行填充。这里是代码的简化:
Option Explicit
Public WithEvents Filter As MSForms.Combobox
Public WithEvents Operator As MSForms.Combobox
Public WithEvents Options As MSForms.Combobox
Public index As Integer
' This sub adds a new FilterLine and formats it
Public Sub Add()
' Do Stuff with form in which it is embedded
frmFilter.Height = frmFilter.Height + 50
End Sub
' Other subs
其中 frmFilter 是用户窗体。这是相当不雅的,因为我将用户窗体称为名称,因此 class 不能在不更改另一个用户窗体的情况下使用。用户窗体应该始终是默认过滤器所在的用户窗体。 但是如何从 ComboBox 获取用户表单?
例如,对于范围对象,您可以这样做:
dim rng as Range
set rng = 'Whatever you want
rng.Worksheet.activate
这将激活区域所在的工作表。但是如何从 MSForms.ComboBox 中获取 UserForm 实例呢?
编辑:
为了澄清,我使用以下代码调用用户表单:
Sub testFilter()
Dim Filterm As FilterModel
Set Filterm = New FilterModel
With New frmFilter
Set .Model = Filterm
.SetDefaultFilter' This is the interesting part
.Show
End With
End Sub
然后用户窗体 Instance.SetDefaultFilter 将默认过滤器设置为:
Public Sub SetDefaultFilterLine()
Dim DefaultFilterLine As New FilterLine
Set DefaultFilterLine.Filter = frmFilter.DefaultFilter
Set DefaultFilterLine.Operator = frmFilter.DefaultOperator
Set DefaultFilterLine.Options = frmFilter.DefaultOptions
DefaultFilterLine.index = 1
Me.Model.FilterCol.Add DefaultFilterLine
' This doesn't work because I cannot refer to the instance I newed up in the testFilter Sub.
DefaultFilterLine.Add
End Sub
DefaultFilterLine.Add 不起作用,因为代码使用 frmFilter(这是它的默认实例,没有分配给它的模型)。因此问题应该是:
如何在另一个模块(在本例中为 class 模块)中引用用户窗体实例?
编辑 2:
这是frmFilter的相关代码:
Public DisableEvents As Boolean
Private Type TView
Model As FilterModel
IsCancelled As Boolean
IsBack As Boolean
End Type
Private this As TView
Public Property Get Model() As FilterModel
Set Model = this.Model
End Property
Public Property Set Model(ByVal value As FilterModel)
Set this.Model = value
'Validate
End Property
模型是类型 FilterModel 的用户窗体的 属性。 FilterModel(当前)仅包含一个 Integer N 和一个存储所有 FilterLine 的集合。
您会使用 Filter.Parent
。
例如:
创建一个名为 Class1
的 class。
添加此代码:
Public WithEvents Filter As MSForms.ComboBox
Private Sub Filter_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox Filter.Parent.Name
End Sub
UserForm1
包含一个名为 ComboBox1
.
的组合框
将此代码添加到表单中:
Private colEvents As Collection
Private Sub UserForm_Initialize()
Dim MyEvents As Class1
Set colEvents = New Collection
Set MyEvents = New Class1
Set MyEvents.Filter = Me.ComboBox1
colEvents.Add MyEvents
End Sub
打开表单并双击组合框,它会告诉您表单的名称。
您好,有一个 Class 叫做 "FilterLine",它由 3 个组合框组成,根据所有其他已选择的过滤器进行填充。这里是代码的简化:
Option Explicit
Public WithEvents Filter As MSForms.Combobox
Public WithEvents Operator As MSForms.Combobox
Public WithEvents Options As MSForms.Combobox
Public index As Integer
' This sub adds a new FilterLine and formats it
Public Sub Add()
' Do Stuff with form in which it is embedded
frmFilter.Height = frmFilter.Height + 50
End Sub
' Other subs
其中 frmFilter 是用户窗体。这是相当不雅的,因为我将用户窗体称为名称,因此 class 不能在不更改另一个用户窗体的情况下使用。用户窗体应该始终是默认过滤器所在的用户窗体。 但是如何从 ComboBox 获取用户表单?
例如,对于范围对象,您可以这样做:
dim rng as Range
set rng = 'Whatever you want
rng.Worksheet.activate
这将激活区域所在的工作表。但是如何从 MSForms.ComboBox 中获取 UserForm 实例呢?
编辑:
为了澄清,我使用以下代码调用用户表单:
Sub testFilter()
Dim Filterm As FilterModel
Set Filterm = New FilterModel
With New frmFilter
Set .Model = Filterm
.SetDefaultFilter' This is the interesting part
.Show
End With
End Sub
然后用户窗体 Instance.SetDefaultFilter 将默认过滤器设置为:
Public Sub SetDefaultFilterLine()
Dim DefaultFilterLine As New FilterLine
Set DefaultFilterLine.Filter = frmFilter.DefaultFilter
Set DefaultFilterLine.Operator = frmFilter.DefaultOperator
Set DefaultFilterLine.Options = frmFilter.DefaultOptions
DefaultFilterLine.index = 1
Me.Model.FilterCol.Add DefaultFilterLine
' This doesn't work because I cannot refer to the instance I newed up in the testFilter Sub.
DefaultFilterLine.Add
End Sub
DefaultFilterLine.Add 不起作用,因为代码使用 frmFilter(这是它的默认实例,没有分配给它的模型)。因此问题应该是:
如何在另一个模块(在本例中为 class 模块)中引用用户窗体实例?
编辑 2:
这是frmFilter的相关代码:
Public DisableEvents As Boolean
Private Type TView
Model As FilterModel
IsCancelled As Boolean
IsBack As Boolean
End Type
Private this As TView
Public Property Get Model() As FilterModel
Set Model = this.Model
End Property
Public Property Set Model(ByVal value As FilterModel)
Set this.Model = value
'Validate
End Property
模型是类型 FilterModel 的用户窗体的 属性。 FilterModel(当前)仅包含一个 Integer N 和一个存储所有 FilterLine 的集合。
您会使用 Filter.Parent
。
例如:
创建一个名为 Class1
的 class。
添加此代码:
Public WithEvents Filter As MSForms.ComboBox
Private Sub Filter_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox Filter.Parent.Name
End Sub
UserForm1
包含一个名为 ComboBox1
.
的组合框
将此代码添加到表单中:
Private colEvents As Collection
Private Sub UserForm_Initialize()
Dim MyEvents As Class1
Set colEvents = New Collection
Set MyEvents = New Class1
Set MyEvents.Filter = Me.ComboBox1
colEvents.Add MyEvents
End Sub
打开表单并双击组合框,它会告诉您表单的名称。