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

aba*_*ter 5 excel vba excel-vba

我正在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
Run Code Online (Sandbox Code Playgroud)

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

我想要一个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
Run Code Online (Sandbox Code Playgroud)

和一个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
Run Code Online (Sandbox Code Playgroud)

其中book_list是一个Book对象数组和一个方法sendEmail().

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

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

Sor*_*eri 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
Run Code Online (Sandbox Code Playgroud)

并使用它

book_list.Add <book>
dim bk as Book
set bk  = book_list.Item(indexNumber)
Run Code Online (Sandbox Code Playgroud)


Tmd*_*ean 5

有两种选择。

最简单的就是使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
Run Code Online (Sandbox Code Playgroud)