我正在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_list
是Book
个对象的数组,方法是sendEmail()
。
但是,这不起作用,因为显然我无法将Book
个对象数组定义为EmailData
对象的成员。
那么,我的方法是什么?我听说过收藏品。这会是一个解决方案吗?
答案 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