【问题标题】:VBA Excel - Returning an array of ListBoxes from a functionVBA Excel - 从函数返回列表框数组
【发布时间】:2014-04-07 22:51:00
【问题描述】:

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

最初我使用以下方法来完成此操作:

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

我被告知由于 MSForms.ListBox 对象类型,我不能使用联合来压缩此代码。还有很多其他的 subs 对每个盒子执行重复的操作,所以看起来最好使用某种数组。

到目前为止,我发现定义这个 ListBoxes 数组的唯一方法如下,虽然我对返回值是 Variant 的事实不满意,但如果我定义,我似乎无法让它工作它作为 Function BOX_ARRAY() 作为 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

然后我可以使用这个 sub,尽管我需要将 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 中,有没有办法定义一个临时数组并立即填充返回的数组?

【问题讨论】:

  • 如果您不喜欢Variant,您可以将其设为Collection。但是,您永远不会在 VBA 中获得强类型数组/集合。我个人喜欢你的第一个解决方案。它是最少的代码和工作量,对吧?
  • 它确实有效,但我讨厌在代码中看到任何多余的东西,所以我想我会扩展到其他领域,希望有一个更优雅的解决方案。感谢您的提示。
  • 这几乎是多余的。他们绕过这种“冗余”的方式是编写更多代码,这不应该是目标。它本来就清晰易读,传递数组会使事情复杂化。你只有 3 个列表框。如果你有 50 个,那就另当别论了。
  • 你是对的,这并不是那么糟糕。只是寻找一些方法来增强代码。我可能会坚持使用当前的方法,尽管其他答案对未来的问题会有好处。

标签: arrays vba excel listbox


【解决方案1】:

这里是:

还有很多其他的 subs 对每个盒子执行重复的操作

只需将 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。如果您直接在 reference 上操作,而不是它的本地副本,则不需要返回值。有关详细说明/示例,请参阅 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 中,有没有一种方法可以定义一个临时数组并立即填充返回的数组?

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

【讨论】:

    猜你喜欢
    • 2022-06-20
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多