Sub auto_open()
MsgBox \欢迎你,在这篇文档里,每 5 秒出现一次保存的提示!\tion, \请注意!\
Call runtimer '打开文档时自动运行 End Sub
Sub runtimer()
Application.OnTime Now + TimeValue(\
' Now + TimeValue(\指定在当前时间过 5 秒钟开始运行 Saveit 这个过程。 End Sub
Sub SaveIt()
msg = MsgBox(\朋友,你已经工作很久了,现在就存盘吗?\& \选择是:立刻存盘\& \选择否:暂不存盘\
& \选择取消:不再出现这个提示\休息一会吧!\'提示用户保存当前活动文档。
If msg = vbYes Then ActiveWorkbook.Save Else If msg = vbCancel Then Exit Sub
Call runtimer '如果用户没有选择取消就再次调用 Runtimer End Sub
以上只是两个简单的例子,有兴趣的话,可以利用 Application.Ontime 这个函数写出更多更
有用的定时程序。
提高Excel中VBA的效率 提高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″).Rows.Count
而下面代码程序比上面例子快得多:
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 设置为对象变量,以减少对对象的访问。如:
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运行效率的比较有效的几种方法。
利用VBA设置工作表使用权限
Excel Home
一般保护工作表采取的方法是用EXCEL菜单中的\保护\命令,有时这尚嫌不足,比如一些机密文件根本要让某些使用者无法看到,但又需要他来操作工作簿中的其他表,怎么办?
可以打开VBA编辑器,打开\工程资源管理器\,双击该工作表,现在出现的是设置该表的属性的编辑窗口,单击窗口左上的下拉列表框,选择worksheet ,这时再从该窗口右上方的列表框中选择Active(\激活\),这时自动显示如下的语句块:
Private Sub Worksheet_Activate() End Sub
在其中加入代码:(假设用\作为密码,Sheet\机密文档\为限制权限文 档,sheet\普通文档\为工作簿中你认为任何适合的工作表)
If Application.InputBox(\请输入操作权限密码:\Range(\Else
Msgbox \密码错误,即将退出!\
Sheets(\普通文档\End if
程序如下:
Private Sub Worksheet_Activate()
If Application.InputBox(\请输入操作权限密码:\Range(\Else
MsgBox \密码错误,即将退出!\Sheets(\普通文档\End If End Sub
这样做仍有一个问题,就是越权使用者仍会看到一些文件的片段,即在提示密码的那段时间。好,你可以这样做,用上述方法选择工作表的Deactivate事件,输入以下代码:
Sheets(\机密文档\
这段程序使得此工作表在不被激活时,所有文字为白色。然后,在第一个程序中的Range(\后插入一行,写入以下代码: ActiveSheet.Cells.Font.ColorIndex = 56
这段程序,在你输入正确密码后,将该表所有文字转变为深灰色。 完整的程序如下:
Private Sub Worksheet_Activate()
If Application.InputBox(\请输入操作权限密码:\Range(\
Sheets(\机密文档\Else
MsgBox \密码错误,即将退出!\Sheets(\普通文档\End If
End Sub
VBA变量详解
变量是用于临时保存数值的地方.每次应用程序运行时,变量可能包含不同的数值,而在程序运行时,变量的数值可以改变.
为了说明为什么需要变量,可以按照如下步骤创建一个简单的过程: 1)创建一个名为\你叫什么名字\的过程. 2)在过程中输入如下代码: Inputbox \输入你的名字:\
现在不要担心inputbox语句的语法,将在第六学时中了解到有关这条命令的更多信息.
3)按下F5键运行过程,这时会显示一个输入框,要求输入你的名字. 4)输入你的名字并按\确定\按钮,则结束该过程.
你输入的名字到那里去了?如何找到用户在输入框中输入的信息?在这种情况下,需要使用变量来存储用户输入的结果.
4.4.1 变量的数据类型
使用变量的第一步是了解变量的数据类型.变量的数据类型控制变量允许保存何种类型的数据.表4-1列出了VBA支持的数据类型,还列出了各种类型的变量所需要的存储空间和能够存储的数值范围. 数据类型 存储空间 数值范围 Byte 1字节 0 - 255
Booleam 2字节 True或者False Integer 2字节 -32768 - 32767
Long(长整型) 4字节 -2147483648 - 2147483647
Single 4字节 负值范围:-3.402823E38 - -1.401298E-45
正值范围:1.401298E-45 - 3.402823E3
8
Double 8字节 负值范围:-1.79769313486232E308 - -494065645841247E-324
正值范围:4.94065645841247E-324 - 1.
79769313486232E308
Currency 8字节 -922337203685477 - 922337203685477 Decimal 14字节 不包括小数时:+/-79228162514264337593543950335
包括小数时:+/7.92281625142643375935
43950335
Date 8字节 1000年1月1日 - 9999年12月31日 Object 4字节 任何引用对象
String(长字符串) 10字节+1字节/字符 0 - 约20亿 String(固定长度) 字符串的长度 1 - 约65400
Varient(数字) 16字节 Double范围内的任何数值 Varient(文本) 22字节+1字节/字符 数据范围和变长字符串相同
表4-1 VBA数据类型 作为ABV程序员,一个目标是选择需要存储空间尽量小的数据类型来保存所需要的数据,这正是表4-1提供各种数据类型存储空间的原因。例如,要保存诸如班级学生总数这样的小数字,那么Byte数据类型就足够了。在这种情况下,使用Single数据类型只是对计算机存储空间的浪费。
4.4.2 用Dim语句创建变量(声明变量)
现在,你对变量可以使用的数据类型已经比较熟悉了,以下我们将创建变量.创建变量可以使用Dim语句,创建变量通常成为\声明变量\语句的基本语法如下:
Dim 变量名 AS 数据类型
这条语法中的变量名代表将要创建的变量名.对变量的命名规则和对过程的命名规则相同.这条语句中的数据类型部分可以是表4-1中的任何一种数据类型.
变量名必须以字母开始,并且只能包含字母数字和特定的特殊字符,不能包含空格句号惊叹号,也不能包含字符@ & $ #.名字最大长度为255个字符 在接下来的练习中将说明如何在VBA中使用变量,你将要输入你的名字,并用一个消息框将其显示出来.具体步骤如下: