如何从宏运行用户窗体?

时间:2019-01-29 21:55:52

标签: excel vba userform

我在VBA中为Excel 2016开发了许多UDF和宏。我的一个宏使用Inputbox来获取宏随后使用的数据。我想用用户表单替换Inputbox。我创建了带有一个文本框的用户表单。我想激活用户窗体,使用默认数据填充文本框,并在选择“确定”时将文本框数据返回到宏。我已经在一个端到端的示例中进行了广泛的搜索,以查找完成此操作所需的所有代码,但是没有运气。是否存在解决此简单问题的示例?

2 个答案:

答案 0 :(得分:0)

有一个示例,说明了如何将值传递给表单并将结果返回。该方法使用在标准模块范围内创建的Scripting.Dictionary对象,并将其传递给用户窗体以允许更改值。因此,可以将默认值发送到用户窗体,并且即使在关闭和卸载用户窗体后也可以将结果值保留在字典中。您可能有多个值,只需将必要数量的键添加到字典中,例如。 G。 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

并将以下代码放入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

答案 1 :(得分:0)

向您的用户表单添加属性。对于这个答案,让我们在用户表单中使用以下代码。

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.