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