【问题标题】:Sub procedure that takes an argument as a user defined data type to add to data dictionary collection将参数作为用户定义的数据类型添加到数据字典集合的子过程
【发布时间】:2015-04-03 00:57:50
【问题描述】:

我正在尝试学习如何使用使用键的字典集合。我有一个由特殊字符分隔的文本文件。使用 VBA 宏记录器,我学会了如何删除连续的分隔符以及排列列以防止文本文件在不同的地方带有标题。

数据包含申请人信息:

Name | Date       | State | University | Age
Ann  | 2015-01-14 | NY    | Boston     | 18
Bob  | 2015-02-11 | MA    | Stanford   | 17

为了这个示例,数据存储在工作表上,在工作表 1 上。从第 1 行第 1 列的标题开始。

我创建了一个名为申请人的用户定义对象:

Type Applicant
    Name as String
    DateApp as Date
    State as String
    University as String
    Age as Double
End Type

我想创建一个数据字典“申请人”集合来存储申请人的每个实例。我在想这样的事情:

Public Sub add_applicant(prsPerson as Applicant)

有没有办法做到这一点?我了解使用 for/each 循环 .add 到集合的基础知识,但我只看到将单个条目添加到字典集合中。我想对此进行扩展并从用户定义的对象中添加数据类型的组件。我希望申请人集合的单个实例包含恰好一个申请人行的数据。

我会做这样的事情吗?

Dim prsPerson As Applicant
Set prsPerson = New Applicant
With prsPerson
    .Name = "Ann"
    .Age = 18
    .State = "NY"
    .Date = "2015-01-14"
    .University = "Boston"
End With

Applicants.Add Item:=prsPerson

如何创建一个遍历范围块的 for 循环,并使用子程序 add_applicant(prsPerson as Apply)?

如何为此添加密钥?我希望密钥由名称组成。然而,Ann 不止一次出现在数据文件中,因为她可以申请不同的学校。这是允许的吗?因为我还想计算安申请了多少次等等。

【问题讨论】:

  • 您可以考虑更改您的类型,以便 University 是一个数组 - 您不需要创建同一个人的多个版本,因为他们已经申请了 >1 所学校。另请注意,您在这里使用的是 Type,而不是 Class,因此您的申请人仍然是“值类型”,在这种情况下您不使用 Set .

标签: vba excel excel-2010


【解决方案1】:

根据您的描述,听起来您需要的不是字典,而是申请人的集合。 Collections 具有可选键,但使用 Dictionary 时键更清晰。但是,无论哪种方式,您都不能为同一个键拥有不同的对象。您仍然可以遍历集合并计算 Ann 出现的次数。

我在向集合添加类型时遇到了麻烦(使用 Excel 2007)。我收到一个错误“只有公共对象模块中的用户定义类型可以强制转换为变体或从变体强制转换或传递给后期绑定函数”

您可以创建一个申请人数组。

dim applicants() as Applicant
redim applicants(0 to 9) 'you may count rows here to get the number you expect to use.

您创建的类型的另一种替代方法是具有所有相同属性的类。那里有很多关于如何创建类的信息,所以我不会在这里讨论。它们与 Types 相似,但有一些区别和更多功能,更复杂。

如果您不想创建一个类并且仍然想使用一个集合,这里有一种可能的方法,它以不同于您最初预期的方式使用字典。你最终得到了字典的集合。如果您创建一个类,您只需稍作修改即可将字典更改为您的新类。

Sub test()
    Dim c As Collection
    Dim d As Object
    Dim i As Long
    Dim lastRow As Long

    lastRow = 10 'Change this to fit your data

    Set c = New Collection
    For i = 1 To lastRow
        Set d = CreateObject("Scripting.dictionary")
        d("Name") = Sheets("sheet1").Cells(i, 1)
        d("Date") = Sheets("sheet1").Cells(i, 2)
        'etc
        c.Add d
        Set d = Nothing
    Next

    'to count Ann's applications
    Dim entry As Variant
    Dim appCount As Long

    For Each entry In c
        If entry("Name") = "Ann" Then
            appCount = appCount + 1
        End If
    Next
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2012-12-13
    相关资源
    最近更新 更多