Как получить UserForm, где расположен объект MSForms.ComboBox? - PullRequest
0 голосов
/ 10 октября 2018

Привет получил класс с именем «FilterLine», он состоит из 3 ComboBox, которые заполняются в зависимости от всех других уже выбранных фильтров.Вот упрощение кода:

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 - это пользовательская форма.Это довольно нелегко, поскольку я называю пользовательскую форму именем, и поэтому класс нельзя использовать без изменений в другой пользовательской форме.Пользовательская форма всегда должна быть пользовательской формой, в которой расположен фильтр по умолчанию. Но как получить пользовательскую форму из ComboBox?

Например, с объектом диапазона вы можете сделать это:

dim rng as Range

set rng = 'Whatever you want

rng.Worksheet.activate

Это активирует рабочий лист, гдеДиапазон расположен.Но как получить экземпляр UserForm из MSForms.ComboBox?

Редактировать:

Чтобы уточнить, я вызываю пользовательскую форму, используя этот код:

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 

Затем UserForm 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 (который является его экземпляром по умолчанию и ему не назначена модель).Поэтому вопрос, вероятно, должен звучать так:

Как можно обратиться к экземпляру пользовательской формы в другом модуле (в данном случае в модуле класса)?

Редактировать 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

Модель является свойством UserForm типа FilterModel.FilterModel (в настоящее время) состоит только из целого числа N и коллекции, в которой хранятся все строки FilterLine.

1 Ответ

0 голосов
/ 10 октября 2018

Вы бы использовали Filter.Parent.

Например:

Создать класс с именем Class1.
Добавить этот код:

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

Откройте форму и дважды нажмите на поле со списком, и он скажет вам имя формы.

...