VBA Excel - 从函数返回ListBoxes数组

时间:2014-04-07 22:51:00

标签: arrays excel vba excel-vba listbox

我目前正在开发一个用于填充三个ActiveX ListBox的模块。每个都将填充相同的值:图表上轴标题的选择(X轴,主Y轴和辅助Y轴)。我有一个名为" FillBox"将ListBox作为参数并填充它。

最初我使用以下内容来完成此任务:

Sub FillAllBoxes()
    FillBox X_BOX
    FillBox Y1_BOX
    FillBox Y2_BOX
End Sub

我被告知由于MSForms.ListBox对象类型,我无法使用Union来压缩此代码。还有许多其他子对每个盒子执行重复操作,所以看起来某种阵列最好用。

到目前为止,我发现定义ListBoxes数组的唯一方法是以下,但我不满意返回值是Variant的事实,但我似乎无法使其工作,如果我将其定义为Function BOX_ARRAY()As MSForms.ListBox:

Function BOX_ARRAY() As Variant
    Dim Temp(1 To 3) As MSForms.ListBox
    Set Temp(1) = X_BOX
    Set Temp(2) = Y1_BOX
    Set Temp(3) = Y2_BOX
    BOX_ARRAY = THIS_ARRAY
End Function

然后我可以使用这个子,虽然我需要将FillBox的参数显式定义为ByVal,因为BOX_ARRAY是一个变体。

Sub FillAllBoxes()
    For j = LBound(BOX_ARRAY) To UBound(BOX_ARRAY)
        FillBox BOX_ARRAY(j)
    Next j
End Sub

A)有没有办法让函数返回一个不是Variant的数组?

B)坚持使用我为原始方法明确地为每个列表框重复该函数或者是否值得使用数组进行此类操作是明智的吗?

C)在函数BOX_ARRAY中有一种方法可以定义一个Temp数组,只是直接填充返回的数组吗?

1 个答案:

答案 0 :(得分:0)

这里是:

  

还有许多其他潜艇在每个箱子上执行重复操作

只需将ListBox传递给在列表框上运行的函数,例如:

Sub MyExample()

EnableListBoxes Array(Me.ListBox1, Me.ListBox2, Me.ListBox3)

End Sub

Sub EnableListBoxes(boxes as Variant)
Dim lbox as variant

For each lbox in boxes
    lbox.Enabled = True
Next

End Sub

或者你可以传递整个表单/工作表/包含列表框的任何内容,并迭代包含它们的集合(例如,UserForm.Controls等)。你需要做一些额外的逻辑来确保你“使用正确类型的表单控件进行操作,但这样做相对容易。

  

如果我把它定义为Function BOX_ARRAY()As MSForms.ListBox

,我似乎无法工作

当然不是,因为MSForms.ListBox是单个对象。您不能期望将任何内容的数组返回到旨在返回对象的函数中。

  

有没有办法让函数返回一个不是Variant的数组?

也许使用子程序并传递参数ByRef。如果直接操作引用而不是本地副本,则无需返回值。有关详细解释/示例,请参见Chip Pearson:

http://www.cpearson.com/excel/passingandreturningarrays.htm

Sub TestByRef()
Dim i as Integer
    i = 1
    ChangeValue i

    Debug.Print i

End Sub

Sub ChangeValue(ByRef x as Integer)

    x = 3

End Sub
  

在函数BOX_ARRAY中有一种方法可以定义一个Temp数组,只是直接填充返回的数组吗?

不是我能想到的。也许使用类模块和类_Initialize方法,您可以自动分配一个类properties。但我认为最终是相同的方法:创建一个定义返回值的临时数组。很难确定,因为你没有提供足够的代码(例如,变量在哪里?它们甚至被宣布了吗?