作为VBA中的类成员的类对象数组

时间:2015-02-03 21:36:31

标签: vba excel-vba excel

我正在VBA中编写一个Excel宏来向图书馆顾客发送电子邮件,提醒他们过期的资料。数据来自包含

等数据的电子表格
UserID   Name        Email      Title    Author     Barcode Call Number Borrowed Date   Due Date
user2   Jones, Bob   bob@jones  Title1  A. Baker    a0001   H00027C     11/23/2014      1/1/2015
user2   Jones, Bob   bob@jones  Title2  C. Dalton   b0002   S00406R     11/23/2014      1/1/2015
user3   Smith, Mary  bob@jones  Title3  E. Franklin c0003   M00174R     11/23/2014      1/1/2015
user3   Smith, Mary  mary@smith Title4  F. Gelt     d0004   M00157G     11/23/2014      1/1/2015
user3   Smith, Mary  mary@smith Title5  H. Ivers    e0005   M00081G     11/23/2014      1/1/2015

我开始使用用户定义的书籍和赞助人类型,并为每位顾客提供一系列书籍。我尝试将顾客传递给一个函数来生成电子邮件文本,但显然我无法将用户定义的类型作为参数传递。所以,现在我正在上课。

我希望有一个Book班级成员

Public book_title As String
Public date_borrowed As Date
Public date_due As Date
Public barcode As String
Public call_number As String

以及包含成员的EmailData课程

Public email_text As String
Public patron_name As String
Public patron_email As String
Public sender_email As String
Public book_list() As Book

其中book_listBook个对象的数组,方法是sendEmail()

但是,这不起作用,因为显然我无法将Book个对象数组定义为EmailData对象的成员。

那么,我的方法是什么?我听说过收藏品。这会是一个解决方案吗?

2 个答案:

答案 0 :(得分:8)

根据我的评论,我会使用一个集合。以下是定义和初始化的方法

Public book_list As Collection

'intitalize the collection in the constructor of the class
Private Sub Class_Initialize()
    Set book_list = New Collection
End Sub

并使用它

book_list.Add <book>
dim bk as Book
set bk  = book_list.Item(indexNumber)

答案 1 :(得分:4)

有几种选择。

最简单的方法是将book_list变为Variant类型。您可以使用ReDim将其视为数组。您可以使用Variant类型的变量来存储对象引用,就像使用对象变量一样。

另一个选择是使book_list成为私有变量并创建访问器方法。无论如何,这是使用类的首选方法,如果您首先使用类,那么您也可以观察到良好的面向对象设计。你的课看起来像这样。

Private email_text As String
...
Private book_list() As Book

Private Sub Class_Initialize()
    email_text = "default email text"
    ...
    ReDim book_list(10)
End Sub

Public Function GetBook(index As Long) As Book
    Set GetBook = book_list(index)
End Function

Public Sub SetBook(index As Long, b As Book)
    Set book_list(index) = b
End Sub