vba:我如何搜索集合?

时间:2010-08-27 18:35:01

标签: vba collections

我正在寻找集合中的特定元素。我怎么知道它是否存在于集合中?

5 个答案:

答案 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