根据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”
答案 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)
。