Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用户表单组合框列表项+;在VBA Excel中将用户表单值另存为变量_Vba_Excel_Combobox_Userform - Fatal编程技术网

用户表单组合框列表项+;在VBA Excel中将用户表单值另存为变量

用户表单组合框列表项+;在VBA Excel中将用户表单值另存为变量,vba,excel,combobox,userform,Vba,Excel,Combobox,Userform,我第一次使用Excel用户表单,遇到了一些问题。本质上,我想让用户输入三个值,然后将这些值保存为vba代码中的变量以供以后使用。最初,我将VBA代码设置为使用三个单独的输入框获取这三个值,但我发现这样拼写错误的情况太多了。相反,我希望用户只是从值列表中选择 下面是盒子的外观: 我只希望那里的两个组合框各有两个选项,它们将始终是相同的选项,因此我不希望将它们放在工作表的列表中,我希望这是VBA代码的一部分。我的userform名为UserFormPYBTMT,组合框名为cboxlBT和cboxl

我第一次使用Excel用户表单,遇到了一些问题。本质上,我想让用户输入三个值,然后将这些值保存为vba代码中的变量以供以后使用。最初,我将VBA代码设置为使用三个单独的输入框获取这三个值,但我发现这样拼写错误的情况太多了。相反,我希望用户只是从值列表中选择

下面是盒子的外观:

我只希望那里的两个组合框各有两个选项,它们将始终是相同的选项,因此我不希望将它们放在工作表的列表中,我希望这是VBA代码的一部分。我的userform名为UserFormPYBTMT,组合框名为cboxlBT和cboxlMT,文本框名为tbxxlPY。 这就是我尝试过的:

Public Sub UserFormPYBTMT_Initialize()

'fill combobox for BT
    userformPYBTMT.cboxlBT.AddItem ("BTChoice1")
    userformPYBTMT.cboxlBT.AddItem ("BTChoice2")

'fill combobox for MT
    userformPYBTMT.cboxlMT.AddItem ("MTChoice1")
    userformPYBTMT.cboxlMT.AddItem ("MTChoice2")

End Sub

---------------------

Public Sub btnxlOK_Click()

End Sub
显然,我还有OK按钮(我还没有为其编写任何代码),此时我希望VBA将组合框值保存为我的变量并关闭userform。我要在其中使用这些值的宏如下所示:

Sub SATV5()

Dim IBPYSAT As Variant
Dim IBMTSAT As Variant
Dim IBBTSAT As Variant

'Show the user form where we get the inputs for PY, MT, BT
userformPYBTMT.Show    

IBPYSAT = userformPYBTMT.tbxxlPY.Value
IBMTSAT = userformPYBTMT.cboxlMT.Value
IBBTSAT = userformPYBTMT.cboxlBT.Value

如果对用户表单和组合框有一定了解的人能给我一些建议,我将非常感激。谢谢。

您应该将变量声明为公共变量,并且应该
隐藏用户表单,而不是关闭它。请参见以下示例:

Public IBPYSAT As String, IBMTSAT As String, IBBTSAT As String

Private Sub btnxlOK_Click()

'Show the user form where we get the inputs for PY, MT, BT

IBPYSAT = userformPYBTMT.tbxxlPY.Value
IBMTSAT = userformPYBTMT.cboxlMT.Value
IBBTSAT = userformPYBTMT.cboxlBT.Value

userformPYBTMT.Hide

Call MyMacroAfterClosingUserform

End Sub

Sub MyMacroAfterClosingUserform()
    MsgBox IBPYSAT & " is my Textbox value and " & IBMTSAT & " and " & IBBTSAT & " are my combobox values!"
    Unload userformPYBTMT 'now you can close userform after you are done with the variables!
End Sub

你能澄清一下实际问题是什么吗?你所说的节约是什么意思?您是使用这些值然后放弃,还是尝试永久保存?@jcarroll我想有两个大问题。我如何列出组合框的选项,因为我使用的代码实际上不起作用(当我打开userform时,组合框为空,不显示我的两个选项),以及如何将组合框的值设置为与我的变量相等(这也不起作用)。我将在将来重用userform,那时我想从用户那里获取新值以“保存”或将我的变量设置为。尝试将
UserFormPYBTMT\u Initialize()
更改为
userform\u Initialize()
,我认为您的代码甚至没有被调用。至于保存值,一旦关闭Excel,就无法在变量中存储值。您需要将它们保存到数据库或工作表中。谢谢,我会尝试的。我不想将它们作为变量长期存储,只想在我的另一个宏中使用它们。我只是想暂时将我的变量设置为组合框的值。@jcarroll好的,UserForm_Initialize()起作用了,太棒了!但我不明白为什么。如果我有多个用户表单,所有这些表单是否都以Sub-UserForm_Initialize()开头?如果变量是公共的,最好卸载表单。我觉得隐藏是不好的。您最终会得到多个相同的实例form@PatrickLepelletier用户表单在完成变量后已关闭。在您的情况下,OP必须声明公共变量并在模块中创建
MyMacroAfterClosingUserform
sub,否则当userform关闭时变量将不起作用。