我正在寻找集合中的特定元素。我怎么知道它是否存在于集合中?
答案 0 :(得分:7)
收集是基于索引的。因此,您必须遍历集合才能搜索项目。
Sub test()
Dim iCtr As Integer
Dim itemCount As Integer
Dim myData As Collection
Set myData = New Collection
Dim searchFor As String
myData.Add "MS", "11"
myData.Add "Oracle", "22"
myData.Add "Google", "33"
'** Searching based on value
searchFor = "Google"
itemCount = myData.Count
For iCtr = 1 To itemCount
If myData(iCtr) = searchFor Then
MsgBox myData(iCtr)
Exit For
End If
Next
'** Searching by key
MsgBox myData.Item("22")
End Sub
答案 1 :(得分:6)
如果在将项目添加到集合时使用了密钥,请查看引用此密钥是否出错:
on error goto no_item
col.Item "key"
msgbox "Item exists"
exit sub
no_item:
msgbox "Item does not exist"
否则你必须遍历所有项目以查看是否有你需要的项目。
答案 2 :(得分:3)
我使用一个简单的工具函数来迭代一个集合。它没有直接访问索引,它使用VBA语言功能,就像它们应该被使用一样(变体的比较和每个 -Loop)。
Public Function ExistsIn(item As Variant, lots As Collection) As Boolean
Dim e As Variant
ExistsIn = False
For Each e In lots
If item = e Then
ExistsIn = True
Exit For
End If
Next
End Function
答案 3 :(得分:2)
@Josua Schmid:
我认为你答案中的代码可能是正确的,但也可能不正确。您的函数具有Variant类型的paremeter,然后将其与集合中的每个menber进行比较。但实际比较的是什么?在这种情况下,将比较默认成员。因此,如果集合将包含某些未指定默认成员的自定义类的成员,则可能会出现问题。在这种情况下运行时错误438对象不支持此属性或方法将被引发。那么你可以添加默认成员,但即便如此,它也会以你可能不喜欢的方式工作。
范围示例(对于Range-Class Value是默认成员,因此将比较Values)。也许这正是你想要的,但也许不是。因此,从我的观点来看,更好的是为添加到集合中的每个项目使用“密钥”,然后尝试通过其密钥获取此项目。
Debug.Print col.item(r1.Address)'A1 Value
如果没有使用密钥,则按索引:
Debug.Print col.item(1)'A1 Value
Sub test()
Dim col As New VBA.Collection
Dim r1 As Range
Dim r2 As Range
Dim r3 As Range
Set r1 = Range("a1")
Set r2 = Range("b1")
Set r3 = Range("c1")
r1 = "A1 Value"
r2 = "B1 Value"
r3 = "C1 Value"
col.Add r1, r1.Address
col.Add r2, r2.Address
col.Add r3, r3.Address
Debug.Print ExistsIn(r1, col)
Debug.Print ExistsIn(r2, col)
Debug.Print ExistsIn(r3, col)
Dim r4 As Range
Set r4 = Range("d1")
r4 = "A1 Value"
Debug.Print ExistsIn(r4, col)
End Sub
输出:
True
True
True
True
答案 4 :(得分:0)
可以使用变体确定集合项。在下面的示例中,我将确定FXItems集合中是否存在具有特定索引的对象。如果它不存在,系统将创建它,否则,执行一些其他操作
On Error Resume Next
Dim myFXItem as FXItem
Set myFXItem = FXItems.item("USDEUR")
On Error GoTo 0
If myFXItem Is Nothing Then
Set myFXItem = New FXItem
myFXItem.sCurr = "USDEUR"
FXItems.Add item:=myFXItem, Key:="USDEUR"
Else
myFXItem.dRate = 0.834
myFXItem.dtValueDate = #12-03-2018#
End If
Set myFXItem = Nothing