Как я могу запустить пользовательскую форму из макроса? - PullRequest
0 голосов
/ 30 января 2019

Я разработал множество пользовательских функций и макросов в VBA для Excel 2016. Один из моих макросов использует поле ввода для получения данных, которые впоследствии используются макросом.Я хочу заменить поле ввода пользовательской формой.Я создал форму пользователя, с одним текстовым полем.Я хочу активировать пользовательскую форму, заполняя текстовое поле данными по умолчанию и возвращая данные текстового поля в макрос, когда выбрано ОК.Я тщательно искал сквозной пример для всего кода, необходимого для этого, но безуспешно.Существует ли пример для этой простой проблемы?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Добавьте объект в форму пользователя.Для этого ответа воспользуемся следующим кодом в пользовательской форме.

Public Property Get MyResult() As String
    ' You may want to do any manipulation here
    ' including converting to a number, in which case the return type should be changed (*)
    MyResult = TextBox1.Text
End Property

(*) Если вы выполняете преобразование, вы можете использовать другую функцию в своей пользовательской форме, чтобы отключить кнопку «ОК» доу них есть действительные конвертируемые данные в текстовом поле.

Вы также хотите узнать, нажали ли они "Отмена"

Public Property Get Cancelled() As Boolean
    Cancelled = pCancelled ' Declare pCancelled as a Boolean in the scope of the form
End Property

Public Sub CancelButton_Click() ' Standard click event for the button
    pCancelled = True
    Me.Hide
End Sub

Public Sub OKButton_Click() ' Standard click event for the button
    pCancelled = False
    Me.Hide
End Sub

В вашем вызывающем макросе

MyForm.Show ' This is modal, so will block execution until a response is provided
If Not MyForm.Cancelled Then
    Debug.Print MyForm.MyResult
    'Do something with MyForm.MyResult
End If
UnLoad MyForm ' assuming you do not want to re-use this form as part of your logic.
0 голосов
/ 30 января 2019

Существует пример того, как вы можете передать значение в форму и получить результат обратно.В этом подходе используется объект Scripting.Dictionary, созданный в стандартной области видимости модуля и переданный в пользовательскую форму для изменения значений.Таким образом, можно отправлять значения по умолчанию в пользовательскую форму и сохранять значения результатов в словаре даже после закрытия и выгрузки пользовательской формы.У вас может быть несколько значений, просто добавьте необходимое количество ключей в словарь, например, oData("property1"), oData("property2") и т. Д.

Добавьте в проект стандартный модуль и вставьте в него приведенный ниже код:

Option Explicit

Sub Test()

    Dim oData

    ' Set default value and show form
    Set oData = CreateObject("Scripting.Dictionary")
    oData("") = "Some default text"
    UserForm1.ShowForm oData
    ' Wait until user close form
    Do While IsUserFormLoaded("UserForm1")
        DoEvents
    Loop
    ' Output returned value
    MsgBox oData("")

End Sub

Function IsUserFormLoaded(UserFormName As String) As Boolean

    Dim oUF As Object

    For Each oUF In UserForms
        If LCase(oUF.Name) = LCase(UserFormName) Then
            IsUserFormLoaded = True
            Exit Function
        End If
    Next

End Function

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

userform

И поместите нижекод в модуль пользовательской формы:

Private opData

Public Sub ShowForm(oData)

    Set opData = oData
    Me.TextBox1.Value = opData("")
    Me.Show

End Sub

Private Sub UserForm_Initialize()

    If TypeName(opData) <> "Dictionary" Then Set opData = CreateObject("Scripting.Dictionary")

End Sub

Private Sub CommandButton1_Click()

    Unload Me

End Sub

Private Sub CommandButton2_Click()

    opData("") = Me.TextBox1.Value
    Unload Me

End Sub
...