在用户表单上从组合框获取值的最佳实践是什么?

时间:2015-08-11 18:57:39

标签: vba

您可以使用userforms执行大量信息和许多信息,但我无法找到使用它们的标准方法。假设我有一个带有标准下拉列表的用户表单,要求某人选择一个水果。在userform代码中,我将在添加名为fruitcombo

的组合框后添加以下代码
Private Sub UserForm_Initialize()
    userform1.fruitcombo.AddItem "Peach"
    userform1.fruitcombo.AddItem "Pear"
    userform1.fruitcombo.AddItem "Grape"
End Sub

我还将添加一个命令按钮,该按钮将被标记为"Submit"并且在那个事件中:

Private Sub Submit_Click()
    Me.Hide
End Sub

这就是它开始变得朦胧的地方。捕获所选答案的最佳方法是什么?我可以想到的一种方法是创建一个名为fruitanswer的全局变量,然后我们可以直接跳到Me.Hide而不是Unload Me

例如:

Private Sub Submit_Click()
    fruitanswer = fruitcombo.value
    Unload Me
End Sub

或者我们可以在调用userform的模块中将fruitanswer作为私有变量,然后在那里卸载它。还有多种方法可以初始化用户表单。我也想知道初始化它的最佳方法。 Show方法会自动初始化它,但Hide方法不会自动取消初始化它。为此,Unload声明是必要的。那么在使用Show语句调用Load方法之前,是否有人初始化它?

例如:

Load userform1 'Any point to including this?
userform1.show
'user chooses a fruit and clicks submit button
'userform is hidden by commandbutton but not unloaded yet
fruitanswer = fruitcombo.value
Unload userform1

在这些选项中,哪种方法最好?还有什么可以让它更有效率吗?

1 个答案:

答案 0 :(得分:1)

您可以将整个事物包装在一个函数调用中:

strFruit = UserForm1.GetFruit()

然后,在你的UserForm中,让它自己完成显示和卸载的工作:

Private bOK As Boolean

Public Function GetFruit() As String
    bOK = False
    Me.Show vbModal
    If bOK Then GetFruit = ComboBox1.Text
    Unload Me
End Function

Private Sub cmdOK_Click()
    bOK = True
    Me.Hide
End Sub

Private Sub cmdCancel_Click()
    Me.Hide
End Sub

这假设您有名为cmdOKcmdCancel的按钮以及名为ComboBox1的组合框。

由于Show()是以模态方式调用的,因此在它关闭或隐藏表单之前,代码将不会执行。当单击任一按钮(或通过其他方式关闭表单)时,代码将继续,将返回所选文本(如果单击OK),并且表单将自行卸载。

这样做的好处在于,你的调用代码并不需要担心每次调用时都会实例化并破坏表单。它只是一个加载表单并获得返回值的语句。

当然,您需要添加代码以使用您希望显示的任何项目填充组合框。