【问题标题】:Passing a class property name to a sub to search a collection将类属性名称传递给子以搜索集合
【发布时间】:2015-08-26 14:58:26
【问题描述】:

我有一组具有一堆属性的同一类的对象。我想创建一个较小的集合,该集合仅包含具有特定属性的特定值的对象,并且我希望能够为不同的属性多次调用 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

因此,GetSplit 会在主集合 coll 中进行搜索,如果其中的任何对象的 X 属性等于 Y,它将将该对象添加到集合 collSplit。最后 arr(2) 设置为 collSplit。

我不知道该怎么做是将属性名称传递给子,所以任何帮助将不胜感激。

提前致谢!

【问题讨论】:

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

标签: vba excel collections


【解决方案1】:

这是一个工作示例...

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

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2020-06-01
    • 2014-08-23
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多