【发布时间】: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 个,那就另当别论了。
-
你是对的,这并不是那么糟糕。只是寻找一些方法来增强代码。我可能会坚持使用当前的方法,尽管其他答案对未来的问题会有好处。