友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
飞读中文网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

excel_vba_编程教程(完整版)-第84章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



         optAmount。Value = False   
         txtRaise。Enabled = False   
         optPercent。Enabled = False   
         optAmount。Enabled = False   
         Frame2。Enabled = False   
         optHighlighted。Enabled = False   
         optAll。Enabled = False   

                                         223 

… 页面 240…

         cmdUpdate。Enabled = False   
         cmdDelete。Enabled = False   
     End Sub   
当窗体启动时,UserForm_Initialize过程内部的语句只会激活需要的控件(见图11…3)。  

                                                                                
图11…3 当窗体第一次启动时,UserForm_Initialize过程禁用某些控件  
8。  输入下述过程cmdSave_Click将输入在窗体的数据转移到工作表:  
     Private Sub cmdSave_Click()   
         If txtLastName。Value = 〃〃 Or txtFirstName。Value = 〃〃 Or _  
              txtSalary。Value = 〃〃 Then   
              MsgBox 〃Enter Last Name; First Name and Salary。〃   
              txtLastName。SetFocus   
              Exit Sub   
         End If   
         If Not IsNumeric(txtSalary) Then   
              MsgBox 〃You must enter a value for the Salary。〃   
              txtSalary。SetFocus   
              Exit Sub   
         End If   
         If txtSalary 《 0 Then   
              MsgBox 〃Salary cannot be a negative number。〃   
              Exit Sub   
         End If   
         Worksheets(〃Salaries〃)。Select   
         index = ActiveSheet。UsedRange。Rowsunt + 1   
         lboxPeople。Enabled = True   
         'set and enter data into the CEmployees collection   
         With emp   
              Cells(index; 1)。Formula = emp。Id   
              。LastName = txtLastName   
              Cells(index; 2)。Formula = emp。LastName   
              。FirstName = txtFirstName   
              Cells(index; 3)。Formula = emp。FirstName   
              。Salary = CCur(txtSalary)   
              If 。Salary = 0 Then Exit Sub   
              Cells(index; 4)。Formula = emp。Salary   
              CEmployees。Add emp   
         End With   

                                          224 

… 页面 241…

           ‘delete data from text boxes   
         txtLastName = 〃〃  
         txtFirstName = 〃〃   
         txtSalary = 〃〃   
           ‘enable hidden controls   
         cmdEmployeeList。Value = True   
         cmdEmployeeList。Visible = True  
         cmdUpdate。Enabled = True   
         cmdDelete。Enabled = True   
         Frame1。Enabled = True   
         txtRaise。Enabled = True   
         optPercent。Enabled = True   
         optAmount。Enabled = True   
         Frame2。Enabled = True   
         optHighlighted。Enabled = True   
         optAll。Enabled = True   
         txtLastName。SetFocus   
     End Sub   
     cmdSave_Click过程以验证用户的姓、名和薪水文字框开始,如果用户输入了正确的数据,VBA 
     将当前工作表里的第一空白行赋予变量Index。下一条语句激活窗体的列表框控件。  
     当程序到达With emp结构时,类CEmployee的一个新示例便产生了。属性LastName,FirstName 
     和Salary的设置基于相应文字框里输入的数据,而ID属性则是由Class_Initialize事件过程 
     里的随机数语句产生的数字设置的。VBA每次看到对对象emp的引用时,它就会调用位于类模 
     块里的适当Property Let过程。  
     本章的最后部分示范如何一步一步地跟踪过程的运行,准确地查看什么时候运行属性过程。 
     设置完对象的属性值后,VBA将员工数据转移到工作表里。With emp结构里面的最后一条语句 
     将用户定义的对象emp添加到一个叫做CEmployee的自定义集合。  
     接着,VB将窗体文字框里的输入清除并且激活开始在UserForm_Initialize过程里关闭的命令 
     按钮。注意,本代码块的第一条指令:cmdEmployeeList。Value = True,该语句导致自动执 
     行cmdEmployeeList_Click过程,该过程附加于按钮Update List(顺便说一下,这是唯一用 
     户从未见到的控件)。该过程的代码如下所示。  
9。  输入cmdEmployeeList_Click过程,如下所示:  
     Private Sub cmdEmployeeList_Click()   
         lboxPeople。Clear   
         For Each emp In CEmployees   
              lboxPeople。AddItem emp。Id & 〃; 〃 & _   
                emp。LastName & 〃; 〃 & emp。FirstName & 〃; 〃 & _   
                Format(emp。Salary; 〃0。00〃)  
         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   
返回目录 上一页 下一页 回到顶部 1 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!