Excel 用于多个表单控件的单个回调宏(特定于列表框)

Excel 用于多个表单控件的单个回调宏(特定于列表框),excel,excel-2010,vba,Excel,Excel 2010,Vba,我正在尝试存储列表框(Excel 2010)中启用多选的选定值。通过迭代列表中的项目以查看它们是否被选中,可以轻松完成此操作。但是,在添加多个列表框后,我必须为每个列表框创建一个回调: Sub ListBox1_Changed() Call DoStuff(Worksheets("Sheet1").ListBoxes(1)) End Sub Sub ListBox2_Changed() Call DoStuff(Worksheets("Sheet1").ListBoxes(2)) End Su

我正在尝试存储列表框(Excel 2010)中启用多选的选定值。通过迭代列表中的项目以查看它们是否被选中,可以轻松完成此操作。但是,在添加多个列表框后,我必须为每个列表框创建一个回调:

Sub ListBox1_Changed()
Call DoStuff(Worksheets("Sheet1").ListBoxes(1))
End Sub

Sub ListBox2_Changed()
Call DoStuff(Worksheets("Sheet1").ListBoxes(2))
End Sub

Sub DoStuff(L as ListBox)
'Do stuff here
Sub
最终,我将在多个工作表中创建大量这样的列表框

现在我的问题是:是否可以引用调用宏的特定框,并为我的所有列表框分配此单一函数?我猜是这样的:

Sub ListBox_Changed(ByVal L as Object)
' This will not work btw ^^^^^^^^

' Magic code goes here.
Call DoStuff(L_converted_to_ListBox_Format)
End Sub
请注意,我没有使用userforms,只是将列表框直接放在工作表中


谢谢

您可以使用
应用程序.Caller
来确定哪个
列表框
调用了
,如下所示

Sub ListBox_Changed()
    Dim v As Variant
    Dim lb As ListBox
    v = Application.Caller
    On Error Resume Next
    Set lb = Me.ListBoxes(v)
    If Err.Number <> 0 Then Exit Sub
    On Error GoTo 0
    DoStuff lb
End Sub

Sub DoStuff(lb As ListBox)
    Debug.Print lb.List(lb.Value)
End Sub
子列表框\u已更改()
Dim v作为变体
将lb设置为列表框
v=应用程序调用方
出错时继续下一步
Set lb=Me.listboxs(v)
如果错误号为0,则退出子系统
错误转到0
多斯塔夫磅
端接头
子DoStuff(lb作为列表框)
调试.打印磅值列表(磅值)
端接头

Siddharth对这个此处更新的链接有一个很好的描述:我在使用“Me”关键字时出错,但是使用ActiveSheet却可以很好地工作,即
Set lb=ActiveSheet.listboxs(v)
Me
如果代码放在
工作表
模块中,则适用。如果它被放置在一个标准模块中,那么
ActiveSheet
将起作用,前提是列表框所在的工作表实际上是活动的。我认为,当用户在工作表中更改列表框时,可以公平地假设该工作表是活动的(正如我提到的,列表框在工作表中,而不是在用户表单中)。再一次,谢谢!是的,如果是用户更改了列表。如果代码改变了怎么办?我想这只会留下一个不必要的洞。