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 在标准用