如何获得 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

打开表单并双击组合框,它会告诉您表单的名称。