excel_vba_编程教程(完整版)-第66部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Next emp
End Sub
cmdEmployeeList_Click过程附加在命令按钮Update List之上,该按钮由cmdSave_Click过程
控制,并且导致新的员工数据添加到列表框控件里。cmdEmployeeList_Click过程以清除列表
框的内容开始,然后用自定义集合CEmployees的成员来填充列表框。
225
… 页面 242…
图11…4 列表框控件显示员工数据,正如在自定义集合输入的一样
10。 输入下述过程cmdClose_Click:
Private Sub cmdClose_Click()
Unload Me
End Sub
cmdClose_Click过程让你将用户窗体从屏幕上清除,并结束使用员工的自定义集合。当你再
次运行窗体,你输入的员工将会成为新集合CEmployees的成员。
11。 输入下述过程cmdDelete_Click:
Private Sub cmdDelete_Click()
' make sure that an employee is highlighted in the
' list control
If lboxPeople。ListIndex 》 …1 Then
MsgBox 〃Selected item number: 〃 & lboxPeople。ListIndex
extract = CEmployees。Item(lboxPeople。ListIndex + 1)。Id
MsgBox extract
Call FindId
MsgBox empLoc
Range(〃A〃 & empLoc)。Delete (3)
MsgBox 〃There are 〃 & CEmployeesunt & _
〃 items in the CEmployees collection。 〃
CEmployees。Remove lboxPeople。ListIndex + 1
MsgBox 〃The CEmployees collection has now 〃 & _
CEmployeesunt & 〃 items。〃
cmdEmployeeList。Value = True
If CEmployeesunt = 0 Then
Call UserForm_Initialize
End If
Else
MsgBox 〃Click the item you want to remove。〃
End If
End Sub
过程cmdDelete_Click让你从自定义集合CEmployees里面清除员工。要删除员工的话,你必须
点击列表框的适当成员。当你点击一个列表成员(和按钮Delete Employee),
cmdEmployeeList_Click过程就自动执行。该过程确保更新列表框的内容。员工将同时从集合
和列表框里删除。如果列表框里面只有一个员工,那么VBA将调用过程UserForm_Initialize
在清除最后一个员工后将某些控件失活。cmdDelete_Click过程里有好几个MsgBox语句,让你
在做决定的时候检查列表框控件的内容。除了从自定义集合里删除员工之外,过程
226
… 页面 243…
cmdDelete_Click也必须从工作表的相应行删除员工信息。使用函数FindId可以很方便地在工
作表里找到员工数据(该过程的代码见下面的第12步)。该函数将要删除的行号返回到过程
cmdDelete_Click。
12。 输入下述函数过程:
Private Function FindId()
Set ws = ActiveWorkbook。Sheets(〃Salaries〃)
startRow = ActiveSheet。UsedRange。Rowsunt + _
1 … CEmployeesunt
endRow = ActiveSheet。UsedRange。Rowsunt
For Each cell In ws。Range(Cells(startRow; 1); _
Cells(endRow; 1))
If cell。Value = extract Then
empLoc = cell。Row
FindId = empLoc
Exit Function
End If
Next
End Function
函数过程FindId将含有窗体列表框中当前选择的员工数据的行号返回到主调过程。工作表中
的数据搜索基于变量extract的内容,它存储员工的唯一号码。员工ID的搜索被限制与工作表
的第一列,并从集合的第一个成员放置的位置开始搜索,这样使搜索更快一些。你不要在工
作表整个使用的区域里搜索。想想如果你不只一次地使用了窗体,但是,自定义集合的内容
不会包含前面输入的员工。
13。 输入下述过程cmdUpdate_Click:
Private Sub cmdUpdate_Click()
If optHighlighted = False And optAll = False Then
MsgBox 〃Click the 'Highlighted Employee' or 〃 _
& 〃 'All Employees' option button。〃
Exit Sub
End If
If Not IsNumeric(txtRaise) Then
MsgBox 〃This field requires a number。〃
txtRaise。SetFocus
Exit Sub
End If
If optHighlighted = True And _
lboxPeople。ListIndex = …1 Then
MsgBox 〃Click the name of the employee。〃
Exit Sub
End If
If lboxPeople。ListIndex …1 And _
optHighlighted = True And _
optAmount。Value = True And _
txtRaise。Value 〃〃 Then
extract = CEmployees。Item(lboxPeople。ListIndex + 1)。Id
MsgBox extract
Call FindId
MsgBox empLoc
choice = 2
amount = txtRaise
227
… 页面 244…
CEmployees。Item(lboxPeople。ListIndex + 1)。Salary = _
emp。CalcNewSalary(choice; _
CEmployees。Item(lboxPeople。ListIndex + 1)。Salary; amount)
Range(〃D〃 & empLoc)。Formula = CEmployees。 _
Item(lboxPeople。ListIndex + 1)。Salary
cmdEmployeeList。Value = True
ElseIf lboxPeople。ListIndex …1 And _
optHighlighted = True And _
optPercent。Value = True And _
txtRaise。Value 〃〃 Then
extract = CEmployees。Item(lboxPeople。ListIndex + 1)。Id
MsgBox extract
Call FindId
MsgBox empLoc
CEmployees。Item(lboxPeople。ListIndex + 1)。Salary = _
CEmployees。Item(lboxPeople。ListIndex + 1)。Salary + _
(CEmployees。Item(lboxPeople。ListIndex + 1)。Salary * _
txtRaise / 100)
Range(〃D〃 & empLoc)。Formula = CEmployees。 _
Item(lboxPeople。ListIndex + 1)。Salary
cmdEmployeeList。Value = True
ElseIf optAll = True And _
optPercent。Value = True And _
txtRaise。Value 〃〃 Then
For Each emp In CEmployees
emp。Salary = emp。Salary + ((emp。Salary * txtRaise) _
/ 100)
extract = emp。Id
MsgBox extract
Call FindId
MsgBox empLoc
Range(〃D〃 & empLoc)。Formula = emp。Salary
Next
emp cmdEmployeeList。Value = True
ElseIf optAll = True And _
optAmount。Value = True And _
txtRaise。Value 〃〃 Then
For Each emp In CEmployees
emp。Salary = emp。Salary + txtRaise
extract = emp。Id
MsgBox extract
Call FindId
MsgBox empLoc
Range(〃D〃 & empLoc)。Formula = emp。Salary
Next emp
cmdEmployeeList。Value = True
Else
MsgBox 〃Enter data or select an option。〃
End If
End Sub
228
… 页面 245…
有了过程cmdUpdate_Click,你就可以使用确定的百分比或者特定量来修改薪水。可以为选定的员
工或者列表框和集合里面列出的所有员工更新薪水。cmdUpdate_Click过程核实用户是否选择了适
当的选项按钮,然后在文字框里输入增加数字。取决于你选择了哪个选项按钮,给某个员工或者所
有员工更新的薪水量可以是按照百分比,也可以是按照某个固定的量。薪水的更改也会反映在工作
表里。图11…15显示James Nolan的薪水,以按百分之十增加了该薪水。在文字框里面输入负数,你
可以按照特定的百分比或者量减少薪水。
图11…5 可以按照特定的百分比或者固定量增加或者减少员工的薪水
14。 选择“插入”|“模块”在当前工程里插入一个标准模块,重命名该模块为WorkAndPay,输入
下述过程来显示窗体Employees and Salaries:
Sub ClassDemo( )
Salaries。Show
End Sub
15。 运行过程ClassDemo,使用自定义类。
你可以点击窗体的背景并且按下F5,运行窗体Salaries,或者你也可以在工作表里放置一个按钮,
并将过程ClassDemo指定给它(参见第十章,如何将按钮放在工作表里)。
15。观察 VBA 过程的执行
为了帮助你理解代码运行时会发生什么,以及你的自定义对象如何工作,我们来逐步运行过程
cmdSave_Click。本练习也可以说是第十三章里将包括的调试技巧的简单介绍。
1。 在工程浏览窗口,选择Salaries窗体,并点击窗口上面的查看代码按钮
2。 出现Salaries代码窗口时,从代码窗口左上角的复合框里选择过程cmdSave
3。 在下述代码行的左边框上点击一下,设置断点:
If txtLastName。Value = 〃〃 Or txtFirstName。Value = 〃〃 Or _
txtSalary。Value = 〃〃 Then
229
… 页面 246…
图11…6 边框上的红色圆圈代表断点。当VBA遇到带断点的语句时,它就会自动切换到代码窗口并且
显示该白字红底的文本。
4。 在工程浏览窗口,选中模块WorkAndPay并点击查看代码按钮
5。 将光标放在过程ClassDemo里的任意位置,并且按下F5,或者选择“运行”|“运行子过程/用
户窗体”
6。 当窗体出现时,在Last Name,First Name和Salary文字框里输入数据,然后点击窗体的按钮
Save。现在VB将切换到代码窗口,因为它碰到了过程cmdSave_Click第一行的断点。
图11…7 当VB运行过程遇到断点时,它会切换到代码窗口,并在中