《excel_vba_编程教程(完整版)》

下载本书

添加书签

excel_vba_编程教程(完整版)- 第14节


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
    ReDim Preserve i 考试成绩(i 数量)  
    For i = 1 to i 人数  
    i 考试成绩(i) = inputbox(〃输入考试成绩〃& i )  
    Next   

                          第五课 利用 VBA 设置工作表使用权限  

Excel Home   
一般保护工作表采取的方法是用 EXCEL 菜单中的〃保护〃命令,有时这尚嫌不足,比如一些机密 
文件根本要让某些使用者无法看到,但又需要他来操作工作簿中的其他表,怎么办?   
可以打开 VBA 编辑器,打开〃工程资源管理器〃,双击该工作表,现在出现的是设置该表的属性 
的编辑窗口,单击窗口左上的下拉列表框,选择 worksheet ;这时再从该窗口右上方的列表框 
中选择 Active(〃激活〃),这时自动显示如下的语句块:  
Private Sub Worksheet_Activate()  
End Sub  
在其中加入代码:(假设用〃123〃作为密码;Sheet〃机密文档〃为限制权限文  
档;sheet〃普通文档〃为工作簿中你认为任何适合的工作表)  
If Application。InputBox(〃请输入操作权限密码:〃) = 123 Then  
Range(〃A1〃)。Select  
Else  
Msgbox 〃密码错误;即将退出!〃  
Sheets(〃普通文档〃)。Select  
End if  
程序如下:  
Private Sub Worksheet_Activate()  
If Application。InputBox(〃请输入操作权限密码:〃) = 123 Then  
Range(〃A1〃)。Select  
Else  
MsgBox 〃密码错误;即将退出!〃  
Sheets(〃普通文档〃)。Select  
End If  
End Sub  
这样做仍有一个问题,就是越权使用者仍会看到一些文件的片段,即在提示密码的那段时间。 
好,你可以这样做,用上述方法选择工作表的 Deactivate 事件;输入以下代码:  
Sheets(〃机密文档〃)。Cells。FontlorIndex = 2  
这段程序使得此工作表在不被激活时,所有文字为白色。然后,在第一个程序中的 
Range(〃A1〃)。Select 后插入一行,写入以下代码:  

                                          11 

… 页面 28…

Visual BASIC 程序设计网络教学                                                   橄榄树 
整                                                                                   理 
ActiveSheet。Cells。FontlorIndex = 56  
这段程序,在你输入正确密码后,将该表所有文字转变为深灰色。  
完整的程序如下:  
Private Sub Worksheet_Activate()  
If Application。InputBox(〃请输入操作权限密码:〃) = 123 Then  
Range(〃A1〃)。Select  
Sheets(〃机密文档〃)。Cells。FontlorIndex = 56  
Else  
MsgBox 〃密码错误;即将退出!〃  
Sheets(〃普通文档〃)。Select  
End If  
End Sub  

                            第六课 提高 Excel 中 VBA 的效率  

    由于 Microsoft Office 办公套件的广泛应用,以及该软件版本的不断提升,功能不断完善, 
在 Office 办公套件平台上开发出的的 VBA 应用程序越来越多,而 VBA 是一种宏语言,在运行速 
度上有很大的限制。因此 VBA 编程的方法直接关系到 VBA 程序运行的效率,本文列举了一些提 
高 VBA 程序运行效率的方法。   

方法 1:尽量使用 VBA 原有的属性、方法和 Worksheet 函数   

    由于 Excel 对象多达百多个,对象的属性、方法、事件多不胜数,对于初学者来说可能对 
它们不全部了解,这就产生了编程者经常编写与 Excel 对象的属性、方法相同功能的 VBA 代码 
段,而这些代码段的运行效率显然与 Excel 对象的属性、方法完成任务的速度相差甚大。例如 
用 Range 的属性 CurrentRegion 来返回 Range 对象,该对象代表当前区。(当前区指以任意空 
白行及空白列的组合为边界的区域)。同样功能的 VBA 代码需数十行。因此编程前应尽可能多地 
了解 Excel对象的属性、方法。   
    充分利用 Worksheet 函数是提高程序运行速度的极度有效的方法。如求平均工资的例子:   
        For Each c In  
          Worksheet(1)。Range(″A1:A1000″)  
    TotalValue = TotalValue + c。Value  
    Next  
    AverageValue = TotalValue / Worksheet(1)。Range(″A1:A1000″)。Rowsunt  
    而下面代码程序比上面例子快得多:  
         AverageValue=Application。WorksheetFunction。Average(Worksheets(1)。Range( ″ 
A1:A1000″))  
    其它函数如 Count;Counta;Countif;Match;Lookup 等等,都能代替相同功能的 VBA 程序代 
码,提高程序的运行速度。   

方法 2:尽量减少使用对象引用,尤其在循环中   

    每一个 Excel 对象的属性、方法的调用都需要通过 OLE 接口的一个或多个调用,这些 OLE 
调用都是需要时间的,减少使用对象引用能加快 VBA 代码的运行。例如   
    1.使用 With 语句。  
    Workbooks(1)。Sheets(1)。Range(″A1:A1000″)。Font。Name=″Pay″  
    Workbooks(1)。Sheets(1)。Range(″A1:A1000″)。Font。FontStyle=″Bold″ 。。。  
  则以下语句比上面的快  
  With Workbooks(1)。Sheets(1)。Range(″A1:A1000″)。Font  
     。Name = ″Pay″  
     。FontStyle = ″Bold″  
     。。。  
    End With   
    2.使用对象变量。  
    如果你发现一个对象引用被多次使用,则你可以将此对象用 Set 设置为对象变量,以减少 
