如何加载组合框,然后如何在vba中使用其中的选定值?

时间:2013-11-25 05:03:53

标签: excel-vba combobox vba excel

一个问题是:如何为组合框列表加载或赋值,然后在我的工作表中调用它并从中获取所选值?我有一个模块,我想调用我的userform1,其中包含组合框它。但是当我调试程序时,它只是一个组合框的显示。我认为它没有做任何事情...感谢您的时间..这是用户表单的代码:

Private Sub UserForm_Initialize()

With ComboBox1

    .AddItem "weibull"
    .AddItem "log-normal"
    .AddItem "gambel"
    .Style = fmStyleDropDownList

End With
End Sub

这就是我在sub中要求显示组合框的方法:

UserForm1.Show
If ComboBox1.ListIndex = -1 Then
MsgBox "There is no item currently selected.", _
vbInformation, _
"Combo Box Demo"
Exit Sub
End If
 MsgBox "You have selected " & ComboBox1.List(ComboBox1.ListIndex) & "." & vbNewLine _
& "It has " & ComboBox1.ItemData(ComboBox1.ListIndex) ", _
vbInformation, _
"Combo Box Demo"

第二部分是我在网上找到的,但它使程序至少显示组合框!

2 个答案:

答案 0 :(得分:1)

我认为Siddharth的回答非常清楚,特别是因为它是从手机发布的!但是,我收到了OP的电子邮件,说他不明白答案。我提供了以下背景,这显然足以让他了解Siddharth的答案并解决他的问题。我在这里张贴它是为了任何其他需要更多表格背景的访客,而不是Siddharth提供的。

如果您选择VBA帮助并输入“userform show”,您将获得Show命令的说明。

如果您的用户表单名为“UserForm1”,则可以使用语句:

  1. UserForm1.Show
  2. UserForm1.Show vbModal
  3. UserForm1.Show vbModeless
  4. 陈述1和2是等同的。

    选择VbModal或vbModeless会完全改变用户表单的控制方式。

    如果表单显示为无模式,则用户可以看到它但无法访问它。如果我有一个需要很长时间的宏,我将使用无模式表单来显示进度。如果我正在处理大型工作表的行,我可能会有一个包含以下内容的表单:

    我正在研究行 nnnn mmmm

    每个都是一个标签。我将包含“mmmm”的标签的值设置为启动宏时的行数。我将包含“nnnn”的标签的值设置为循环每次重复开始时的行号。用户看到:

         I am working on row    1 of 5123
    then I am working on row    2 of 5123
    then I am working on row    3 of 5123
    and so on.
    

    如果宏需要五分钟来处理每一行,这会告诉用户发生了一些事情。如果没有表单,用户可能会认为宏已失败。使用表格,用户知道宏很忙,他们有时间喝一杯新鲜咖啡。

    另一方面,如果表单显示为模态,则宏会停止,直到用户执行关闭或卸载表单的操作,其语句如下:

    Unload Me
    

    此声明的定位取决于您的表单。我通常有一个提交按钮,在结束此声明之前保存信息。

    执行Unload Me语句后,宏将在Show语句后的语句处重新启动。当宏重新启动时,表单已经消失。这就是表单必须在全局变量中保存宏需要的原因。

答案 1 :(得分:0)

您正在尝试在用户窗体已关闭时访问控件。我说是关闭的,因为你没有使用vbmodeless来显示表格。因此,之后下一行可以运行的唯一方法是关闭表单。这是我的建议。

在模块中声明公共变量,该模块将在useform关闭时保存相关值,然后再使用它。例如

将此代码粘贴到用户表单

Option Explicit

Private Sub UserForm_Initialize()
    With ComboBox1
        .AddItem "weibull"
        .AddItem "log-normal"
        .AddItem "gambel"
        .Style = fmStyleDropDownList
    End With
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If ComboBox1.ListIndex <> -1 Then
        SelectItem = ComboBox1.List(ComboBox1.ListIndex)
        pos = ComboBox1.ListIndex + 1
    End If
End Sub

将其粘贴到模块中

Option Explicit

Public SelectItem As String, pos As Long

Sub Sample()
    '
    '~~> Rest of your code
    '

    SelectItem = "": pos = 0
    UserForm1.Show

    If pos = 0 Then
        MsgBox "There is no item currently selected.", _
        vbInformation, "Combo Box Demo"
        Exit Sub
    End If

    MsgBox "You have selected " & SelectItem & "." & vbNewLine & _
    "It is at position " & pos, vbInformation, "Combo Box Demo"

    '
    '~~> Rest of your code
    '
End Sub

另外

Combobox没有.Itemdata属性。它在VB6中可用,但在VBA中不可用。使用Combobox的.Itemdata属性,我想你想要获得这个位置?