从组合框(表单控件)excel VBA中检索所选选项

时间:2014-07-01 08:53:10

标签: excel vba excel-vba combobox

嘿,我似乎不明白为什么我的代码没有工作,因为我认为这是对SO中另一个问题的回答。我想从组合框中检索所选项目,因为我随后必须在匹配索引函数中使用它。这是我的代码

Option Explicit
Dim ws As Sheets

Sub test2()
Set ws = Sheets(Array("Sheet1", "Sheet2"))
 With ws(1).Shapes("Drop Down 2").ControlFormat

  .List(.ControlFormat.ListIndex) = ws(1).Range("I8").Value

 End With
End Sub

另外,我想了解一般如何参考下拉菜单?因为我有10个这样的组合框(下拉列表),每个组合框在数字基础上有不同的名称。因此,而不是像#34; Drop Down 2"或者通过使用循环说("下拉"& i),是否有一种通用的方式来引用特定工作表上的下拉菜单?我真的需要帮助......

1 个答案:

答案 0 :(得分:2)

这是检索所选项目值的方法:

Dim myindex As Long, myitem As String
Dim ws As Worksheet 

Set ws = Sheets("Sheet1")
'~~> Currently selected item index at runtime
myindex = ws.Shapes("Drop Down 1").ControlFormat.Value
'~~> Currently selected item value at runtime
myitem = ws.Shapes("Drop Down 1").ControlFormat.List(myindex)

对于第二个问题,您可以使用形状集合对象 然后使用 For Each 循环结构。

Dim shp As Shape, ws As Worksheet: Set ws = Sheets("Sheet1")
Dim myindex As Long, myitem As String

'~~> Iterate the shapes collection object
For Each shp In ws.Shapes
    '~~> Check the type
    If shp.Type = msoFormControl Then
        myindex = shp.ControlFormat.Value
        myitem = shp.ControlFormat.List(myindex)
        '~~> additional codes here
    End If
Next

但是如果你需要在特定的 ComboBoxes 中做特定的事情,请使用你在问题中描述的内容。 HTH

<强> EDIT1:

For Each shp In ws.Shapes
    '~~> Check the type
    If shp.Type = msoFormControl Then
        With shp.ControlFormat
            myvalue = .List(.ListIndex)
        End With
    End If
Next

以上作品以及您的评论 至于为什么它仅在 With Clause 下工作,因为这基本上就是你使用 With 的原因。 以某种方式缩短代码。如果您想在没有 With 的情况下进行此操作,请使用以下内容:

myvalue = shp.ControlFormat.List(shp.ControlFormat.ListIndex)