Excel VBA Получить значение (целое число K), найденное в частном подпрограмме «UserForm1», к подпрограмме «Module1» - PullRequest
0 голосов
/ 28 марта 2019

У меня проблемы с получением значения K (целое число) от моего Private Sub в UserForm1 до моего Sub в Module1.Я использую UserForm1, чтобы объявить, на каком листе я хочу запустить код (выбрав из выпадающего списка, а затем объявить это как значение / целое число от 2 до 9), поэтому мне нужно только передать значениеK Я нахожу в UserForm1 Private Sub значение Sub в моем Module1.

Я надеюсь, что это понятно, то есть я хочу иметь возможность прочитать значение Kнаходится в UserForm1, в моем Module1 скрипте.

Мой текущий код выглядит следующим образом, начиная с Module part:

Sub HenteMengderFraAutoCAD()
Dim K As Integer

Load UserForm1
UserForm1.Show

MsgBox (K)

Unload UserForm1
End Sub

Далее мой код вUserForm, где я нахожу значение для использования в коде:

Private Sub UserForm_Activate()
ComboBox1.Clear

With ComboBox1
    .AddItem "M350 og XT"
    .AddItem "STB 300+450"
    .AddItem "Alufix"
    .AddItem "MevaDec og MevaFlex"
    .AddItem "Alshor Plus"
    .AddItem "Rapidshor"
    .AddItem "KLK og Sjaktdragere"
End With
End Sub

Private Sub CommandButton1_Click()
If ComboBox1 = "M350 og XT" Then
    K = 2
ElseIf ComboBox1 = "STB 300+450" Then
    K = 3
ElseIf ComboBox1 = "Alufix" Then
    K = 4
ElseIf ComboBox1 = "MevaDec og MevaFlex" Then
    K = 5
ElseIf ComboBox1 = "Alshor Plus" Then
    K = 6
ElseIf ComboBox1 = "Rapidshor" Then
    K = 7
ElseIf ComboBox1 = "KLK og Sjaktdragere" Then
    K = 9
End If
MsgBox (K)
UserForm1.Hide
End Sub

Private Sub CommandButton2_Click()
Unload UserForm1
End Sub

Фактическим результатом будет то, что MsgBox(K) в сценарии Module1 будет показывать то же число, что MsgBox(K) показывает мне вUserForm1,Теперь я получаю правильное значение для K (от 2 до 9 в зависимости от того, что я выбираю в раскрывающемся списке) в MsgBox in the UserForm1, но в Module1 MsgBox я получаю только 0.

Inзаранее, спасибо.

Ответы [ 3 ]

4 голосов
/ 28 марта 2019

UserForms являются объектами. Рекомендуемый и надежный подход для чтения / записи значений из объектов - использование свойств. Вы можете создать свойство и затем получить к нему доступ в вашем модуле


Пример кода. Прочитайте комментарии к коду для деталей.

Форма пользователя:

Option Explicit

'/ backing field for the custom property
Private m_MyProperty                As Long

'/ A public variable. Not recommended.
Public lAccessibleVariable          As Long

'/ Define property setters and getters
Public Property Let MyProperty(val As Long)
    m_MyProperty = val
End Property

Public Property Get MyProperty() As Long
 MyProperty = m_MyProperty
End Property

Private Sub CommandButton1_Click()
    '/ Do something to the property
    MyProperty = 10
    lAccessibleVariable = 100

    '/ Make sure you just hide the form and not close(destroy it)
    Me.Hide
End Sub

Модуль

Sub test()

    '/ Create an instance of the user form
    Dim frm As New UserForm1
    Dim lValFromUserForm  As Long

    '/ launch the user form
    frm.Show


    '/ Read back the property value
    lValFromUserForm = frm.MyProperty

    '/ do something with the returned value
    MsgBox lValFromUserForm

    '/Just for example, access the public variable.
    MsgBox frm.lAccessibleVariable

    '/ Now that you are done, destroy the user form
    Unload frm


End Sub
1 голос
/ 28 марта 2019

Мой подход согласуется с Брайаном М. Стаффордом.

1-й: объявите K как открытую переменную в вашей UserForm1 перед любыми подпрограммами,

public K as integer

второй:

Sub HenteMengderFraAutoCAD()

Load UserForm1
UserForm1.Show

MsgBox (UserForm1.K)

Unload UserForm1
End Sub
1 голос
/ 28 марта 2019

Если в коде пользовательской формы вы измените внутренние ссылки с UserForm1 на Me, т.е.

UserForm1.Hide
End Sub

Private Sub CommandButton2_Click()
Unload UserForm1

до

Me.Hide
End Sub

Private Sub CommandButton2_Click()
Unload Me

и объявить открытую переменную в пользовательской форме, например:

Public K As Integer

Тогда вы можете использовать:

Sub HenteMengderFraAutoCAD()
Dim K As Integer

With New UserForm1
    .Show
    K = .K
End With

MsgBox (K)
End Sub

Полный код пользовательской формы

Option Explicit
Public K As Integer

Private Sub UserForm_Activate()
ComboBox1.Clear

With ComboBox1
    .AddItem "M350 og XT"
    .AddItem "STB 300+450"
    .AddItem "Alufix"
    .AddItem "MevaDec og MevaFlex"
    .AddItem "Alshor Plus"
    .AddItem "Rapidshor"
    .AddItem "KLK og Sjaktdragere"
End With
End Sub

Private Sub CommandButton1_Click()
If ComboBox1 = "M350 og XT" Then
    K = 2
ElseIf ComboBox1 = "STB 300+450" Then
    K = 3
ElseIf ComboBox1 = "Alufix" Then
    K = 4
ElseIf ComboBox1 = "MevaDec og MevaFlex" Then
    K = 5
ElseIf ComboBox1 = "Alshor Plus" Then
    K = 6
ElseIf ComboBox1 = "Rapidshor" Then
    K = 7
ElseIf ComboBox1 = "KLK og Sjaktdragere" Then
    K = 9
End If
MsgBox (K)
Me.Hide
End Sub

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