Я разрабатывал пользовательское приложение с теми же проблемами, с которыми вы сталкиваетесь сейчас, и вот ответ, который я получил там.
Пожалуйста, проверьте ссылку выше, потому что объяснения Кружки Мэта выходят за рамки моего понимания.Способности объяснить тему.Но вот аббревиатура.
По сути, вы делаете следующее.У вас есть три класса: модель, представление и класс докладчика.Это звучит очень сложно, но на самом деле не так сложно, как только вы освоите его.
Модель
Это модуль класса, в котором хранятся все ваши данные.Таким образом, вместо того, чтобы объявлять группу публичных вариабелей, у вас есть один большой класс, который хранит все данные.Вы также можете иметь несколько классов моделей и классов в качестве членов класса, но для простоты мы берем только три упомянутых целых числа.
Вот пример класса model
: (поместите все это в модуль класса с именем model
)
Option Explicit
' encapsulated data
Private Type TModel
a As Integer
b As Integer
c As Integer
End Type
Private this As TModel
' property get and property let define the way you can interact with data
Public Property Get a() As String
a = this.a
End Property
Public Property Let a(ByVal value As String)
this.a = value
End Property
Public Property Get b() As String
b = this.b
End Property
Public Property Let b(ByVal value As String)
this.b = value
End Property
Public Property Get c() As String
c = this.c
End Property
Public Property Let c(ByVal value As String)
this.c = value
End Property
Вид
Это ваша пользовательская форма.Но ваша UserForm снова является классом, поэтому вы, помимо всего прочего кода, имеете этот код:
Private Type TView
M As Model
IsCancelled As Boolean
IsBack As Boolean
End Type
Private this As TView
Public Property Get Model() As Model
Set Model = this.M
End Property
Public Property Set Model(ByVal value As UImodel)
Set this.M= value
'Validate
End Property
' This is responsible for not destroying all data you have when you x-out the userform
Public Property Get IsCancelled() As Boolean
IsCancelled = this.IsCancelled
End Property
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = VbQueryClose.vbFormControlMenu Then
this.IsCancelled=True
Cancel = True
OnCancel
End If
End Sub
Private Sub OKButton_Click()
Model.a = TextBox1.value
Model.b = TextBox2.value
Model.c = TextBox3.value
Cells(1, 1).value = Model.a
Cells(2, 1).value = Model.b
Cells(3, 1).value = Model.c
'this displays the inputs properly
Me.Hide
End Sub
Presenter
Это обычный модуль.Где вы просто поместите свой код, где вы используете материал. Так для вашего примера кода, как это:
Public Sub Login()
'in module
Dim Ufrm As New UserForm1
Dim M As New Model
Set Ufrm.Model = M
Ufrm.Show
If Ufrm.IsCancelled Then Exit Sub
Set M = Ufrm.Model
MsgBox M.a
MsgBox M.b
MsgBox M.c
End Sub