Привет получил класс с именем «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.