对对象的访问。如:  

                                           12 

… 页面 29…

Visual BASIC 程序设计网络教学                                                橄榄树 
整                                                                                理 
     Workbooks(1)。Sheets(1)。Range(″A1″)。Value = 100  
     Workbooks(1)。Sheets(1)。Range(″A2″)。Value = 200  
    则以下代码比上面的要快:  
    Set MySheet = Workbooks(1)。Sheets(1)  
    MySheet。Range(″A1″)。Value = 100  
    MySheet。Range(″A2″)。Value = 200   
    3.在循环中要尽量减少对象的访问。  
    For k = 1 To 1000  
     Sheets(″Sheet1″)。Select  
     Cells(k;1)。Value = Cells(1;1)。Value  
    Next k  
    则以下代码比上面的要快:  
    Set TheValue = Cells(1;1)。Value  
    Sheets(″Sheet1″)。Select  
    For k = 1 To 1000  
     Cells(k;1)。Value = TheValue  
    Next k   

    方法 3:减少对象的激活和选择   

    如果你的通过录制宏来学习 VBA 的,则你的 VBA 程序里一定充满了对象的激活和选择,例 
如 Workbooks(XXX)。Activate、Sheets(XXX)。Select、Range(XXX)。Select 等;但事实上大多数 
情况下这些操作不是必需的。例如   
    Sheets(″Sheet3″)。Select  
    Range(″A1″)。Value = 100  
    Range(″A2″)。Value = 200  
    可改为:  
    With Sheets(″Sheet3″)  
     。Range(″A1″)。Value = 100  
     。Range(″A2″)。Value = 200  
    End With   

    方法 4:关闭屏幕更新   

    如果你的 VBA 程序前面三条做得比较差,则关闭屏幕更新是提高 VBA 程序运行速度的最有 
效的方法,缩短运行时间 2/3 左右。关闭屏幕更新的方法:  
    Application。ScreenUpdate = False  
    请不要忘记 VBA 程序运行结束时再将该值设回来:  
    Application。ScreenUpdate = True   
    以上是提高 VBA 运行效率的比较有效的几种方法。   

                          第七课 如何在 Excel 里使用定时器  

    用过 Excel 97 里的加载宏 〃定时保存〃 吗?可惜它的源程序是加密的,现在就上传一篇 
介绍实现它的文档。   
在 Office 里有个方法是 application。ontime ,具体函数如下:  
expression。OnTime(EarliestTime; Procedure; LatestTime; Schedule)  
如果想进一步了解,请参阅 Excel 的帮助。   
    这个函数是用来安排一个过程在将来的特定时间运行,(可为某个日期的指定时间,也可为 
指定的时间段之后)。通过这个函数我们就可以在 Excel 里编写自己的定时程序了。下面就举 
两个例子来说明它。   
1。在下午 17:00:00 的时候显示一个对话框。   
Sub Run_it()  
Application。OnTime TimeValue(〃17:00:00〃); 〃Show_my_msg〃  
'设置定时器在 17:00:00 激活,激活后运行 Show_my_msg 。  
End Sub  

                                         13 

… 页面 30…

Visual BASIC 程序设计网络教学                                                橄榄树 
整                                                                                理 
Sub Show_my_msg()  
msg = MsgBox(〃现在是 17:00:00 !〃; vbInformation; 〃自定义信息〃)  
End Sub  
2。模仿 Excel 97 里的 〃自动保存宏〃;在这里定时 5 秒出现一次   
Sub auto_open()  
MsgBox 〃欢迎你,在这篇文档里,每 5 秒出现一次保存的提示!〃; vbInformation; 〃请注意! 
〃  
Call runtimer '打开文档时自动运行  
End Sub  
Sub runtimer()  
Application。OnTime Now + TimeValue(〃00:00:05〃); 〃saveit〃  
' Now + TimeValue(〃00:15:00〃) 指定在当前时间过 5 秒钟开始运行 Saveit 这个过程。  
End Sub  
Sub SaveIt()  
msg = MsgBox(〃朋友,你已经工作很久了,现在就存盘吗?〃 & Chr(13) _  
& 〃选择是:立刻存盘〃 & Chr(13) _  
& 〃选择否:暂不存盘〃 & Chr(13) _  
& 〃选择取消:不再出现这个提示〃; vbYesNoCancel + 64; 〃休息一会吧!〃)  
'提示用户保存当前活动文档。   
If msg = vbYes Then ActiveWorkbook。Save Else If msg = vbCancel Then Exit Sub  
Call runtimer '如果用户没有选择取消就再次调用 Runtimer  
End Sub  
以上只是两个简单的例子,有兴趣的话,可以利用 Application。Ontime 这个函数写出更多更 
有用的定时程序。   

                                         14 

… 页面 31…

                    三、学习微软 Excel 2002 VBA 编程和 XML,ASP 技术  

    ASP已经趋于淘汰了,Vbscript将慢慢退出舞台了,其实他是vba的子集,相比vba来讲更容易 
一些,用不着深入学  
    摘自2004…3…8hzg7818版主的答复  
      
    作者:Julitta Korol       翻译:Tiger Chen Nov 28’ 2004  
     本书展示了Excel 2002 在标准用
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架