excel_vba_编程教程(完整版)-第12部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
正值范围:1。401298E…45 … 3。402823E38
Double 8 字 节 负 值 范 围 :…1。79769313486232E308 …
…494065645841247E…324
正 值 范 围 :4。94065645841247E…324 …
1。79769313486232E308
Currency 8字节 …922337203685477 … 922337203685477
Decimal 14字节 不包括小数时:+/…79228162514264337593543950335
包括小数时:+/7。9228162514264337593543950335
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 提供各种数据类型存储空间的原因。例如,要保存诸如班级学生总数这样的小数
9
… 页面 26…
Visual BASIC 程序设计网络教学 橄榄树
整 理
字,那么 Byte 数据类型就足够了。在这种情况下,使用 Single 数据类型只是对计算机存储空
间的浪费。
4。4。2 用 Dim 语句创建变量(声明变量)
现在;你对变量可以使用的数据类型已经比较熟悉了;以下我们将创建变量。创建变量可以
使用 Dim 语句;创建变量通常成为〃声明变量〃 Dim语句的基本语法如下:
Dim 变量名 AS 数据类型
这条语法中的变量名代表将要创建的变量名。对变量的命名规则和对过程的命名规则相同。
这条语句中的数据类型部分可以是表 4…1 中的任何一种数据类型。
变量名必须以字母开始;并且只能包含字母数字和特定的特殊字符;不能包含空格句号惊叹
号;也不能包含字符@ & #。名字最大长度为 255个字符
在接下来的练习中将说明如何在 VBA 中使用变量;你将要输入你的名字;并用一个消息框将
其显示出来。具体步骤如下:
1)创建一个名为〃显示你的名字〃的子程序。
2)输入以下代码:
Public Sub 显示你的名字()
Dim s 名字 As String
s 名字 = Inputbox(〃请输入你的名字:〃)
Msgbox 〃你好〃& s 名字
End Sub
3)将鼠标放到过程中的任何地方;按下 F5键运行过程;会显示一个输入框。
4)输入你自己的名字并按回车键;会显示一个消息框;显示的文字中包含你自己的名字。
5)单击〃确定〃按钮;返回过程中。
在 Dim 语句中不必提供数据类型。如果没有数据类型;变量将被定义为 Variant 类型;因为
VBA 中默认的数据类型是 Variant。你知道这一点后;最初的反应也许是觉得应该不用自己决定
数据类型;而将一切抛给 VBA。这种观念是完全错误的。你必须决定选择使用何种数据类型。因为
Variant 数据类型占用存储空间较大(16 或 22 字节)而且它将影响程序的性能。VBA必须辨别
Variant 类型的变量中存储了何种类型的数据。
4。4。3 变量命名的惯例
下表给出了推荐的变量命名惯例
数据类型 短前缀 长前缀
Array a ary
Boolean f bin
Byte b bit
Currency c cur
Double d dbl
Date/Time dt dtm/dat
Integer i int
Long l lng
Object o obj
Single sng
String s str
Variant v var
表 4…2 变量命名的前缀
4。4。4 使用数组
如果你使用过其他编程序语言;可能对数组已经比较熟悉了。数组是具有相同数据类型并共
同享有一个名字的一组变量的集合。数组中的元素通过索引数字加以区分;定义数组的方法如
下:
Dim array_name(n) As type (其中 n 是数组元素的个数)
例如;如果要创建保存 10 个学生名字的数组;可以用以下语句:
Dim s 学生名字(9) As Integer
注意;括号中的数字是 9 而不是 10。这是因为在默认的情况下;第一个索引数字是 0。数组在
处理相似信息时非常有用。假设要处理15门考试成绩;可以创建15个独立的变量;这意味着要使
用 15 个 Dim语句。也可以创建一个数组来保存考试成绩,具体如下:
10
… 页面 27…
Visual BASIC 程序设计网络教学 橄榄树
整 理
Dim s 考试成绩(14) As Integer
声明数组时的另一种方法是不给定大小。可以在程序运行时定义其大小。通过创建动态数
组就可以做到。例如,你的程序要创建一表格,可以提示用户输入表格的行和列的数目。声明
动态数组的语法如下:
Dim dyn_array() As type
对数组声明后可以在程序运行时用:ReDim语句指定数组的大小:
ReDim dyn_array()(array_size)
参数 array_size 代表数组的新大小。如果要保留数组的数值,请在 ReDim 语句后使用保留
字 Preserve;具体语法如下:
ReDim Preserve dyn_array(array_size)
4。4。5 变量赋值
声明变量后就可以给变量赋值。请注意下列语句中为数组变量赋值时索引数字的使用。
程序清单 4…4
Dim i 人数 As Integer
Dim i 考试成绩 As Integer
Dim i As Integer
i 人数 = inputbox(〃输入学生的人数:〃)
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 设置为对象变量,以减少