【问题标题】:Userform combobox list items + save userform values as variants in VBA Excel用户表单组合框列表项 + 将用户表单值保存为 VBA Excel 中的变体
【发布时间】:2017-12-12 05:19:47
【问题描述】:

我是第一次使用 Excel 用户表单,但遇到了一些麻烦。本质上,我想向我的用户询问三个值,然后将这些值作为变体保存在我的 vba 代码中以供以后使用。我最初设置我的 VBA 代码以使用三个单独的输入框来获取这三个值,但我发现这种拼写错误经常发生。相反,我希望用户只从值列表中进行选择。

这是盒子的样子:

我只希望那里的两个组合框每个都有两个选项,并且它们将始终是相同的选项,所以我不想将它们放在工作表上的列表中,我希望它成为VBA 代码。我的用户窗体名为 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 将组合框值保存为我的变体并关闭用户窗体。我要使用这些值的宏如下所示:

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

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

【问题讨论】:

  • 你能澄清一下实际问题是什么吗?还有你说的保存是什么意思?您是使用这些值然后丢弃,还是尝试永久保存?
  • @jcarroll 我想有两个广泛的问题。如何列出组合框的选项,因为我使用的代码实际上并没有工作(当我打开用户窗体时,组合框是空白的并且不显示我的两个选项),以及如何设置组合框的值等于我的变体(这也不起作用)。我将来会重用用户表单,那时我想从用户那里获取新值以“保存”或将我的变体设置为。
  • 尝试将UserFormPYBTMT_Initialize() 更改为UserForm_Initialize(),我认为您的代码甚至没有被调用。至于保存值,一旦关闭 Excel,就无法将值存储在变量中。您需要将它们保存到数据库或工作表中。
  • 谢谢,我会试试的。我不想将它们长时间存储为变量,只想在我的其他宏中使用它们。我只想暂时将我的变体设置为等于组合框的值。
  • @jcarroll 好的,UserForm_Initialize() 工作了,太棒了!但我不明白为什么。如果我有多个用户表单,所有这些都以 Sub UserForm_Initialize() 开头吗?我以不同的方式命名用户表单并不重要?

标签: vba excel combobox userform


【解决方案1】:

您应该将您的变量声明为公共变量,并且您应该hide 用户表单而不是关闭它。见下例:

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

【讨论】:

  • 如果变量是公开的,最好卸载表单。我经历过隐藏很糟糕。您最终会得到相同表单的多个实例
  • @Patrick Lepelletier 完成变量后,用户窗体已经关闭。在您的情况下,OP 必须声明公共变量并在模块中创建 MyMacroAfterClosingUserform sub,否则当用户窗体关闭时变量将不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2021-11-20
  • 2014-03-29
  • 1970-01-01
  • 2021-05-15
  • 2018-03-21
  • 1970-01-01
相关资源
最近更新 更多