如何在VBA中获取当前列表框的名称?

时间:2019-07-10 10:32:44

标签: excel vba listbox

根据How to address generated ListBoxes and add Items dynamically in VBA?,我动态生成了几个ListBox,并为其分配了一个OnAction Sub。 OnAction事件将向我显示 current 列表框中选定项目的数量。

为了更好地理解:

例如我在工作表“ FS”上生成了5个列表框(ListBox1,ListBox2等)。

当我单击ListBox1上的1个项目时,MsgBox会显示为“ 1”。

如果我单击ListBox1上的其他项,则MsgBox将显示“ 2”。

但是,如果我单击ListBox3的另一个项,则MsgBox将显示为“ 1”。

    'ListBoxName as a variable for current ListBox and probably the most problematic line
    ListBoxName = ActiveControl.Name

    selectedItems = 0

    Set lb = FS.ListBoxes(ListBoxName)

    'The following counts the selected items in target ListBox
    For i = 1 To lb.ListCount Step 1
        If lb.Selected(i) Then
            selectedItems = selectedItems + 1
        End If
    Next i

    'This part puts up the Message Box with the number of selected items in target ListBox
    If selectedItems > 0 Then
        MsgBox selectedItems
    End If

其他信息:为了更好地了解,我省略了变量的声明。我不是不是使用ActiveX,而我是不是使用UserForm。获取列表框的当前名称将有助于我进行进一步的编程和想要执行的任务。在我看来,找到我最近一次单击的ListBox的名称看起来很容易。

提前谢谢!

编辑: 该代码位于子模块1的模块“模块1”中。在另一个模块“世代”(我在其中生成列表框)中,Module1从lb.OnAction = "Module1.Module1"开始。

EDIT2 将“ OnClick”更改为“ OnAction”

1 个答案:

答案 0 :(得分:2)

您不能将ActiveControl用于“表单”列表框。要获取称为ONCLICK事件的“表单”列表框的名称,请使用Application.Caller property (Excel)

在表单列表框的ONCLICK事件中,放置它。

Sub ONCLICK()
    Dim shp As Shape
    Set shp = Shapes(Application.Caller)

    '~~> This will give you the value of what is selected in that listbox
    MsgBox shp.ControlFormat.List(shp.ControlFormat.Value)
End Sub

注意:如果以上代码不在相应的工作表代码区域中,则您将必须按照以下所述的Yasser将Shapes(Application.Caller)更改为Activesheet.Shapes(Application.Caller)