2

我发现了如何创建一个数组,但我不能轻易推送项目。我必须保持索引到下一个位置,并且每次推送一个项目时递增;

我还发现该集合具有很好的 .Add 方法,其行为与推送方法完全相同。但我如何加入他们?全局 Join 方法不适用于 Collections。

我在这里缺少什么?任何人都可以帮助我定义一个数组,在没有索引的情况下轻松推送项目,然后将它们输出到以“,”分隔的字符串?

谢谢

4

2 回答 2

10

你不能直接这样做。VBA 中的数组通常需要在使用前进行索引和标注。

您可以在分配变量之前使用动态数组并调整大小:

Dim arr() As String
ReDim arr(0)

arr(UBound(arr)) = "Some String"
ReDim Preserve arr(UBound(arr) + 1)
arr(UBound(arr)) = "Some Other String"
ReDim Preserve arr(UBound(arr) + 1)
arr(UBound(arr)) = "Some 3rd String"

MsgBox Join(arr, ",")

保留关键字维护数组中的值,而不是覆盖它们。但是,通常不建议使用上述方法,因为 Preserve 成本高,并且只允许您调整数组的最后一个维度的大小。

集合是不同的,在 VBA 环境中速度较慢且通常不太灵活(您没有说哪个环境,但我假设 Excel)

Dim coll As Collection
Dim itm As Variant
Dim tempS As String


Set coll = New Collection
coll.Add "Some String"
coll.Add "Some Other String"
coll.Add "Some 3rd String"

For Each itm In coll
    tempS = tempS & itm & ","
Next itm

MsgBox Left(tempS, Len(tempS) - 1)

您需要遍历它们来构建一个数组。

根据您的需要,还有许多其他选择

内置方法

对于字符串,请查看拆分:

Const stri As String = "Some String, Some Other String, Some 3rd String"
Dim arr() As String

arr = Split(stri, ",")

MsgBox Join(arr, ",")

使用外部对象

脚本字典

Dim dic As Object

Set dic = CreateObject("scripting.Dictionary")
dic.Add "1", "Some String"
dic.Add "2", "Some Other String"
dic.Add "3", "Some 3rd String"

Debug.Print Join(dic.items, ",")

.Net 数组列表

Dim al As Object

Set al = CreateObject("System.Collections.Arraylist")
al.Add "Some String"
al.Add "Some Other String"
al.Add "Some 3rd String"

MsgBox Join(al.ToArray(), ",")
于 2012-10-22T14:32:31.237 回答
1

您可以使用 Collection 对象,然后使用 For...Each 语句循环遍历它:

Dim colItems As New Collection
Dim strOutput As String

'Add Items to Collection
colItems.Add "Item 1"
colItems.Add "Item 2"
colItems.Add "Item 3"

'Loop through the collection and place items in strOutput
For Each Item in colItems
    If strOutput <> "" Then strOutput = strOutput & ","
    strOutput = strOutput & Item
Next

Msgbox strOutput

消息框将读取Item 1,Item 2,Item3

这行代码:

If strOutput <> "" Then strOutput = strOutput & ","

是在每个项目之后添加一个逗号,除了第一次通过循环(在添加任何项目之前)。

于 2012-10-22T14:16:13.937 回答