我创建了一个VBA UserForm,它本质上是一个美化的输入框
就像输入框可以像这样使用
Dim returnVal As String
returnVal = InputBox("Write some string")
我希望我的userform像这样运行
Dim returnVal As customClass
Set returnVal = MyUserForm([some arguments])
即。 MyUserForm()
代码将一些参数传递给userform,当userform关闭时,它会返回一些参数(以自定义类而不是普通字符串的形式)
构建我的用户表单以实现此功能的最佳方法是什么?
目前,我只是公开声明一些变量和自定义类。我抓住命令按钮单击和Query_close()
事件来隐藏表单,然后我读取outputVal并完全关闭表单。我不喜欢这样,因为我希望我的形式完全自我控制,我认为事件的捕获是混乱的。
在简化代码中(读取/返回字符串):
Function myUf(inVal As String) As String
Dim frm As New frmTest
frm.inputval = inVal
frm.Init 'sets caption. We cannot rely on userform initialize as this runs before inputval is set
'We could pass a variable here to save writing to the public variable
frm.Show
myUf = frm.outputVal
Set frm = Nothing
End Function
在名为frmTest
的Userform中,文本框名为tb1
Public inputval As String
Public outputVal As String
Public Sub Init()
Me.Caption = inputval 'setting caption, but could pass this anywhere
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode <> 1 Then Cancel = 1
outputVal = tb1 'reading value from textbox, but could return anything here
Me.Hide
End Sub
答案 0 :(得分:2)
您需要找到一种从ClassObject启动UserForm的方法。然后,您可以使用simple factory pattern完全按照自己的方式创建UserForm。
一般情况下,我在StackOverflow中的某处复制了一些Mat's Mug的代码,我写了一篇关于用户表单的文章。如果您查看此处(http://www.vitoshacademy.com/vba-the-perfect-userform-in-vba/),您将找到一种使用Public Sub ShowMainForm()
初始化表单的方法。可以向ShowMainForm添加一个参数,然后将其传递给该类的初始值设定项。
通常,请参考文章中的代码,确保其有效,并将ShowMainForm
初始化程序更改为以下内容:
Public Sub ShowMainForm(strText As String, strText2 As String)
If (objPresenter Is Nothing) Then
Set objPresenter = New clsSummaryPresenter
End If
objPresenter.Show
Call objPresenter.ChangeLabelAndCaption(strText, strText2)
End Sub
然后,如果您在即时窗口中这样调用:
call ShowMainForm("Just","testing")
你会得到这个:
这就是你需要的。 :)
答案 1 :(得分:0)
基本理念是:
创建一个函数,你将你的参数组合成一个字符串,如:
strOpenArg = "param1:=value1;param2:=value2;"
而不是使用OpenArgs打开表单
DoCmd.OpenForm "UserForm", acNormal, , , , acDialog, strOpenArgs
获取您的价值并关闭表格
Value= Form_UserForm.Value
DoCmd.Close acForm, "UserForm", acSaveNo
用户窗体中的设置Form_open。在这里你可以得到你的参数。你可以通过字符串拆分来解决这个问题。 设置一个OK按钮,您可以在其中使表单不可见并设置返回值
Private Sub Form_Open(Cancel As Integer)
Dim strParameter as String
strParameter = Me.OpenArgs 'Here are your parmeters
End Sub
Private Sub ok_Click()
m_Value = "Your ReturnValue"
Me.Visible = False
End Sub
Private m_Value As String
Public Property Get Value() As String
Value = m_msgBoxResult
End Property
答案 2 :(得分:0)
不幸的是,没有办法像你想的那样单行代码。如果您的所有userform代码都是自包含的,那么它传递值的唯一方法是更改公共变量的值。 Mat's Mug's answer here是我在尝试模拟&#39; InputBox&#39;等功能时经常使用的布局。但是如果不编写单独的函数,你仍然无法在一行中获得它。使用userform属性可以在表单中包含更多代码。