Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 将类属性名称传递给子对象以搜索集合_Vba_Excel_Collections - Fatal编程技术网

Vba 将类属性名称传递给子对象以搜索集合

Vba 将类属性名称传递给子对象以搜索集合,vba,excel,collections,Vba,Excel,Collections,我有一个具有一系列属性的同一类的对象集合。我想创建一个较小的集合,其中只包含特定属性具有特定值的对象,并且我想能够为不同的属性多次调用sub,而无需创建大量版本的sub 以下是与问题相关的代码部分: Sub MAIN() Dim SplitArr(1 to 2) As Variant SplitArr(1) = Y 'where Y is the value you are looking for GetSplit arr:=SplitArr, X:=?? 'where

我有一个具有一系列属性的同一类的对象集合。我想创建一个较小的集合,其中只包含特定属性具有特定值的对象,并且我想能够为不同的属性多次调用sub,而无需创建大量版本的sub

以下是与问题相关的代码部分:

Sub MAIN()

    Dim SplitArr(1 to 2) As Variant
    SplitArr(1) = Y 'where Y is the value you are looking for
    GetSplit arr:=SplitArr, X:=?? 'where ?? is the property you are looking at"

End Sub

Sub GetSplit(ByRef arr(), X as ??) 'unsure what type X should be
    Dim collSplit As Collection
    Set collSplit = New Collection
    For Each v In coll
        If v.X = arr(1) Then
            collSplit.Add v
        End If
    Next v
    Set arr(2) = collSplit
End Sub
因此,应该通过主集合coll进行GetSplit搜索,如果其中任何对象的X属性等于Y,它将把该对象添加到集合collplit中。最后,将arr(2)设置为collSplit

有一点我不知道如何做是传递一个属性名称的子,所以任何帮助将不胜感激


提前谢谢

这里有一个有效的例子

clsTest:

Public Prop1
Public Prop2
Public Prop3
常规模块:

Sub Tester()
    Dim o, i
    Dim col As New Collection
    Dim colF As Collection

    'populate some sample data...
    For i = 1 To 10
        Set o = New clsTest
        o.Prop1 = i
        o.Prop2 = i * 5
        o.Prop3 = "Test"
        col.Add o
    Next i

    Set colF = PropFilter(col, "Prop1", 2)
    Debug.Print colF.Count '>> 1

    Set colF = PropFilter(col, "Prop3", "Test")
    Debug.Print colF.Count '>> 10

End Sub


Function PropFilter(col As Collection, propName As String, propValue)
    Dim o
    Dim rv As New Collection
    For Each o In col
        If CallByName(o, propName, VbGet) = propValue Then
            rv.Add o
        End If
    Next o
    Set PropFilter = rv
End Function

“variant”是否有效?它将允许数字和字符串。@ScottCraner我假设variant是sub的正确类型,但我不知道如何在sub MAIN()中设置
等于,或者我的符号是否适用于GetSplit中的
v.X
,因为X只是一个变量,而不是对属性的引用