将Userform视为函数

时间:2017-07-04 10:14:33

标签: vba excel-vba userform excel

我创建了一个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

3 个答案:

答案 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")

你会得到这个:

enter image description here

这就是你需要的。 :)

答案 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属性可以在表单中包含更多代码。