VBA, как передать переменные пользовательской формы в подпрограмму - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь использовать подпрограмму вызова переменной из ввода пользовательской формы.Но, хотя я могу правильно отображать входные данные пользовательской формы в пользовательской форме, печатая их на листе, я не могу передать их в качестве общедоступной переменной подпрограмме.Когда я вызываю переменные в подпрограмме, они все пусты.

Я использовал это как руководство: Передача переменной из формы в модуль в VBA

Вот мой код:

Public a As String
Public b As Double
Public c As String

Private Sub OKButton_Click()
'from userform
    a = TextBox1.Value
    b = TextBox2.Value
    c = TextBox3.Value

    Cells(1, 1).Value = a
    Cells(2, 1).Value = b
    Cells(3, 1).Value = c
    'this displays the inputs properly
    Unload UserForm1
End Sub

И вмодуль:

Public Sub Login()
'in module
    UserForm1.Show
    MsgBox (a)
    MsgBox (b)
    MsgBox (c)

End Sub

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Я разрабатывал пользовательское приложение с теми же проблемами, с которыми вы сталкиваетесь сейчас, и вот ответ, который я получил там.

Пожалуйста, проверьте ссылку выше, потому что объяснения Кружки Мэта выходят за рамки моего понимания.Способности объяснить тему.Но вот аббревиатура.

По сути, вы делаете следующее.У вас есть три класса: модель, представление и класс докладчика.Это звучит очень сложно, но на самом деле не так сложно, как только вы освоите его.

Модель

Это модуль класса, в котором хранятся все ваши данные.Таким образом, вместо того, чтобы объявлять группу публичных вариабелей, у вас есть один большой класс, который хранит все данные.Вы также можете иметь несколько классов моделей и классов в качестве членов класса, но для простоты мы берем только три упомянутых целых числа.

Вот пример класса 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
0 голосов
/ 21 ноября 2018

Делай как это.Поместите вашу публичную переменную в код модуля.

Public a As String
Public b As Double
Public c As String

Public Sub Login()
'in module
    UserForm1.Show
    MsgBox (a)
    MsgBox (b)
    MsgBox (c)

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...