Excel与VBA程序设计(mini)(3)

2018-11-26 21:27

一个完整的程序。

代码窗口的设置

中文环境下 VBA IDE 代码窗口缺省的设置比较糟糕,字体为宋体,大小是9 磅,使用 不很方便,可以在“工具- 选项”对话框下的“编辑器格式”页内设置代码窗口字 体、颜色、背景。

在此模块内,再新建一段代码:

#001 Function MyAdd(varA, varB) As Variant #002 MyAdd = varA + varB #003 End Function

此段代码非常简单,只有3 行,第1 行表示这是一个函数,具有2 个参数varA,和varB, 函数与过程的差别在于函数有返回值,第2 行将参数varA,和varB 的和赋给函数,代表其 返回值。函数无法直接运行,必须从工作表或者其他程序调用,例如,我们可以写以下一 段简单的程序调用此函数: #001 Sub TestAdd() #002 Dim a, b, c #003 a = 12 #004 b = 34

2. VBA 简介 12

Excel 与VBA 程序设计 Copyright ? 2005 马维峰

#005 c = MyAdd(a, b) #006 MsgBox c #007 End Sub

其中第5 行为函数MyAdd 的调用,函数将返回值赋给c。需要说明的是,VBA 中,

调用过程可以使用Call 语句,也可省略,调用过程时,其参数的括号可以省略,但调用函 数必须有括号。

也可以直接在工作表内使用自定义的函数,例如在工作表中,我们可以和 Excel 内置

函数一样使用自定义的函数(图 2-5),Excel 会负责参数传递,将返回值赋给相应的单元 格,在引用参数改变时会自动重新计算,总之,与内置函数的使用没有什么不同。 图 2-5 在工作表中使用自定义函数

以上通过 2 个例子简单介绍了VBA 编程的过程和概念,后面我们将正式进入VBA

编程之旅,逐步讲解模块、函数与过程、基本语法、数据类型、类模块与面向对象编程等 概念。

2.1.3. 善用工具及其他

VBA 集成开发环境,提供了很多便利的工具可以帮助或辅助我们写出好的程序,其中 的方便必须亲自使用才可以体会,因此,一定要善用工具5。

VBA 的代码编辑器提供了几项非常有用的功能,如代码大小写自动切换,代码自动格 式化,即时代码提示。代码自动大小写切换可以帮助我们发现拼写错误,如果我们所有的 过程和变量都是按照首字母大写的规则定义的,那么输入这些过程或者变量时,可以全部 小写,如果编辑器自动将其首字母改成了大写,那么说明拼写没有错误。代码即时提示可 以使我们不必记忆太多的东西,输入对象后会自动列出其属性、方法等内容;输入方法函 数后会提示参数信息。代码自动格式化可以使我们在书写代码时不必过于关心格式化的问 题,如等号前后加空格之类。

在实际的编程过程中,一定要善于利用在线帮助,VBA 的在线帮助包含了大量对编程

5 不仅是 VBA

开发,所有的程序开发工作中都应该善用工具。:)

2. VBA 简介 13

Excel 与VBA 程序设计 Copyright ? 2005 马维峰

有用的参考信息,任何人都不可能记得住所有的函数、对象的用法和程序语言的语法,所 以一定要利用好帮助。帮助的使用可以在任何关键字上按F1 键查找相关内容,也可以通 过帮助目录浏览,或者通过查找输入关键字查找相关内容。

VBA 的对象浏览器可以浏览一个对象的属性、方法和事件,通过对象浏览器,我们可 以获得一个对象的整体概念,特别对于某些没有提供帮助的对象或第三方对象,对象浏览 器更有帮助文档的作用。

VBA 中使用了很多常量,可以在编程中直接使用其代表的数字,也可以使用定义好的 常量,例如MsgBox 中的一些参数(按钮参数vbYesNo 等)。使用常量一者可以获得好的 可读性,二者也容易记忆。关于VBA 以及Excel 的常量,可以随时通过帮助文档查阅。 在代码书写中,如果一句代码过长,应该使用接行字符(“-”)将其分为几行,而不是 书写为一行,一般来说,代码的长度不要超过80 个字符为宜,这样阅读方便,不需要横向 拉动滚动条,也不容易出错。例如以下打开文件语句使用了3 个接行符: Workbooks.OpenText Filename:=strFilename, _ Origin:=936, StartRow:=1, DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 1), Array(37, 1), _

Array(52,1),Array(64,1)), TrailingMinusNumbers:=True

对于代码格式,一定要养成缩进的习惯,在过程之后,循环语句、判断语句之内,如 本书的例子样子,缩进4 个字符,便于阅读。代码中,在一个逻辑或者操作完成之后,应 该空一行,以表示其逻辑关系,在过程与过程之间,也应该空一行。

VBA 中,使用单引号“’”表示注释,编写程序时,一定要养成注释的习惯。注释不

是所有代码都要注释;一般来说,对一个模块、过程、函数,要大概说明其功能,参数; 对于一个过程,如果涉及较复杂的算法,要说明其使用的算法或流程。在过程和函数中, 对关键代码,说明其操作的目的、算法或流程。

2.2. 模块、函数和过程

2.2.1. 模块

模块是自定义的过程、函数保存的地方,也是录制的宏保存的场所。有两种基本类型 的模块:类模块和标准模块,本节介绍标准模块,类模块将在专门介绍。模块可以通过右 键单击工程资源管理器的工程名,选择“插入 - 模块”来新建,新建的模块缺省的名称

2. VBA 简介 14

Excel 与VBA 程序设计 Copyright ? 2005 马维峰

为“模块 1”,“模块2”,建议在属性窗口内更改为有意义的名称。模块有2 个任务:(1) 保存过程和函数;(2)定义模块内的私有变量或整个工程的公有变量。

