集合不会存储字符串

时间:2012-02-08 13:20:17

标签: excel vba

从今天早上开始,我在VBA中遇到了一种奇怪的行为(Excel 2003)。

以下是代码:

Sub TestCollection()

Dim i As Single, col As New Collection
Dim vArr(1 To 3) As String

'For i = LBound(vArr) To UBound(vArr)
'    vArr(i) = Sheets("Sheet2").Cells(1, i)
'Next i

vArr(1) = "String 1"
vArr(2) = "String 2"
vArr(3) = "String 3"

For i = LBound(vArr) To UBound(vArr)
    Debug.Print vArr(i)
    col.Add i, vArr(i)
    Debug.Print col(i)
Next i

End Sub

现在,我希望我的收藏品可以填充项目/密钥对(例如在“本地”窗口中):

Item 1 -> "String 1"
Item 2 -> "String 2"
Item 3 -> "String 3"

但不幸的是我得到的所有项目都是:

Item 1 -> 1
Item 2 -> 2
Item 3 -> 3

是否有人知道为什么集合不将字符串存储为Key值?

4 个答案:

答案 0 :(得分:1)

如果我正确地阅读了您的代码,您似乎希望i中的值成为您的密钥,而不是String 1。如果是这样,我建议尝试

vArr(1) = "String 1"
vArr(2) = "String 2"
vArr(3) = "String 3"

For i = LBound(vArr) To UBound(vArr)
    col.Add vArr(i), CStr(i)
    Sheet1.Cells(1, i) = col.Item(i)
Next i

根据给出的示例,更简单的方法是

vArr(1) = "String 1"
vArr(2) = "String 2"
vArr(3) = "String 3"

For i = LBound(vArr) To UBound(vArr)
    col.Add vArr(i)
    Sheet1.Cells(1, i) = col.Item(i)
Next i

您只需按照索引查看项目,但这可能不适用于您的实际数据。

编辑: 我可以使用以下代码根据列名查找列号:

Dim i As Single, col As New Collection
Dim vArr(1 To 3) As String

vArr(1) = "Column 1"
vArr(2) = "Column 2"
vArr(3) = "Column 3"

For i = LBound(vArr) To UBound(vArr)
    col.Add i, vArr(i)
Next i

For i = LBound(vArr) To UBound(vArr)
    Dim columnNumber As Integer
    columnNumber = col("Column 2")
    Sheet1.Cells(1, columnNumber).Value = "Found it"
Next i

答案 1 :(得分:0)

简单说明: 在集合中添加方法需要参数的顺序:item,key而不是:key,item。

这是我获得该信息的地方: http://msdn.microsoft.com/en-us/library/f26wd2e5.aspx

答案 2 :(得分:0)

这是我对原始代码进行的唯一编辑:

    col.Add vArr(i), CStr(vArr(i))

答案 3 :(得分:0)

键必须是字符串,但该项可以是int,string或可能是任何对象。 如果你想要键是简单的整数,而不是“第1项”等,只需投射它们,类似于Jerry Beaucaire的建议:

col.Add vArr(i), CStr(i)