2013-02-06 24 views
0

我试图从启用多选的列表框(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,但只是直接放在工作表中的列表框。

谢谢!

+1

亚洲时报Siddharth对这个有好的写了http://siddharthrout.wordpress.com/2011/08/05/vba-control-arrays/ –

回答

1

可以使用Application.Caller,以确定哪些ListBox称为Sub,这样

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 
+0

使用“我”关键字时出现错误,但使用ActiveSheet代替原来的效果,即 'Set lb = ActiveSheet.ListBoxes(v)' – user1898148

+0

如果代码是放置在“工作表”模块中。如果它被放置在一个标准Moldule中,那么'ActiveSheet'将会工作_Provided_ ListBox所在的工作表实际上是活动的 –

+0

我想这是一个公平的假设,用户在工作表中改变列表框时工作表是活动的(正如我提到的listbox在工作表内而不是在用户表单中)。再一次,谢谢! – user1898148