关于 VBA 中的命名

VBA 中可以为模块、函数、过程、变量赋于中文名称,但笔者不推荐这么做。至于可 能出现的在英文系统下的兼容性问题,在Office 2000 以后,应该已不存在,只是一个 编程习惯问题。

另外,变量名称一般应该由2 部分组成:类型(小写) + 含义(各单词首字母大写); 而过程则由一个或数个表示其意义的单词组成,首字母大写,例如strName, ChangeName 等。对于过程内部的临时变量,如循环变量,则直接以i、j、temp 之类 命名即可。详细的VBA 命名规范和代码规范见附录。

在模块中可以声明变量(包括对象),定义过程和函数。过程和函数的定义见下文,变 量的声明如下。 变量的声明: Dim i as Long Dim strName as String

Dim 表示声明,i 和strName 为变量名称,As 之后的Long 表示数据类型(参见数据类 型一节)。变量的声明还可以通过以下两种方式定义: Private i as Long Public strName as String

Private 表示此变量是私有的,只有在此模块内部的函数、过程才可以访问;而Public

则表示此变量为公用的,可以在其他模块中访问使用。应用Dim 声明的变量也是私有变量。 一般来说,除非必要,一定要少使用公用变量。

要求变量声明

VBA 缺省可以不声明变量,在第一次使用的时候自动声明,但此功能也是VBA 代码 (包括其他Basic 代码)的一个主要错误之源。试想第一次使用了一个变量

strMyFirstName,之后又通过strMyFirstNme(少一个a)来使用它,但由于拼写不同, VBA 以为是一个新的变量,于是会新声明一个变量,这样的错误极其难以发现。 可以通过“工具- 选项”对话框,在“编辑器”页,选中“要求变量声明”,则在使 用变量前,都必须先通过Dim 语句声明。 2. VBA 简介 15

Excel 与VBA 程序设计 Copyright ? 2005 马维峰

2.2.2. 过程

过程是最基本的运行单位。一个完整的过程一般类似如下格式: Sub Test()

… … End Sub

在以上程序中,Sub 代表过程种类,表示运行指定的操作,但不返回运行结果;Test 表示过程名称,最后以End Sub 结束。

过程的长度(行数)

过程并不限定代码行数,一个过程可以有一行到数百行代码,但随着过程或函数长度 的增加,错误也会随之增加,因此一般的编程书籍都建议过程(函数)的长度不要超 过计算机屏幕的一屏为宜,对于一些特殊的过程,也不要超过200 行代码。对于太长 的代码可以分拆为几个子过程。

正式的过程描述如下:

[Private | Public] [Static] Sub name [(arglist)] [statements] [Exit Sub] [statements] End Sub

其组成和含义见表 2-1:

表 2-1 过程的组成部分及其含义 部分 描述

Public 可选的。表示所有模块的所有其它过程都可访问这个 Sub 过程。如果在包含 Option Private 的模块中使用,则这个过程在该工程外是不可使用的。

Private 可选的。表示只有在包含其声明的模块中的其它过程可以访问该 Sub 过程。 Static 可选的。表示在调用之间保留 Sub 过程的局部变量的值。Static 属性对在 Sub 外 声明的变量不会产生影响,即使过程中也使用了这些变量。 name 必需的。Sub 的名称;遵循标准的变量命名约定。

arglist 可选的。代表在调用时要传递给 Sub 过程的参数的变量列表。多个变量则用逗号 隔开。

statements 可选的。Sub 过程中所执行的任何语句组。

其中的 arglist 参数的语法以及语法各个部分如下,描述见表 2-2:

2. VBA 简介 16

Excel 与VBA 程序设计 Copyright ? 2005 马维峰

[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]

表 2-2 过程参数的语法及其含义 部分 描述

Optional 可选的。表示参数不是必需的关键字。如果使用了该选项,则 arglist 中的后

续参数都必须是可选的,而且必须都使用 Optional 关键字声明。如果使用了 ParamArray,则任何参数都不能使用 Optional。 ByVal 可选的。表示该参数按值传递。

ByRef 可选的。表示该参数按地址传递。ByRef 是 Visual Basic 的缺省选项。

ParamArray 可选的。只用于 arglist 的最后一个参数,指明最后这个参数是一个 Variant 元 素的 Optional 数组。使用 ParamArray 关键字可以提供任意数目的参数。 ParamArray 关键字不能与 ByVal,ByRef,或 Optional 一起使用。 varname 必需的。代表参数的变量的名称;遵循标准的变量命名约定。 type 可选的。传递给该过程的参数的数据类型,参加数据类型一节。

defaultvalue 可选的。任何常数或常数表达式。只对 Optional 参数合法。如果类型为 Object,则显式的缺省值只能是 Nothing。

其中按值传递参数指一种将参数值而不是将地址传递给过程的方式,这就使过程访问 到变量的复本。结果,过程不可改变变量的真正值。按地址传递参数指一种将参数地址而 不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真 正值。VBA 缺省按地址传递参数。

例如以下程序,11 行的过程ByValTest 的参数var 是按值传递,因此不会改变参数的 值(5 行的调用),而15 行的过程ByRefTest 的参数var 是按引用(地址)传递的,因此会

改变参数的值(6 行的调用)。 #001 Sub ParameterTest()

#002 Dim var1 As Long, var2 As Long #003 var1 = 12 #004 var2 = 12 #005 ByValTest var1 #006 ByRefTest var2

#007 MsgBox \还是12: \#008 MsgBox \不是12: \#009 End Sub #010

#011 Sub ByValTest(ByVal var As Long) #012 var = var * 2 #013 End Sub


Excel与VBA程序设计(mini)(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:201509学期C语言程序设计作业1

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: