从今天早上开始,我在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值?
答案 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)