Excel实战技巧66:创建向导样式的数据输入窗体3
- 2019 年 12 月 10 日
- 筆記
学习Excel技术,关注微信公众号:
excelperfect
在开始阅读本文前,请先学习下列内容:
Excel实战技巧66:创建向导样式的数据输入窗体1
Excel实战技巧66:创建向导样式的数据输入窗体2
上文中,我们完成了用户窗体界面的设计。接下来,设置一些类来使用户窗体工作。在一开始,你可能会认为一个与数据记录相联系的类就满足要求了,但我们将在定义类时分解功能,设计一两个类帮助定义向导步骤。最终,将实现一个灵活的向导应用程序,提供非常容易修改步骤的顺序的能力,甚至添加一个步骤也相当简单。
HRWizard中的类
由于正收集的某些员工信息将被传递给其它部门去处理,因此在自已的类中放置从每个屏幕中获得的数据。还需要一个监控向导步骤的类,同时考虑一个帮助使用ListMgr工作表中数据填充列表的类。下表列出了每个类及其功能。
表:HRWizard应用程序类模块

图19
HRWizard商业对象
下面开始设计商业对象。这些类存储每个对象的数据,包含每个对象的一些商业规则。
在工程中添加一个新的类模块并将其命名为cPerson,再添加另外三个类模块,分别将它们命名为cAddress、cEquipment和cAccess。cPerson对象包含一个cAddress对象、cEquipment对象、一个cAccess对象。要保持它们同步,对这四个商业对象类的每一个都添加一个ID属性。
在每个类中,添加下列模块级的声明:
Private m_lngID As Long Public Property Get ID() AsLong ID = m_lngID End Property Public Property Let ID(newID AsLong) m_lngID = newID End Property
现在,让我们集中开发cPerson类。每个类实质上对应着先前我们设计的一个界面。
在cPerson类中添加下列模块级变量声明:
Private m_sFName As String Private m_sMidInit As String Private m_sLName As String Private m_dtDOB As Date Private m_sSSN As String Private m_sJobTitle As String Private m_sDepartment As String Private m_sEmail As String Private m_oAddress As cAddress Private m_oEquipment As cEquipment Private m_oAccess As cAccess
注意,除了从界面设计中的数据输入项外,还包括包含地址、设备和访问信息的对象。
这里首先要做的是初始化cPerson类,设置一些默认值。在Class_Initialize事件中,添加下列代码:
Private Sub Class_Initialize() m_lngID = RandomNumber(100000, 999999) Set m_oAddress = New cAddress Set m_oEquipment = New cEquipment Set m_oAccess = New cAccess SetObjectIDs End Sub
上述代码中,设置了私有的ID变量m_lngID为随机的6位数字,并初始化私有的商业对象变量。然后调用私有的函数SetObjectIDs设置所有四个商业对象的ID值为相同的值。添加下列代码到cPerson类中生成随机数字和同步ID字段:
Private Function RandomNumber(upper As Long, lower As Long) As Long
'生成一个介于upper和lower之间的随机数
Randomize RandomNumber = Int((upper - lower + 1) *Rnd + lower) End Function Private Sub SetObjectIDs() m_oAddress.ID = m_lngID m_oEquipment.ID = m_lngID m_oAccess.ID = m_lngID End Sub
在ID属性的Property Let函数中添加对上面过程的调用。这样,如果手工对ID字段赋值,那么所有的商业对象都获取这个新值。最终ID属性的Property Let过程代码如下:
Public Property Let ID(newID As Long) m_lngID = newID '保持所有对象同步使用相同的ID SetObjectIDs End Property cPerson类代码的剩余部分非常直观。最终的cPerson类的代码如下: Property Get FName() As String FName = m_sFName End Property Property Let FName(newFName As String) m_sFName = newFName End Property Property Get MidInit() As String MidInit = m_sMidInit End Property Property Let MidInit(newMidInit As String) m_sMidInit = newMidInit End Property Property Get LName() As String LName = m_sLName End Property Property Let LName(newLName As String) m_sLName = newLName End Property Property Get DOB() As Date DOB = m_dtDOB End Property Property Let DOB(newDOB As Date) m_dtDOB = newDOB End Property Property Get SSN() As String SSN = m_sSSN End Property Property Let SSN(newSSN As String) m_sSSN = newSSN End Property Property Get JobTitle() As String JobTitle = m_sJobTitle End Property Property LetJobTitle(newJobTitle As String) m_sJobTitle = newJobTitle End Property Property Get Department() As String Department = m_sDepartment End Property Property LetDepartment(newDepartment As String) m_sDepartment = newDepartment End Property Property Get Email() As String Email = m_sEmail End Property Property Let Email(newEmail As String) m_sEmail = newEmail End Property Property Get Address() As cAddress Set Address = m_oAddress End Property Property Set Address(newAddress As cAddress) Set m_oAddress = newAddress End Property Property Get Equipment() As cEquipment Set Equipment = m_oEquipment End Property Property Set Equipment(newEquipment As cEquipment) Set m_oEquipment = newEquipment End Property Property Get Access() As cAccess Set Access = m_oAccess End Property Property Set Access(newAccess As cAccess) Set m_oAccess = newAccess End Property
至此,已经完成Person数据元素的添加,以及3个对象类属性。同时,想要添加一个属性,返回员工的全名。下面的代码在cPerson中添加只读的FullName属性,返回员工全名:
Property Get FullName() As String Dim sReturn As String Dim blnMidInit As Boolean blnMidInit = Len(m_sMidInit &"") > 0 If blnMidInit Then sReturn = m_sFName & " "& m_sMidInit & " " & m_sLName Else sReturn = m_sFName & " "& m_sLName End If FullName = sReturn End Property 这就是我们所需要的cPerson类。 下面列出其它3个类的代码。 cAddress类: Private m_lngID As Long Private m_sStreetAddress As String Private m_sStreetAddress2 As String Private m_sCity As String Private m_sState As String Private m_sZipCode As String Private m_sPhoneNumber As String Private m_sCellPhone As String Public Property Get ID() As Long ID = m_lngID End Property Public Property Let ID(newID As Long) m_lngID = newID End Property Public Property Get StreetAddress() As String StreetAddress = m_sStreetAddress End Property Public Property Let StreetAddress(newAddress As String) m_sStreetAddress = newAddress End Property Public Property Get StreetAddress2() As String StreetAddress2 = m_sStreetAddress2 End Property Public Property Let StreetAddress2(newAddress2 As String) m_sStreetAddress2 = newAddress2 End Property Public Property Get City() AsString City = m_sCity End Property Public Property Let City(newCity As String) m_sCity = newCity End Property Public Property Get State() As String State = m_sState End Property Public Property Let State(newState As String) m_sState = newState End Property Public Property Get ZipCode() As String ZipCode = m_sZipCode End Property Public Property Let ZipCode(newZipCode As String) m_sZipCode = newZipCode End Property Public Property Get PhoneNumber() As String PhoneNumber = m_sPhoneNumber End Property Public Property Let PhoneNumber(newPhoneNumber As String) m_sPhoneNumber = newPhoneNumber End Property Public Property Get CellPhone() As String CellPhone = m_sCellPhone End Property Public Property Let CellPhone(newCellPhone As String) m_sCellPhone = newCellPhone End Property cEquipment类: Private m_lngID As Long Private m_sPCType As String Private m_sPhoneType As String Private m_sLocation As String Private m_sFaxYN As String Public Property Get ID() AsLong ID = m_lngID End Property Public Property Let ID(newID AsLong) m_lngID = newID End Property Public Property Get PCType() AsString PCType = m_sPCType End Property Public Property Let PCType(newPCType As String) m_sPCType = newPCType End Property Public Property Get PhoneType() As String PhoneType = m_sPhoneType End Property Public Property Let PhoneType(newPhoneType As String) m_sPhoneType = newPhoneType End Property Public Property Get Location() As String Location = m_sLocation End Property Public Property Let Location(newLocation As String) m_sLocation = newLocation End Property Public Property Get FaxYN() As String FaxYN = m_sFaxYN End Property Public Property Let FaxYN(newFaxYN As String) m_sFaxYN = newFaxYN End Property cAccess类: Private m_lngID As Long Private m_sBuilding As String Private m_iNetworkLevel As Integer Private m_sRemoteYN As String Private m_sParkingSpot As String Public Property Get ID() As Long ID = m_lngID End Property Public Property Let ID(newID As Long) m_lngID = newID End Property Public Property Get Building() As String Building = m_sBuilding End Property Public Property Let Building(newBuilding As String) m_sBuilding = newBuilding End Property Public Property Get NetworkLevel() As Integer NetworkLevel = m_iNetworkLevel End Property Public Property Let NetworkLevel(newNetworkLevel As Integer) m_iNetworkLevel = newNetworkLevel End Property Public Property Get RemoteYN() As String RemoteYN = m_sRemoteYN End Property Public Property Let RemoteYN(newRemoteYN As String) m_sRemoteYN = newRemoteYN End Property Public Property Get ParkingSpot() As String ParkingSpot = m_sParkingSpot End Property Public Property Let ParkingSpot(newParkingSpot As String) m_sParkingSpot = newParkingSpot End Property
好好体会一下上面给出的类的代码,消化一下,继续看下面的内容。