EXCEL VBA应用教程

更新时间:2023-03-11 14:12:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

EXCEL VBA应用教程--第1讲 什么是EXCEL VBA

第1讲 什么是EXCEL VBA

作者:http://hi.http://www.wodefanwen.com//landmao

1.1 为什么要学习EXCEL VBA

现在,财务软件已经趋于普及,会计人员的工作效率大幅度提高,减轻了会计人员大工作强度。财务软件但优点是从数据但输入、处理、输出实现了一体化,在会计数据但利用方面,尽管财务软件一直都作改进,但客观上还是满足不了管理工作但要求。因此,作实际工作中,EXCEL被大量应用,EXCEL但特点是简单易用,操作灵活,大大地弥补了会计软件地不足。但是,EXCEL处理数据的缺点是,每一步都要人工操作和控制,对重复性的工作,每次都要重复去作。

EXCEL VBA能够将重复的工作编写成程序,这样就能够提高效率和避免人为操作的错误。

1.2 什么是VBA

VBA(Visual Basic For Applications)是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。VBA是Visual Basic的一个子集,VBA不同于VB,原因是VBA要求有一个宿主应用程序才能远行(需要在EXCEL等软件的运行下才能运行),而且不能用于创建独立应用程序。而VB可用于创建独立的应用程序。VBA可使常用的过程或者进程自动化,可以创建自定义的解决方案,最适用于来定制已有的桌面应用程序。

通常意义上的VBA就是在Office中包含着的一种加强Office功能的Basic语言。经过发展,在Office中,Word、Excel、Access、PowerPoint等个软件都有了自己的程序设计语言,分别称为WordBasic、ExcelBasic、AccessBasic、PowerPointBasic (在Outlook中的开发语言为Visual Basic Scripting Edition)。通常统一称为VBA(VB for Application)。

本讲座,主要基于EXCEL VBA进行讲解。 VBA和VB的区别包括如下几个方面:

(1) VB是设计用于创建标准的应用程序,而VBA是在已有的应用程序(EXCEL等)下运行,实行有关操作、处理、查询等的自动化,提高效率。

(2)VB具有自己的开发环境,而VBA必须寄生于已有的应用程序(如EXCEL)。 (3)要运行VB开发的应用程序,用户不必安装VB,因为VB开发出的应用程序是可执行文件(*.EXE),可独立运行。而VBA开发的程序必须依赖于它的\父\应用程序,例如EXCEL,如编写的EXCEL VBA程序,没有安装EXCEL是无法运行的。

虽然一些不同,VBA和VB在结构上仍然十分相似。如果你已经对VB有一些基础,学习VBA就非常容易。当掌握EXCEL VBA后,对WORD、ACCESS等中应用VBA创建解决方案,也就基本掌握了。

1.3 应用EXCEL VBA的好处

在EXCEL中,使用VBA可以实现的功能主要包括: (1)创建报表。

(2)对数据进行复杂的操作和分析。 (3)使重复的工作自动化。

(4)自定义EXCEL工具栏,菜单和界面。 (5)自定义EXCEL,使其成为开发平台。 用EXCEL作为开发平台有如下原因:

(1)EXCEL本身功能强大,包括打印,文件处理,格式化和文本编辑。大家中在EXCEL使用中已经掌握了EXCEL基本概念、操作方法,采用EXCEL VBA能够更加提高效率,使用者容易接受。

(2)EXCEL内置大量函数和处理功能,通过EXCEL VBA能够高效率地简单应用。

(3)可连接到多种数据库,便于与财务软件等交换数据。

(4)VBA简单易学,容易被会计人员及其管理人员掌握,易于大范围推广应用。用其他语言开发应用程序,一半的工作是编写一些基本功能的模块,包括文件的打开和保存、处理、打印等。而用EXCEL作为开发平台,则由于EXCEL已经具备这些基本功能,你要做的工作只是使用它。 1.4 怎样学习EXCEL VBA

掌握EXCEL的人很多,但要在上面编写程序,也是需要学习的。要学习EXCEL VBA,首先应该购买一本EXCEL VBA的书籍,然后对照上面的案例就行学习和操作。同时,要根据自己的业务需要,结合实际编写一些实用的小功能。

现在网络上的EXCEL VBA很多,遇到问题,可以通过搜索,一般都能够找到。通过积累,逐渐就掌握了。一般需要三个月左右都时间。

本讲座将结合案例,在逐步讲解EXCEL VBA基本知识和方法的基础上,通过实际应用的方式来学习。

EXCEL VBA应用教程--第2讲 EXCEL VBA的开发环境和开发过程

第2讲 EXCEL VBA的开发环境和开发过程 作者:http://hi.http://www.wodefanwen.com//landmao 2.1 什么是VBE

VBE(Visual Basic Editor)是编写VBA代码的工具,窗口结构和VB的编辑器相似。和VB编辑器不同的是,VBE不能单独打开,必须依附于他所支持的应用程序,如EXCEL。 2.2 启动VBE 环境

在Excel菜单中,选择工具——宏——Visual Basic 编辑器,或者按快捷键Alt+F11即可进入。

安全性设置:要编写VBA程序和运行VBA程序,需要进行“安全性”设置,不然编写当VBA程序无法运行。在Excel菜单中,选择工具——宏——安全性,进入安全性设置,一般选择“中”,如果不行就选择“低”。

2.3 VBE 的应用

进入VBE编辑器后,就能编写有关低界面后程序。VBE编辑器主要包括以下部分:

1、代码窗口。就是在这里写VBA的代码,也是在这里查看代码的。

2、对象窗口。可以在这里设定窗体的界面(如果使用了窗体的话),在这里能很直观地设定窗体各个控件的布局。

3、对象浏览器。在这里可以查看所有对象库、特定对象或你自己的工程,包括所有的对象的列表与每个对象的成员列表。

4、工程资源管理器。在这里,我们可以很方便地管理工程中的模块、类模块与窗体,还可以很容易地在代码与对象间切换。

5、属性窗口。在这里可以很简单地设定很多对象相关的属性,简单到只要用鼠标选择即可。

6、工具箱。在插入窗体后,可以从工具箱添加各种控件。 7、立即窗口。其主要工作是:

(1)在开发过程中,用Debug.Print输出的内容就在此显示。 (2)当代码是Break模式时,查看对象和变量的状态。

(3)用?加上语句,就可以看到运行的结果,在很多情况下比用msgbox报出方便多了。

2.4 使用VBA帮助和寻找资源

1.VBA帮助。VBA的帮助中包含Excel所有属性、对象、方法等的说明,学习VBA的过程中,经常查阅VBA帮助,对了解Excel所有属性、对象、方法很有帮助。在查看别人的代码时,对不熟悉的部分,只要将光标移到其中,再按F1键,就能快速查获到相关的帮助。我们还可以在帮助的应答向导中,键入相关的关键词,来查找我们需要的内容。

2.网络的搜索。网络的好处就在于信息量之巨大,而要查找到我们需要的信息时,最基本的就是用好搜索。通过如百度、Google等,只要键入合适用的关键词,就能找出不少相关的信息。 2.5 EXCEL VBA的开发过程 1. EXCELVBA开发过程简介

在开发一个具体的业务程序时,需要对以下问题有个大致的考虑。 1)使用者。这决定了程序的操作难度及界面感观。 2)数据来源和保存在哪里。这决定了程序的结构。 3)如何操作。这将决定程序的界面和细节。 4)数据处理的结果。最终决定程序的价值。 2.认识不同的控件

开始时关闭所有工作簿,打开一个新工作簿并另存为一个具体名字,一般用项目名称。在工具栏上单击鼠标右键,从快捷菜单中选择\窗体\显示\窗体\工具栏.其中有16个控件,只有9个可放到工作表内。 1)标签:它用于表现静态文本。 2)分组框:它用于将其他控件进行组合。 3)按钮:用于执行宏命令。

4)复选框:它是一个选择控件,通过单击可以选择和取消选择,可以多项选择。

5)选项按钮:通常几个选项按钮组合在一起使用,在一组中只能选择一个选项按钮。

6)列表框:用于显示多个选项并从中选择。只能单选。

7)组合框:用于显示多个选项并从中选择。可以选择其中的项目或者输入一个其它值。

8)滚动条:不是你常见的来给很长的窗体添加滚动能力的控件,而是一种选择机制。例如调节过渡色的滚动条控件。包括水平滚动条和垂直滚动条。 9)微调控件:也是一种数值选择机制,通过单击控件的箭头来选择数值。例如改变Windows日期或时间就会使用到微调控件。 3.向工作表添加控件 4.设置控件的特性 5.给控件命名 6.使用用户窗体

如果希望创建专业级的应用程序,并且方便用户输入数据,那么应该使用用户窗体。用户窗体可以作为程序的对话框和窗口.向用户窗体添加控件基本类似于向工作表添加控件。

在对用户窗体设计完成后,可以对其进行预览,方法是在VBA编辑器中选择该窗体,单击“运行”菜单中的三角符号“运行子过程/用户窗体”,三角符号在VBA工具栏上也可能看得到,旁边是一个垂直的等于符号,最右边是个小正方形符号,它们类似于录音机上的按钮。运行窗体的另一个方法是按F5键。

EXCEL VBA应用教程--第3讲 常量、变量与数据类型(一)

第3讲 常量、变量与数据类型

作者:http://hi.http://www.wodefanwen.com//landmao

数据是程序运行的基础,在EXCEL VBA中,大量的数据是中EXCEL中的,但在程序运行中,还会有一些程序的控制数据。要掌握一种程序语言,必须了解该语言的数据类型有哪些以及该数据是如何声明的,以便得知该数据是使用哪种数据类型、该数据所能允许使用得最大和最小范围(生存期)、以及该数据占用多少内存空间。这样程序执行时才不会发生数据溢出(Overflow)和浪费内存空间得现象。

执行程序时,必须先将程序和数据加载到计算机的内存(RAM)中才能执行,若该数据会随着程序的执行而更改其值,我们称之为变量(Variable),而不发生变化的则时常量。常量指的时数据类型特定值的文字表示,常量被用来指定给变量当作变量值。程序运行时,语句中的每一个常量,都会分配到内存空间来存放其值。

3.1 标识符

变量和常量需要用一个名称来标识,这就是标识符。标识符名称第一个字符允许以大小字母、_或者中文名称(一般不建议用中文名称)开头,后面的字符可接A~Z、a~z、0~9或_等字符。

3.2 保留字

保留字又称关键词(Keyword),是程序语言中事先赋予某个标识符的一个特别意义,因此就不得再重复赋予不同的用途。其用法又一定的规范,在编写程序时,这些保留字若出现在程序中的语句时会以蓝色标示,以提醒用户这些标识符是属于系统保留字不可误用。

这后面的内容中,我们逐步学习涉及到的相关保留字,如if、then等等。

3.3 常量

所谓“常量”是指数据类型特定值的文字表示。常量被用来指定给变量当作变量值。程序运行时,语句中的每一个常量,都会分配到内存的空间来存放其值。 3.3.1 整数常量

整数常量由数字、+(正)、—(负)所组成。整数常量的表示方式由:二进制、八进制、十进制、十六进制。十进制整数常量是一串十进制数,十六进制常量是&H后面跟着一串十六进制数字(0~9、A~F),八进制常量则是&O(O为字母)后面跟着一串八进制数字(0~7)。十进制常量直接以阿拉伯数字(0~9)来表示,二八进制常量和十六进制常量则以二进制数表示整数常量。常量的类型是由其值或是接在其后的数据类型字符来决定。如果未指定数据类型字符,则在Integer类型范围内的值会采用Integer整数数据类型;超出Integer范围大小的值则采用Long长整数数据类型。由于一般人比较习惯十进制数,本书所用的数值常量,大都采用十进制数表示。 3.3.2 浮点常量

浮点常量是整数常量后面跟着选择性的小数点和尾数,以及选择性的基底为10的指数。默认浮点常量是属于Double数据类型。如果指定Single、Double和Decimal数据类型字符,则常量就属于该数据类型。

数据常量的各数据类型所占的内存空间与可表示的大小范围如表所示。

浮点常量 数据类型 Byte(字节) 内存 1Byte 范围 0~255的整数(这种数据类型占用的内存空间最少) Short(短整数) 2Bytes -32 768~32 767的整数 Integer(整数) 4 Bytes -2 147 483 648~2 147 483 647的整数(约有10位数的正负整数) Long(长整数) 8Byte-9 223 372 036 854 775 808~9 223 372 036 854 775 s Single(单精度) 808的整数(约有19位的正负整数) 4Bytes 正数:1.401298×E-45~3.402823×E+38 负数:-3.402823×E+38~-1.401298×E-45 (有效位数为7位,可以表示小数) Double(双精8Bytes 正数:4.94065645841247×E-324~度) 1.79769313486231×E+308 负数:-1.79769313486231×E+308~-4.94065645841247×E-324 (有效位数为15位,可以表示小数) Decimal(货币16Bytes 整数范围:+/﹣79 228 162 514 264 337 593 543 950 类型) 335 浮点数范围:+/﹣7.9228162514264337593543950335 最小非零值范围:+/﹣0.0000000000000000000000000001 (有效位数为29位,可以表示小数) 3.3.3 字符串常量 字符串常量由一连串的字符组合而成,包括中文、英文字母、空格、数字、特殊符号。字符串常量可细分成:Char(字符)数据类型和String(字符串)数据类型,其所占的内存空间和允许的范围大小如表所示。

字符串常量 数据类型 内存 范围 Char(字符) 0~65535的整数,为Unicode码(每一个码代表一个字符) String(字符串) 变动长度 0~20亿个Unicode字符 字符串常量必须使用“””双引号头尾括起来。

3.3.4 布尔常量

布尔常量只有两个值,一个为“True”、另一个为“False”,分别表示真与假、开与关、Yes与No等两种状态。Boolean数据类型常被使用在关系表达式及逻辑表达式条件式中,用来判断条件成立与否。

第3讲 常量、变量与数据类型(二)

2Byte 3.3.5 日期常量

日期常量代表以Date数据类型的值所表示的特定时间。常量可同时指定日期和时间、仅指定日期或仅指定时间。

日期常量 数据类型 Date(日期) 内存 8Bytes 范围 1/1/0001 0:00:00~12/31/1999 11:59:59 PM 如果省略日期值,则会假设为公元1年1月1日。如果省略时间值,则会假设为12:00:00 AM。例:

#11:20:00 PM# (仅指定时间) #9/9/2004# (仅指定日期)

#9/9/2004 12:45:00 PM# (同时指定日期及时间)

3.3.6 variant

Variant字符串类型的存储空间为22字节加上字符串的长度,其取值范围与变长字符串数据类型的取值范围相同,缺省值为Empty。

Variant数字型的存储空间为16字节,其取值范围与Double数据类型的取值范围相同,缺省值为Empty。

3.4 变量和数据类型

为了要避免变量占用太多的内存空间,VBA视数据的大小与数据种类尔给予不同的数据类型。将变量分成数值、字符串、布尔、日期等类型。各种数据类型所占用的字节(Byte)不相同。

使用变量的第一步是了解变量的数据类型.变量的数据类型控制变量允许保存何种类型的数据,各种类型的变量所需要的存储空间和能够存储的数值范围.

第3讲 常量、变量与数据类型(三)

VBA数据类型表

数据类型 Byte Booleam Integer Long(长整型) Single Double Currency Decimal Date Object String(长字符串) String(固定长度) Varient(数字) Varient(文本)

存储空间 1字节 2字节 2字节 4字节 4字节 8字节 8字节 14字节 8字节 4字节 字符串的长度 16字节

0 - 255 True或者False -32768 - 32767 -2147483648 - 2147483647

负值范围:-3.402823E38 - -1.401298E-45 正值范围:1.401298E-45 - 3.402823E38

负值范围:-1.79769313486232E308 - -494065645841247E-324 正值范围:4.94065645841247E-324 - 1.79769313486232E308 -922337203685477 - 922337203685477

不包括小数时:+/-79228162514264337593543950335 包括小数时:+/7.9228162514264337593543950335 1000年1月1日 - 9999年12月31日 任何引用对象 1 - 约65400

Double范围内的任何数值

数值范围

10字节+1字节/字符 0 - 约20亿

22字节+1字节/字符 数据范围和变长字符串相同

3.5 变量的声明方式

在程序中,要使用变量,必须先使用Dim声明确定其数据类型,若在声明时未设置其初值,数值变量默认为0、字符串变量默认为空字符串。

使用Dim声明变量的方式如下:

Dim sum As Integer 声明sum为整型变量,初值默认为0

Dim string1,string2 As String 同时声明string1、string2为字符串类型变量初值空字符串

Dim cost As Integer =50 声明cost为整型变量,并设初值为50

第4讲 运算符(一)

第4讲 运算符

作者:http://hi.http://www.wodefanwen.com//landmao

运算符(Operator)用来指定数据做何种运算。运算符按照运算时所需要的操作数(Operand)数目分成:单元运算符(Unary Operator),如:﹣9;二元运算符(Binary Operator),如a+b为一个加法表达式(Expression),其中a、b为操作数,加号为运算符,由于加号运算符在运算是需要两个操作数,因此称为二元运算符。

4.1 算术运算符

算术运算符是用来执行一般的数学运算,如:加、减、乘、除和取余数等运算。

算术运算符与表达式 运算符符号 运算符 表达式 + ﹣ * / \\ Mod ^ 相加运算符 相减运算符 相乘运算符 相除运算符 整型除法运算符 取余数运算符 指数运算符 i=j+k i=j﹣k i=j*k i=j/k i=j\\k i=jMod k i=5^2 4.2 关系运算符

关系表达式的功能式用来比较字符串或数值的大小。关系表达式经过运算后,其结果可以为真(True)或为假(False),通过其结果来决定程序的执行流程。

关系运算符与关系表达式

关系运算符 意义 数学式 关系表达式

= = 相等 A=B A= =B <> 不相等 A≠B A<>B > 大于 A>B A>B < 小于 A= 大于或等于 A≧B A>=B <= 小于或等于 A≤B A<=B

Like 按样式比较字符串 字符串Like样式 Is 比较对象 对象A Is对象B TypeOf…Is 测试对象数据类型 If(TypeOf对象Is)Then Like子句样式用法如下所示:

Dim chksign As Boolean

chksign = “A” Like “A” ?True chksign = “a” Like “A” ?False chkFlag = “A” Like “AAA” ?False

第4讲 运算符(二)

4.3 逻辑表达式

逻辑表达式用来测试比较复杂的条件,一般都用来连接多个关系表达式。如:使用age变量当年龄,若条件为:10

If(age>10)And (age<=30) then

其中(age>10)和(age<=30)两者为关系表达式,两者间利用And逻辑运算符来连接。同样,逻辑表达式的运算结果只有真(True)或假(False)。逻辑表达式主要有两种类型的表达方式:

And、Or、Not、XOR逻辑运算符 AndAlso/OrElse逻辑运算符

例如,若a值为6,求下列逻辑运算后的结果:

(a>1) And (a<=10) ?检查1

(a<1) Or (a>=5) ?检查a是否小于大于5,结果为True

4.4 赋值运算符与复合赋值运算符

当需要指定某个变量的值、将某个变量或某个表达式的结果指定给某个变量时,就必须使用赋值运算符来完成。赋值运算符是以符号(=)来表示。

第5讲 流程控制语句

第5讲 流程控制语句

作者:http://hi.http://www.wodefanwen.com//landmao

一个程序的流程,都是由顺序结构、选择结构和循环结构三者组合而成。顺序结构的特点是语句由上而下逐行地执行。选择结构是当程序执行时,欲改变程序执行的顺序时使用。循环结构俗称重复,当程序中有某个语句块需要循环执行时使用。因此,设计一个具有结构化的程序,除了必须具有清晰的逻辑分析能力外,要使用以上所述的三种结构来实现。 5.1 If语句

“选择结构”指当程序执行时,需要改变执行的流程时,则必须使用条件来做判断,若满足条件(即结果为True)则执行某个语句段,若不满足条件(即结果为False)则执行另一个语句段。

1.If?Then?Else语句

在设计程序时,常会碰到“如果?那么?”或时“如果?那么?否则?”的情况,这种情况便要使用If?Then?或是If?Then?Else?语句来完成。由下面语法可知,若满足条件就执行“Then语句块”,不满足条件n就执行“Else语句块”。其中条件可为关系表达式或多个关系表达式中用逻辑表达式连接的混合表达式,其语法形式如下所示:

If (条件 ) Then [Then 语句块] Else [Else 语句块] End If

2.If?Then?ElseIf语句

设计程序时,若碰到“如果?那么?否则如果?那么?否则”,便需使用If?Then?Elseif?Then?Else?语句来完成。如下面语法,若条件1的结果为True,则执行“Then语句块1”,接着继续执行EndIf后面的语句;若条件1的结果为False,则检查条件2的结果,若为True则执行“ElseIf语句块2”,接着继续执行EndIf后面的语句。一直到所有结果的条件都不满足时,才执行Else后面的“Else语句块”。其语法如下所示: If (条件1) Then [Then语句块1] ElseIf (条件2) Then [ElseIf语句块2] ElseIf (条件3) Then [ElseIf语句块3] ?

ElseIf [ElseIf语句块] Eed If

5.2 Select Case选择语句

程序设计时若碰到多向选择时,当然可使用If?Then?ElseIf或嵌套的

If?Then?Else来完成,但是太多的If会使得程序的复杂度提高,造成不易阅读且难维护;若改用下面的Select Case语句,程序不但看起来简洁而且易维护。如下面语法,若表达式的结果满足value1,则执行“Value1语句块”,再继续执行End Select后面的语句;若表达式的结果不满足value1,满足value2,,则执行“Value2语句块”,依次类推;若都不满足所设置的Case value值,便执行“Value2语句块”Else语句块后,再继续执行End Select后的语句。其语法形式如下:

Select Case 表达式 Case value1 [value1语句块] ?

Case value2

[walue2语句块] End Select

表达式可以为变量、数值或字符串表达式,但要注意Case子句中的value必须和表达式的数据类型一致。 5.3 IIf选择语句

IIf式一个双重选择函数,如下面语法,若表达式的结果为True,则返回V1。否则返回V2。返回值可以为数值、字符串或表达式。IIf函数里面若还有IIF函数就构成嵌套选择结构。其语法形式如下所示: IIf(表达式,V1,V2) 5.4 循环语句

当程序执行时,需要将某个语句块执行多次时,便需要使用“循环结构”。按照循环执行次数确定是否分成For?Next语句(每次执行循环次数确定)和Do?语句(次数由当时条件决定)两大类。 1.For?Next语句

程序设计时,若希望由某个值开始,每执行指定的语句块一次,便将该数值增(减)一值,若结果比终值还小(大),便继续执行该语句块,直到不满足终值才离开该语句块,如重复显示某个数字10次、连续输入数据到数组等都必须使用下面语法来完成:

For counter = start To end [Step Increment] 语句块 [Exit For ] 语句块 Next For

若startend则Step不能省略,且Increment为负值。Start和end参数可以为小数。

2.For Each?Next语句

For Each?Next语句和For?Next功能一样,当满足条件时,会将For?Next间的语句执行一次,直到不能满足条件为止。如下面语法,当group(指对象的集合或数组)内至少有一个元素,就能进入For Each?Next循环。一旦进入循环,便会针对group内的第一个元素来执行语句块一次;若group内有更多元素,则循环内的语句块就会针对每个元素来继续执行。当各元素都执行一次后,循环便结束,继续执行Next语句后面的语句。其语法形式如下所示: For Each element In group 语句块 [Exit For] [语句块]

Next element

其中element为必要项,是一个变量名称,用来在集合或数组的每个元素中重复。Element的数据类型必须是group中元素的数据类型。group为必要项,是一个对象变量,必须引用对象集合或数组statement为一选择项,介于For Each?Nex之间的一行或数行语句,在group内的每个项目发生时执行一次。 3.Do While?Loop语句

设计程序时,当希望条件为True时才进入循环,执行循环内的语句块,直到碰到Loop再回到Do While,检查是否满足条件,若满足条件继续执行循环内的语句块,直到不满足才跳离循环继续执行Loop后面的语句。因此,循环内必须有语句将条件变为False,否则会变成无穷循环而无法跳出。若想中途离开循环可在要离开的地方插入Exit Do即可。 Do While(条件) ?

[Exit Do] ? Loop

4.Do Until?Loop语句

此语句和Do While?Loop语句都属于前测试循环,两者使用上的差异在于,若不满足条件才进入循环时,必须使用Do Until?Loop;若满足条件才进入循环时,才使用Do While?Loop。其语法形式如下: Do Until (条件) 语句块 [Exit Do] 语句块 Loop

5. Do?Loop While语句

程序中使用循环时,若需要第1次进入循环时不必检查是否满足条件,而直接进入循环,第2 次以后才需要检查是否满足条件,当条件条件为True时,才能再进入循环执行,此时便需要使用Do?Loop While语句。因此此种情况,循环至少执行一次,是属于后测试循环。其语法形式如下: Do

语句块 [Exit Do] 语句块

Loop While(条件) 6. Do?Loop Until语句

此语句和Do?LoopUntil语句都属于后测试循环,两者使用上的差异在于,若不满足条件才进入循环时,必须使用Do?Loop Until。若满足条件才进入循环时必须使用Do?Loop While。其语法形式如下: Do

语句块 [Exit Do] 语句块

Loop Until(条件)

在实际应用中,前三种应用会多一些,通过具体多设置,一般都能达到目的。因此,要把前三种掌握好。

第6讲 函数

第6讲 函数

作者:http://hi.http://www.wodefanwen.com//landmao 6.1 函数概述

函数(function)是能完成特定任务的相关语句和表达式的集合。当函数执行完毕时,它会向调用它的语句返回一个值。如果不显示指定函数的返回值类型,就返回缺省的数据类型值。

1.Sub函数

Sub函数是以Sub?End Sub语句封闭起来的程序块。每当该函数被调用时,就会将存放在函数块内的语句执行一次。执行中若碰到End Sub 、Exit Sub或Return便离开函数,回到调用此函数的下一个语句继续望下执行。编写程序时,在模块、对象类模块和结构中定义Sub函数。模块内的Sub函数都默认为Public,表示可以从应用程序任何位置调用此Sub函数。除了Main函数外,其他函数是在被调用才执行。 Sub函数定义的语法如下:

[Private∣Public]Sub函数名称([参数类表]) [程序块] [Exit Sub] End Sub

Sub函数是以Public Sub或Private Sub开头,最后以End Sub结束。当执行到End Sub后即返回紧接再原调用处的下一个语句继续往下执行。若中途要离开函数,可使用Exit Sub语句。

调用Sub函数的语法有下列两种方式: 语法1:Call函数名称([参数列表]) 语法2:函数名称([参数列表])

调用程序与被调用程序之间若无数据传递,参数列表可省略(即不传任何参数);若不省略,参数列表的数目可以是一个或一个以上的参数。

2.Function函数

除系统提供的内置函数外,还提供了日期、时间、字符串等函数,另外还可以使用Function?End Function函数来编写属于自己的Function函数。

Sub函数和Function函数两者都可以做参数传递,但两者使用上的主要差异是Sub函数没有返回值,Function函数则有返回值。有关Function函数的语法如下:

[Public∣Private] Function函数名称([参数列表]) [As数据类型] [语句块]

函数名=表达式 [Exit Function] 或(Return表达式)

End Function

6.2 测试函数

IsNumeric(x) 是否为数字, 返回Boolean结果,True or False IsDate(x) 是否是日期, 返回Boolean结果,True or False IsEmpty(x) 是否为Empty, 返回Boolean结果,True or False IsArray(x) 指出变量是否为一个数组。 IsError(expression) 指出表达式是否为一个错误值

IsNull(expression) 指出表达式是否不包含任何有效数据 (Null)。

IsObject(identifier) 指出标识符是否表示对象变量

6.3 数学函数

Sin(X)、Cos(X)、Tan(X)、Atan(x) 三角函数,单位为弧度 Log(x) 返回x的自然对数 Exp(x)返回 ex Abs(x) 返回绝对值

Int(number)、Fix(number) 都返回参数的整数部分,区别:Int 将 -8.4 转换成 -9,而 Fix 将-8.4 转换成 -8

Sgn(number) 返回一个 Variant (Integer),指出参数的正负号 Sqr(number) 返回一个 Double,指定参数的平方根

VarType(varname) 返回一个 Integer,指出变量的子类型 Rnd(x)返回0-1之间的单精度数据,x为随机种子

6.4 字符串函数

Trim(string) 去掉string左右两端空白 Ltrim(string) 去掉string左端空白 Rtrim(string) 去掉string右端空白 Len(string) 计算string长度

Left(string, x) 取string左段x个字符组成的字符串 Right(string, x) 取string右段x个字符组成的字符串

Mid(string, start,x) 取string从start位开始的x个字符组成的字符串

Ucase(string) 转换为大写 Lcase(string) 转换为小写

Space(x) 返回x个空白的字符串

Asc(string) 返回一个 integer,代表字符串中首字母的字符代码

Chr(charcode) 返回 string,其中包含有与指定的字符代码相关的字符

6.5 转换函数

CBool(expression) 转换为Boolean型 CByte(expression) 转换为Byte型 CCur(expression) 转换为Currency型 CDate(expression) 转换为Date型

CDbl(expression) 转换为Double型 CDec(expression) 转换为Decemal型 CInt(expression) 转换为Integer型 CLng(expression) 转换为Long型 CSng(expression) 转换为Single型 CStr(expression) 转换为String型 CVar(expression) 转换为Variant型 Val(string) 转换为数据型 Str(number) 转换为String 6.6 日期函数

日期函数 名 称 说 明

IsDate 语法:IsDate(表达式);功能:若该表达式为日期类型变量时,返回True;否则返回False。范例:check=IsDate(“2/21/1969”) ?返回True;check=IsDate(”Hello”)?返回False Today 语法:Today;功能:设置或返回目前系统的日期 Now 语法:Now;功能:返回目前系统的日期与时间 Year 语法:Year(datetime);功能:返回公元年。范例:n=Year(”2/12/1999”) ?n=1999 Month 语法:Month(datetime);功能:返回1~12月份。范例n=Month(“5/12/1969”) ?n=5 Day 语法:Day(datetime);功能:返回日期。范例:n= Microsoft.VisualBasic.Day(“2/21/1969”) ?n=21 MonthName 语法:MonthName(月份);功能:返回相对应的月份名称。范例:str= MonthName(3) ?str=三月

WeekDay 语法:WeekDay(datetime);功能:返回星期几,其值为1~7。若返回1,表示星期日;返回2表示星期一……依次类推。范例:n=Weekday(”3/14/2003”) ?n=6 表示这天为星期五

WeekdayName 语法:WeekdayName(n);功能:返回一星期中的第几天。n为1则返回星期日;n为2返回星期一……依次类推。范例:str=WeekdayName(5) ?str=星期四

第7讲 操作工作簿

作者:http://hi.http://www.wodefanwen.com//landmao

Workbooks是workbook的集合,通过workbooks可以对工作簿进行有关对建立、打开、关闭等等操作。

1.新建工作簿

Add方法创建一个新的工作簿,并添加到Workbooks集合中,新工作簿成为活动工作簿。

Workbooks.Add 举例:

Workbooks.Add

Activeworkbook.saveas \

作用:新建一个工作簿,并保存在E:盘上,文件名为book3.xls。 举例:

Workbooks.Add

Thisworkbook.saveas \

作用:新建一个工作簿,并保存在E:盘上,文件名为book4.xls。 2.打开工作簿

该方法打开一个已存在的工作簿,其语法稍微有点复杂:

Workbooks.Open(FileName,UpdateLinks,ReadOnly,Format,Password, _WriteResPassWord,IgnoreReadOnlyRecommended,Origin,Delimiter, _Editable,Notify,Converter,AddToMRU)

在这些参数中,大多数参数很少用到(例如,几个与打开文本文件有关的参数)。所有的参数中,除了FileName外都是可选的。

参数FileName是所要打开的工作簿的文件名称。如果想要以只读的方式打开工作簿,则可将ReadOnly参数设置为True。

如果需要用密码来打开工作簿,则PassWord参数应该设置为该密码。如果需要使用密码而您没有指定密码,Excel将弹出对话框询问密码。

参数AddToMru指定将工作簿添加到最近使用的文件列表中,该参数值设置为True便添加该工作簿到最近使用的文件列表中,该参数的缺省值为False。

举例:

workbooks.Open (\作用:打开e:book3.xls工作簿文件。 举例:

workbooks.Open FileName:=\作用与上相同。 举例:

workbooks.Open FileName:=\举例:

workbooks.Open FileName:=\增加了打开的密码。 3.激活工作簿

要激活工作簿,就使用activate方法,工作簿激活后,它将放在活动窗口中。

Workbooks(工作簿名称).activate 举例:

Workbooks(1).activate 作用:激活第一个工作簿。 4.保存工作簿 保存指定工作簿:

Workbooks(\工作簿名称\保存当前工作簿: activeWorkbook.save 5.关闭工作簿

Close方法关闭所有打开的工作簿。其语法为: 关闭所有的工作簿: Workbooks.Close 关闭指定的工作簿:

Workbooks(\工作簿名称\

第8讲 操作工作表

作者:http://hi.http://www.wodefanwen.com//landmao

8.1 建立工作表

插入一个工作表:Sheets.Add

在指定工作表前插入工作表:

Sheets.Add Before:=Sheets(工作表名称或工作表序号) 举例:

Sheets.Add Before:=Sheets(“Sheet3”) Sheets.Add Before:=Sheets(3) 在指定工作表后插入工作表:

Sheets.Add Before:=Sheets(工作表名称或工作表序号) 举例:

Sheets.Add After:=Sheets(“Sheet3”) Sheets.Add After:=Sheets(3) 在最后插入工作表:

Sheets.Add After:=Sheets(Sheets.Count) 在最前插入工作表:

Sheets.Add Before:=Sheets(1) 插入2个空白工作表: Sheets.Add Count:=2

这里利用自变量Count来控制插入工作表的数量。 检查工作表”Sheet2”是否存在: Private Sub检查工作表是否存在() Dim iCount As Integer

For iCount = 1 To Sheets.Count

If Sheets(iCount).Name = \ MsgBox \已经存在\ Exit Sub End If Next iCount

End Sub

8.2 选取工作表

选取指定工作表:

Sheets(工作表名称或工作表序号).Select 举例:

Sheets(“Sheet2”).Select Sheets(2).Select 设置活动工作表:

Sheets(工作表名称或工作表序号).Activate 举例:

Sheets(\Sheets(2). Select

8.3 隐藏工作表

隐藏一个工作表:

Sheets(工作表名称或工作表序号).Visible=0 举例:

Sheets(“Sheet2”).Visible=0 Sheets(2) .Visible=0 取消隐藏一个工作表:

Sheets(工作表名称或工作表序号).Visible=-1 举例:

Sheets(“Sheet2”).Visible=-1 Sheets(2) .Visible=-1

8.4 复制和移动工作表

1.复制

复制到指定工作表之前:

Sheets(工作表名称或工作表序号).Copy Befor:=Sheets(工作表名称或工作表序号) 复制到指定工作表之后:

Sheets(工作表名称或工作表序号).Copy After:=Sheets(工作表名称或工作表序号) 2.移动

移动到指定工作表之前:

Sheets(工作表名称或工作表序号).Move Befor:=Sheets(工作表名称或工作表序号) 移动到指定工作表之后:

Sheets(工作表名称或工作表序号).Move After:=Sheets(工作表名称或工作表序号)

8.5 删除工作表

删除指定工作表:Sheets(工作表名称或工作表序号).Delete

Sheets(”Sheet2”).Delete Sheets(2).Delete 根据条件删除工作表

删除工作表名左边两位字符等”gz”的工作表 Private Sub 删除满足条件工作表 Dim I as integer

For i = .Sheets.Count To 1 Step -1 With .Sheets(i)

If Left(.NAME, 2)=\ .Delete End If End With Next i End Sub

8.6 工作表命名

修改指定工作表名称:Sheets(工作表名称或工作表序号).Name=工作表名称 把工作表Sheet2命名为GZSheet

Sheets(”Sheet2”).Name=”GZSheet” Sheets(2).Name=”GZSheet”

注意:工作表的名称在一个工作中必须是唯一的,且不区分大小写和全半角的。也就是说在工作簿中把名称“SHEET2” ,”sheet2”看成是相同的名称。

8.7 工作表的保护

1.工作表的保护

Sheets(工作表名称或工作表序号).Protect password:=密码 2.解除工作表的保护

Sheets(工作表名称或工作表序号).Unprotect password:=密码

【转】 EXCEL VBA应用教程----第9讲 操作单元格

第9讲 操作单元格

作者:http://hi.http://www.wodefanwen.com//landmao 9.1 选取全部单元格 Cells.select

9.2 选取单元格 1.Range

Range表示单个单元格:Range(列标 & 行标) 举例:

选取A1单元格。 Range(\) Range(\

Range(“A1”).Select

2. Cells

Cells表示单个单元格:Cells(行号,列号) Cells(1,1)

Cells(1,1).Select

3. Sheets

某个工作表的单元格

Sheets(工作表名).Range(单元格地址) 某个工作簿的某个工作表的单元格

4. Workbooks

Workbooks(工作簿名). Sheets(工作表名).Range(单元格地址) 9.3 选取单元格区域 1.选取连续单元格区域 选取A1:G10

Range(\

Range(Cells(1,1),Cells(10,4)).Select 2.选取不连续的单元格区域 选取A1和B2:F4和G2:H3

Range(\9.4 选取行 1.选取单行 选取第五行

Range(\Rows(\Rows(5).Select

2.选取连续多行 选取第2行到第8行

Range(“2:8”).Select Rows(“2:8”).Select 选取不连续的多行

选取第5行,第8~9行,第12~18行 Range(“5:5,8:9,12:18”).Select

9.5 选取列 1.选取单行 选取第C列

Range(“C:C”).Select Columns(“C:C”).Select Columns (3).Select

2.选取连续多列 选取第C列到第H列 Range(“C:H”).Select Columns (“C:H”).Select 3.选取不连续的多列

选取第C列,第E:G列,第J列 Range(“C:C,E:G,J:J”).Select 9.6 设置单元格内容

语法:单元格.Value=常量 给A1:A10赋值

Range(“A1:A10”).Value=”MAO” For I=1 To 10

Cells(I,1)=I Next I

9.7 设置单元格的计算公式 设置F3单元的公式:

Range(“F3”).formula=”=B3*D3” 9.8 清除单元格信息 1.清除单元格信息 清除F3单元的信息: Range(“F3”).clear

可以清除单元格的格式、内容及批注。 2.清除单元格格式

Range(“A1”).Clearformats 3.清除单元格的内容

Range(“A1”).ClearContents 4.清除单元格批注

Range(“A1”).Clearcomments

9.9 设置单元格区域格式 Selection对象 Selection是全局对象,每进行Cells或Range的Select方法就会改变Selection对象

Cells(1,1).Select,Selection对象区域就是A1

Range(\,Select对象区域就是A1:F10

对单元格区域的格式设置,往往通过Selection设置 设置A1:F10的字体为黑体

Range(\

Selection.Font.NAME = \黑体\

设置边框Selection.Borders([边框类型])

如果设置边框的区域是1行,则Borders(xlInsideVertical)的设置会出错,

如果设置边框的区域是1列,则Borders(xlInsideHorizontal)的设置会出错。 一般用一下方法设置边框避免出错:

Selection.Borders.LineStyle = xlContinuous Selection.Borders.Weight = xlThin

Selection.Borders.ColorIndex = xlAutomatic 9.10 行列的插入和隐藏 1.行列插入

Rows(5).Insert

在第五行前插入一行。 Columns(6).Insert 在第六列前插入一列。 2.行列隐藏 隐藏:

Rows(5).Hidden=Trun

Columns(6). Hidden=Trun 取消隐藏:

Rows(5).Hidden=False

Columns(6). Hidden= False 9.11 单元格查找

<单元格区域>.Find (What,[After],[LookIn],[LookAt],[SearchOrder],[SearchDirection],[MatchCase],[MatchByte],[SearchFormat]) 参数说明:

(1)<单元格区域>,必须指定,返回一个Range对象。

(2)参数What,必需指定。代表所要查找的数据,可以为字符串、整数或者其它任何数据类型的数据。对应于“查找与替换”对话框中,“查找内容”文本框中的内容。

(3)参数After,可选。指定开始查找的位置,即从该位置所在的单元格之后向后或之前向前开始查找(也就是说,开始时不查找该位置所在的单元格,直到Find方法绕回到该单元格时,才对其内容进行查找)。所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之后开始进行查找。

(4)参数LookIn,可选。指定查找的范围类型,可以为以下常量之一:xlValues、xlFormulas或者xlComments,默认值为xlFormulas。对应于“查找与替换”对话框中,“查找范围”下拉框中的选项。

(5)参数LookAt,可选。可以为以下常量之一:XlWhole或者xlPart,用来指定所查找的数据是与单元格内容完全匹配还是部分匹配,默认值为xlPart。对应于“查找与替换”对话框中,“单元格匹配”复选框。

(6)参数SearchOrder,可选。用来确定如何在单元格区域中进行查找,是以行的方式(xlByRows)查找,还是以列的方式(xlByColumns)查找,默认值为xlByRows。对应于“查找与替换”对话框中,“搜索”下拉框中的选项。

(7)参数SearchDirection,可选。用来确定查找的方向,即是向前查找(XlPrevious)还是向后查找(xlNext),默认的是向后查找。

(8)参数MatchCase,可选。若该参数值为True,则在查找时区分大小写。默认值为False。对应于“查找与替换”对话框中,“区分大小写”复选框。

(9)参数MatchByter,可选。即是否区分全角或半角,在选择或安装了双字节语言时使用。若该参数为True,则双字节字符仅与双字节字符相匹配;若该参数为False,则双字节字符可匹配与其相同的单字节字符。对应于“查找与替换”对话框中,“区分全角/半角”复选框。

(10)参数SearchFormat,可选,指定一个确切类型的查找格式。对应于“查找与替换”对话框中,“格式”按钮。当设置带有相应格式的查找时,该参数值为True。

(11)在每次使用Find方法后,参数LookIn、LookAt、SearchOrder、MatchByte的设置将保存。如果下次使用本方法时,不改变或指定这些参数的值,那么该方法将使用保存的值。

在VBA中设置的这些参数将更改“查找与替换”对话框中的设置;同理,更改“查找与替换”对话框中的设置,也将同时更改已保存的值。也就是说,在编写好一段代码后,若在代码中未指定上述参数,可能在初期运行时能满足要求,但若用户在“查找与替换”对话框中更改了这些参数,它们将同时反映到程序代码中,当再次运行代码时,运行结果可能会产生差异或错误。若要避免这个问题,在每次使用时应设置这些参数。

举例:

Range(\何菲菲\

作用:查找“何菲菲”所在的行的行号。 第10讲 VBA程序设计(一)。。。。于 AUSTRALIA

10.1 案例

设计的VBA程序它是存放在EXCEL的工作簿中。 案例:

工作簿名称:工资数据

一个人在单位中,有一个固定的编号,这个编号不随部门的换而变化。人员在部门的变动可以通过序号完成。序号起两个作用,第一位是部门号,第二和第三位是顺序号。通过这个顺序号,就能够达到划分部门和人员在部门内的排序。

第10讲 VBA程序设计 10.1 案例

设计的VBA程序它是存放在EXCEL的工作簿中。 案例:

工作簿名称:工资数据

一个人在单位中,有一个固定的编号,这个编号不随部门的换而变化。人员在部门的变动可以通过序号完成。序号起两个作用,第一位是部门号,第二和第三位是顺序号。通过这个顺序号,就能够达到划分部门和人员在部门内的排序。

10.2 过程程序

1.创建过程

Sub 过程是一系列由 Sub 和 End Sub 语句所包含起来的 Visual Basic 语句,它们会执行动作却不能返回一个值。Sub 过程可有参数,例如常数、变量、或是表达式等来调用它。如果一个 Sub 过程没有参数,则它的 Sub 语句必须包含一个空的圆括号。

创建一个过程需要两个基本步骤。首先,需要向工作簿中添加一个模块。接着需要向模块中添加一个工程。对于创建的每一个应用程序,只需添加一次模块。可以使用多个模块,但这是不必要的。某些开发者喜欢使用多个模块,以便根据他们的目的或者窗体对过程进行组织。

下面举例创建一个过程,它显示一个消息框。

(1)打开一个新工作簿。

(2)选择\工具\宏\编辑器\,打开VBA编辑器窗口。

(3)在`VBA编辑器的左面,可以看到“工程资源管理器”窗口。在工程资源管理器窗口的“Thisworkbook\上单击鼠标右键,选择“插入”-“模块”,这样就将一个模块添加到应用程序中了。(如果你没有看见“工程资源管理器”窗口,可以按Ctrl+R)。

(4)选择“插入”“过程”,显示“添加过程”对话框。

(5)输入“第一个程序”作为过程名字。在“类型”分组框中,确认选择了“子程序”。单击“确定”按钮。这样一个新的过程就添加到模块中了。可以在模块中看到以 Public Sub 第一个过程()开始,以End Sub结束的语句结构。

VBA对子程序和函数有如下的命名规则:

名字中可以包含字母数字和下划线。

名字中不能包含空格句号惊叹号,也不能包含字符@ & $ #. 名字最多可以包含255个字符。 (6)在过程中插入光标,输入以下语句并回车:

在输入Msgbox后,会自动弹出一个消息框告诉你有关这条命令的信息,称之为自动列表技术。

Public Sub 第一个程序() MsgBox \程序\End Sub

对Msgbox的进一步说明:

语法:MsgBox(prompt[, buttons] [, title] [, helpfile, context])

在 MsgBox 函数的语法中,括号内的参数是此函数的命名参数。方括号所包含的参数是选择性的。在 MsgBox 函数中,唯一必须提供的参数(prompt)是做为提示的文本。 在代码中可以利用位置或名称来指定函数与方法的参数。若利用位置来指定参数,则必须根据语法中的顺序,利用逗号来分隔每一个参数,例如: MsgBox \回答正确!\提示\

若以名称来指定参数,则须使用参数名称或跟着冒号与等号(:=),最后再加上参数值。可以任何的顺序来指定命名参数,例如: MsgBox Title:=\提示\回答正确\

函数以及某些方法的语法会利用圆括号将参数封闭起来。这些函数和方法会返回值,所以必须用圆括号将参数封闭起来,才可以赋值给变量。如果忽略返回值或是没有传递所有的参数,则可以不用圆括号。方法若不返回值,则不用将参数用圆括号封闭起来。

第10讲 VBA程序设计(二) 2.运行过程

创建过程后,可以通过几种方式运行。可以直接使用“运行”菜单,“运行子程序/用户窗体”工具栏按钮或按下F5键。

按F5后,选择要运行的过程: 运行结果:

3.保存对模块所做的改变

要保存新过程,需要保存过程所驻留的工作簿。可以用VBA编辑器保存工作簿。具体步骤如下:

选择\文件\保存\。则工作簿和模块与过程都保存下来了。 10.3 变量的应用

1.用Dim语句声明变量

声明变量可以使用Dim语句,基本语法如下: Dim 变量名 AS 数据类型

条语法中的变量名代表将要声明的变量名。对变量的命名规则和对过程的命名规则相同。

变量名必须以字母开始,并且只能包含字母数字和特定的特殊字符,不能包含空格、句号惊叹号,也不能包含字符@ & $ #。名字最大长度为255个字符 举例:输入一个信息,然后显示出来。具体步骤如下: (1)创建一个名为\显示信息\的子程序。 (2)输入以下代码: Public Sub 显示信息() Dim M_msg As String

M_msg = InputBox(\请输入信息:\ MsgBox \你输入的信息是:\

End Sub

(3)按下F5键运行过程。

4)输入“会计电算化”后按回车键(输入其他内容也可),会显示一个消息框。

在Dim语句中如果如果没有数据类型,变量将被定义为Variant类型,因为VBA中默认的数据类型是Variant。Variant数据类型占用存储空间较大,而且它将影响程序的性能,因此应当在程序中确定变量的类型。 2. 作用域

变量可以在两个地方定义常量和变量:过程中定义和在模块顶部一个名为\通用声明\的区域内定义。而且定义的位置就决定了作用域。

在过程中声明,该变量只能在该过程中使用,其他过程中不能使用这个变量和常量,这种变量为局部变量或过程级变量。在模块顶部声明的变量称为模块级变量,该变量在该模块的所有过程中都可以使用。

公共级变量可以在应用程序的任何过程中使用,不论过程和变量是否定义在一个模块。这就使得公共级变量在使用中十分灵活,但是公共级变量在程序运行时一直保留在内存中,这样就占用了系统资源。要创建公共级变量,可以用Public语句,具体语法如下: Public variablename As datatype 要创建公共级常量,具体语法如下: Public const CONSTANAME datatype = value

公共级变量或常量必须在模块顶部的“通用声明”区域中定义。

举例:

Public M_dm As Characters Public M_name As Characters

3. 声明数组

数组的声明方式和其他的变量是一样的,它可以使用 Dim、 Static、Private 或 Public 语句来声明。标量变量(非数组)与数组变量的不同在于通常必须指定数组的大小。若数组的大小被指定的话,则它是个固定大小数组。若程序运行时数组的大小可以被改变,则它是个动态数组。

数组是否从 0 或 1 索引是根据 Option Base 语句的设置。如果 Option Base 没有指定为1,则数组索引从0 开始。 (1)声明固定大小的数组

下面这行代码声明了一个固定大小的数组,它是个 21 行乘以 21 列的Integer 数组: Dim M_Array(20, 20) As Integer

第一个参数代表的是行;而第二个参数代表的是列。

与其他变量的声明一样,除非指定一个数据类型给数组,否则声明数组中元素的数据类型为 Variant。数组中每个数组的数字型 Variant 元素占用 16 个字节,每个字符串型 Variant 元素占用 22 个字节。 (2)声明动态数组 若声明为动态数组,则可以在执行代码时改变数组大小。可以利用 Static、Dim、Private 或 Public 语句来声明数组,并使括号内为空,如下示例所示。 Dim M_Array() As Single

可以在过程中使用 ReDim 语句来做隐含性的数组声明。

对于过程中的数组范围,可以使用 ReDim 语句去改变它的维数。然而当执行这个命令时,数组中存在的值会丢失。若要保存数组中原先的值,则可以使用 ReDim Preserve 语句来扩充数组。例如,下列的语句将 XArray 数组扩充了5 个元素,而原本数组中的当前值并没有消失掉。

ReDim Preserve XArray(UBound(XArray) + 5) 10.4 控件的应用 1.向工作表添加控件

用EXCEL设计界面时,要将控件添加到工作表上,可以按以下步骤操作:

(1)选择工具下的“自定义”,显示\窗体\工具栏。 (2)选择\标签\控件。

(3)将鼠标定位到某单元格,此时鼠标变成小十字。 (4)按下左键,拖动鼠标,确定控件的大小,放开鼠标左键。

(5)在“标签1”上单击右键,选择\编辑文字\现在可以输入文字。完成后,单击任何单元格退出文字编辑。

(6)通过以上步骤可以添加其它所需要的控件到工作表中。 2.设置控件的特性

每个控件都有一系列的特性,需要进行设置来满足不同的需要。设置控件的特性,可以在该控件上按右键完成。 3.给控件命名

当创建一个控件时,EXCEL会自动给它指定一个默认的名字,但不便于理解和记忆。更改控件的名字,先选中某个控件,再在位于公式栏上的\名字\编辑框输入控件名字。这样就给控件更改了名字。 4.使用用户窗体

要创建功能复杂的应用程序,并且方便用户输入数据,那么应该使用用户窗体。用户窗体可以作为程序的对话框和窗口。向用户窗体添加控件基本类似于向工作表添加控件,然而第一步要创建一个用户窗体。这可以通过VBA编辑器实现。具体按以下步骤操作: (1)打开工作簿,选择\工具\宏\编辑器\打开VBA编辑器。

(2)在VBA编辑器中选择工具栏上的\插入用户窗体\按钮或者选择\插入\菜单,从下拉菜单中选择\用户窗体\。

在VBA编辑器中出现一个名为\的窗体,\控件工具箱\同时出现,在其中有部分新的控件。 这些新的控件是:

①切换按钮:该控件如果被选中,那么会保持被按下的状态。如果再次单击它就恢复为没有按下的状态。EXCEL工具栏中有几个这样的按钮,例如:\全屏显示\加粗\下划线\以及\窗体\工具栏中的\切换网格\等。

②选项卡条(TabStrip):它是包含多个选项卡的控件。通常用来对相关的信息进行组织或分类。例如:用选项卡条来显示各个地区的销售信息,可以给每个地区设置一个选项卡。在默认时,选项卡包含两页,分别叫做TAB1和TAB2,可以添加更多的选项卡。

③多页:外观类似选项卡条,是包含一页或多页的控件。选项卡条给人相似的外观,而多页控件的各页包含各自不同的控件,有各自不同的布局。多页的例子很多,例如:\设置控件格式\对话框和\工具\菜单中的\选项\对话框。以及\格式\菜单中的\单元格...\对话框。

④图像控件:它允许向窗体上放置图片。图片格式须为 :*.bmp,*.cur,*.gif,*.ico,*.jpg,*.wmf。

⑤RefEdit:它外观象文本框,通过这个控件可以将用户窗体折叠起来,以便选择单元格区域。

在用户窗体设计过程中可以对其进行预览,方法是在VBA编辑器中选择该窗体,单击“运行”菜单中的三角符号“运行子过程/用户窗体”,运行窗体的另一种方法是按F5键。

第10讲 VBA程序设计(三) 10.5 EXCEL VBA 代码结构

1.对象、属性和方法

(1)面向对象概述 ①面向对象方法的产生 在面向对象的方法之前,程序设计所采用的是面向过程的方法。面向过程的程序设计的一般思路是:自顶向下,逐步求精;把程序结构按功能分成若干个基本的模块,这些模块之间尽量相对独立,功能尽可能单一,每一个模块都是由顺序、选择和循环三种结构组成,模块化的方法的具体实现是使用子程序。

由于这种结构化的程序设计的方法使用了模块分解的方法,有效地把一个复杂的程序抽象成一些简单的易于控制和处理的子程序,使设计便于管理和维护。

由于用户图形界面的广泛使用,软件的规模也越来越大,要求也越来越高,使软件的开发越来越困难。为了适应软件开发的发展,在80年代中期提出了面向对象的概念。面向对象的方法的中心思想是:像真实的世界由真实的物体组成一样,软件的程序设计也可看成由一系列单独的对象组成,每一个对象都有自已的特定的特征和行为。软件开发从本质上讲,就是对软件所要处理的问题做出正确的认识,并把这种认识表述出来。

所谓面向对象的方法,就是将数据和对数据的操作放在一起,组成一个相互依存、不可分开的整体——对象。

面向对象的程序设计方法之所以能受到如此广泛的欢迎,其中的一个很重要的原因就是可以使软件设计者通过可执行代码的共享使程序创建更容易。不用为每一个方法保留一个单独的拷贝,相同的VBA对象类型能够共享它们的方法的代码。

②对象

一个对象可以是一个真实存在的物体,也可以是一个抽象的事件,但不管它是真实物体也好,抽象事件也好,它总是可以用静态特征和动态特征来描述。所谓静态特征,就是物体的颜色、大小等可以用某种具体的数据来描述的特征;所谓动态特征,就是物体所能表现出来的行为和所具有的功能等特征。

与真实物体类似,在程序设计中所用到的对象的概念,也可以由静态特征和动态特征来表现。在这里静态特征称为属性,动态特征称为方法。这些属性和方法在一起就定义了一个对象。对象是系统中用来描述事物的一个基本单位。

面向对象的程序设计方法将数据和程序封装到封闭的对象中,这样就使设计、组织和使用这些复杂的数据结构和由那些数据所完成的功能变得很简单。软件应用程序中的每一个对象都包含了程序代码和数据,并合成了一个简单的项。大部分应用程序中都包含了很多种不同类型的对象。

VBA中提供了访问其它应用程序和其它应用程序中的对象的方法。要使VBA获得对主应用程序的过程的控制,就要用VBA代码操纵主应用程序中的对象。使用类模块,甚至可以创建自已的对象。

例如,在Excel中,工作簿、工作表、数据区域、图表、图形、工具栏、菜单等都是对象。通过对这些对象的使用就可以实现对Excel的操作。

③属性

属性就是对象的静态特征。例如,一个人,要描述他,总是通过如高矮、胖瘦、美丑等一系列特征来进行。所有这些特征就可以认为是对象的属性。

属性决定了一个对象的外观和行为,要改变一个对象的外观和行为,可以直接通过改变对象的属性来实现。要改变一个Excel对象的外观和行为,可以通过对属性的赋值来实现。我们要想让工作表变得好看一些,就可以改变它的颜色属性,要想让字体变大一些,就可以改变它的Font属性。

通过属性不仅能改变对象的行为,还能查看对象当前的状态。例如要想知道工作表的名称,可以直接访问它的Name属性,要想知道工作簿的存储路径、文件夹和名称,则可以访问它的FullName属性。

对象都有属性,用来描述或设置对象的特征。可以使用VBA来设置对象的属性,也可以对一个对象的某些属性进行修改,从而定义该对象,还可以引用某对象的属性值。使用属性时,应将对象和属性组合在一起,中间用句点分隔。 语法:<对象>.<属性> <参数> 说明:设置或引用某对象的属性。若该属性带有参数或需要为带参数的属性指定参数时,则指定参数以进一步描述该对象;若该参数返回值,则应在参数两边加上括号。 语法:<变量>=<对象>.<属性>

说明:将某对象的属性值赋值给一个变量,以便于在程序中使用。

例如,Range对象有一个Value属性,可以用VBA代码引用该对象的属性值,也可以修改该属性

④方法

现实的物体几乎都有一些内在的行为和功能。例如,人可以从事工作、消费,汽车可以用来运输,房子可以用来住,等等。方法可以改变对象的属性值,方法也可以对储存在对象中的数据实施某些操作。方法很象VBA编程中的过程,但它属于某个对象,必须通过特定的对象才能访问方法。

虽然相同类型的对象能够共享它们的方法代码,但是当用户访问某个特定的对象时,该方法只能作用于调用该方法的对象。

对象都有方法,一个方法就是在对象上执行的某个动作。为对象指定方法时,应将对象和方法组合在一起,中间用句点分隔。 语法:<对象>.<方法> <参数>

说明:为某对象指定方法。若该方法带有参数或需要为带参数的方法指定参数时,则指定参数以执行进一步的动作;若该参数返回值,则应在参数两边加上括号。

⑤类

面向对象方法中的类,是具有相同的属性和方法的一组对象的集合。它为属于该类的全部对象提供了抽象的描述,其内部包括属性和方法两个主要部分。类与对象的关系犹如模具与铸件的关系一样。一个属于某个类的对象称为该类的一个实例。

实际上整个VBA的对象体现是一个分层结构。对象分层结构的概念意味着对象可以包含其它对象,而其它对象又可以包含别的对象。这种“包含”是通过一种名叫“集合”的特殊类型的对象来实现的。集合对象的唯一目的是用来包含其它对象。被给定集合所包含的对象都是同一类型的。

(2)对象的引用

既然已经有了对象的定义,我们就可以使用这些已有的对象来完成一些实际的任务。但是,在使用对象之前,必须要作的事情是:要让Excel知道现在用的是一个对象,而且需要明确这个对象是属于哪一个类,这个对象具体值是什么。

使用对象首先要定义:这是一个属于某个类的对象,然后再给它赋一个具体的值。 给对象变量赋值的语句和给普通变量赋值的语句不同。给普通变量赋值的语句只要直接用一个等号就可以了,而给一个对象变量赋值则需要用到Set关键字。

Excel的对象模型是通过层次结构很有逻辑地组织在一起的,一个对象可以是其它对象的容器,可以包含其它的对象,而这些对象又包含其它的对象。位于顶层的是Application对象,也就是Excel应用程序本身,它包含Excel中的其它的对象,如Workbook对象;一个Workbook对象包含其它一些对象,如Worksheet对象;而一个Worksheet对象又可以包含其它对象,如Range对象,等等。这就是Excel的对象模型。

例如,Range对象在Excel对象模型中的位置为: Application对象 Workbook对象

Worksheet对象 Range对象

知道了某对象在对象模型层次结构中的位置,就可以用VBA代码方便地引用该对象,从而对该对象进行操作,并以特定的方式组织这些对象,使Excel能根据您的需要自动化地完成工作任务。因此,要熟练掌握Excel VBA编程,必须理解Excel的对象模型。

(3)使用对象

使用VBA可以处理某个对象的整个集合,或者某集合中的一个单独的对象。 语法:集合(“对象名”) 或 集合(对象索引号)

说明:引用集合中的某个对象,即对象名或对象索引号所代表的对象。

例如,Worksheets(“Sheet1”)引用集合Worksheets中的工作表Sheet1;若Sheet1是集合中的第一个工作表对象,还可以写为Worksheets(1)。

特别地,“Sheets”集合由工作簿中的所有工作表(包括图表工作表)组成。若要引用工作簿中的第一个工作表,可采用语句Sheets(1)表示。

通过点运算引用某对象的成员

我们可以用句点连接对象名来限定是对某个对象成员的引用,同时也指定了该对象成员在对象层次结构中的位置。

语法:<对象名>.<对象名>. …

说明:后一对象是前一对象的成员,限定了对前一对象所包含的对象成员的引用。

设置对象变量

对象变量是代表一个完整对象的变量,如工作表或单元格区域。用Dim或Public语句来声明对象变量。

语法:Dim(或Public) <变量名> AS <对象名> 说明:将<变量名>声明为一个<对象名>对象。

一般可将对象名直接设为Object,即任意对象。但如果您知道变量将作用到的对象的话,最好将其设置为具体的对象。

例如,语句:Dim Data As Range,将变量Data声明为一个Range对象。 在将变量声明为一个对象变量后,用Set语句将某对象赋值给该变量。 语法:Dim(或Public) <变量名> AS <对象名> Set <变量名>=<某对象>

说明:将<变量名>声明为一个<对象名>对象,再将某对象赋值给该变量。 第10讲 VBA程序设计(四)

2.对象处理常用语句

要使用VBA有效地处理Excel对象模型,则需要经常使用With?End With语句和For Each?Next语句,它们可以简化对对象和集合的处理。 (1)With ? End With语句

With ? End With语句可以对某个对象执行一系列的操作,而不必重复指出该对象的名称。其语法为: With <对象> [语句代码] End With

其中:<对象>表示With语句要执行操作的具体对象,[语句代码]为对某对象执行操作的一条或多条语句,前面以点运算符开头。

考虑下面的程序,该程序对当前工作簿中的工作表Sheet1上的单元格区域A1:F20进行操作,设置该区域的字体样式、字体大小、下划线、以及字体颜色等属性。 Sub 格式A()

Worksheets(“Sheet1”).Range(\ Worksheets(“Sheet1”).Range(\= \Italic\

Worksheets(“Sheet1”).Range(\ Worksheets(“Sheet1”).Range(\xlUnderlineStyleSingle

Worksheets(“Sheet1”).Range(\ End Sub

该过程可以使用With?End With语句来重新编写,如下面的程序执行与上面程序完全一样的操作: Sub 格式B()

With Worksheets(“Sheet1”).Range(\ .Name = \

.FontStyle = \ .Size = 10

.Underline = xlUnderlineStyleSingle .ColorIndex = 3 End With End Sub

使用With语句,不仅能避免您反复输入相同的代码,使您的程序代码更简洁,也能使程序运行得更快。 (2)For Each ? Next 语句

For Each?Next语句遍历集合或数组中的每个元素,重复执行语句中的代码。其语法为:

For Each <元素> In <集合/数组> [语句代码] [Exit For] [语句代码] Next [元素]

其中,<元素>为必需的参数,表示用来遍历集合或数组中所有元素的变量;<集合/数组>表示对象的集合或数组的名称;[语句代码]为可选参数,为对集合或数组中每一元素执行操作的代码;[Exit For]语句为中途退出循环;Next后的[元素]可省略。

当集合或数组中至少存在一个元素时,应会进入For Each?Next语句。首先针对集合或数组中的第一个元素执行For Each?Next语句中的代码,然后针对第二个元素执行语句代码,当集合或数组中的所有元素都执行完毕后,便会退出循环。如果在循环中的语句代码放置Exit For语句,执行到此语句时,便会退出循环;Exit For语句通常放在条件判断语句中。

可以将一个For Each?Next语句放在另一个For Each?Next语句中组成嵌套的循环。在每个For Each?Next语句中的<元素>变量应该不同。

下面的程序显示当前工作簿中所有工作表的名字,用MsgBox函数显示。如果当前工作簿中有3个工作表,则循环3次,相应地3次调用MsgBox函数。 Sub 工作表名称()

Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets MsgBox ws.Name Next ws End Sub

下面的程序需要选在工作表中选择某单元格区域后,再运行代码。程序将在所选单元格区域单元格中循环,并将每个单元格的值使用VBA的UCase函数转换成大写字母。

Sub 转换为大写字母() Dim Cell As Range

For Each Cell In Selection Cell.Value = UCase(Cell.Value) Next Cell End Sub

3、控制程序流程语句 (1) GoTo语句

该语句将执行的程序转到指定的标签所在的语句指令,但不能转移到过程之外的指令。例如,在进行错误捕捉时,发生错误后,程序转移至标签所在处执行。 (2) Select Case语句

当需要作出三种或三种以上的条件判断时,最后使用Select Case语句。其基本语法为:

Select Case <测试表达式> [Case 条件表达式1] [指令]

[Case 条件表达式2] [指令] ?? [Case Else] [指令] End Select

当某个条件表达式与测试表达式相匹配时,则执行其后的指令,否则执行Else(如果有的话)后的指令,然后结束Select Case块的执行。 (3)错误转移语句

忽略所有的错误: ON ERROR RESUME NEXT 遇错跳转:

on error goto err_handle '中间的其他代码 err_handle: ' 标签 '跳转后的代码 4.函数的使用

Function 过程是一系列由 Function 和 End Function 语句所包含起来的语句。Function 过程和 Sub 过程很类似,但函数可以返回一个值。Function 过程可经由调用者过程通过传递参数,例如常数、变量、或是表达式等来调用它。如果一个 Function 过程没有参数,它的 Function 语句必须包含一个空的圆括号。函数会在过程的一个或多个语句中指定一个值给函数名称来返回值。 从其他过程调用一个 Sub 过程时,必须键入过程名称以及任何需要的参数值。而 Call 语句并不需要,不过若使用它,则任何参数必须以括号括起来。

第10讲 VBA程序设计(五)

10.6 设置工作表使用权限程序举例

打开VBA编辑器,打开“工程资源管理器”,双击ThisWorkbook,从左边列表框中选择Workbook,再从该窗口右上方的列表框中选择Open,即在打开工作簿时执行本程序。

Private Sub Workbook_Open()

Sheets(\

If Application.InputBox(\请输入操作密码:\ Sheets(\ Range(\

Sheets(\Else

MsgBox \密码错误,不能打开加密工作表!\ Workbooks.Close End If End Sub 其中:

Sheets(\这段程序使得此工作表在不被激活时,所有文字为白色。 Sheets(\将该表所有文字转变为深灰色。

这段程序执行后,在你输入正确密码后,将该表所有文字转变为深灰色。如果输入的密码不正确,就关闭工作簿。

另外一种方式实现,就是采用隐藏工作表的方法,程序如下: Private Sub Workbook_Open()

Worksheets(\

If Application.InputBox(\请输入操作密码:\ Worksheets(\ Sheets(\Else

MsgBox \密码错误,不能打开加密工作表!\ Workbooks.Close End If End Sub

第10讲 VBA程序设计(六)

10.7 测试与错误处理

1.测试

测试代码,检查它是否正确。为确保代码能够正常作用,必须尽力模拟代码运行的不同环境,并检查其正确性。

程序中的错误一般分为如下几类:

(1)语法错误(如输入时关键字或标点符号拼写错误) 。

(2)编译错误(如使用对象的方法时,该对象并不支持这个方法) 。 (3)运行期间错误(如除0、打开或关闭并不存在的文档、关闭未打开的文档等) 。

(4)逻辑错误(逻辑锗误是最难查找的错误类型,它们是由程序中使用的逻辑引起的。

2.调试

要确保代码中的变量和表达式按照预想的方式运行,可以使用VBA中的各种调试工具跟踪它们。VBE有以下调试工具。

(1) 中断模式

①进入中断模式方法:在过程的开始位置按下F8键(“逐语句”执行)。使用“切断断点“(F9键或者单击当前空白指示器栏)。使用Stop语句。当过程运行时,按下Ctrl+Break键。使用运行期间错误MsgBox对话框。

②退出中断模式方法:从运行菜单中选择“运行子过程/用户窗体)”;或者按下F5键,或者单击“调试”工具栏上的“运行子过程/用户窗体”按钮。从“运行”菜单中选择“重新设置”选项,或者单击“调试”工具栏上的“重新设置”按钮。

(2) 单步执行过程

① 单步执行过程:从“调试”菜申中选择“逐过程”选项,或者按下Shift+F8键。

②跳出过程(跳过程剩余部份):从“调试”菜单中选择“跳出”选项,或者按下Ctrl十shift十F8键。

③运行到光标处(跳过一组语句):从“调试”菜单中选择“运行到光标处”或按下Ctrl+F8键。

④设置下一条语句为光标所指语句(要警惕会忽略不执行中间的语句):从“调试”菜单中选择“设置下一条语句”或者按下Ctrl十F9键。

⑤“显示下一条语句”选项指明下一个将要执行的语句是什么。当需要在程序窗口中监视很多过程、却丢失了跟踪时,就可使用这个调试功能。

(3) 监视过程

①“本地”窗口(显示当前过程中使用所有变量及其值,还会显示当前加载窗体和控件的属性。):从“视图”菜单中选“本地窗口”选项。

②“调用堆栈”对话框(查看所有活动的过程调用):从“视图”菜单中选“调用堆栈”或按下Ctrl+L键。

③“立即窗口”(可查询并设置变量值,创建或撤销对象,执行单行命令)。从“视图”菜单中选择“立即窗口”或按下Ctrl+G键。

④“监视窗口”(是一个调试工具,在中断模式下可使用它更改变量和表达式的值,以查看不同的值如何影响代码)。从“视图”菜单中选择。

3.预防错误

(1)注释 。

(2)缩进代码:Tab键或启用Too1s(工具)菜单选Options(选项)Editor(编辑器)选项卡中的Auto Indent(自动缩进)。

(3)使代码模块化。

(4)显式声明变量:使用Option Explicit语句,或启用工具菜单选“选项”编辑器选项卡中的“需要变量声明”复选框。

(5)避免使用变体Variant(当某变量可能包含NULL值时就只能惟一指定Variant类型了)。

(6)打开语法检查:启用工具菜单选“选项”编辑器选项卡中“自动语法检测”。

(7)谨防Dim陷阱:Dim str1, str2 As String '并未声明str1变量。 4.错误处理

调试只能够发现可以预测的错误,要处理不可预测的和不可避免的错误时,就必须使用错误处理。通过启用错误处理,捕获并提示错误处理,可以使程序更健壮。就可以使应用程序更稳定、更健壮。如果应用程序中包含了好几个过程,那么可以考虑采用集中式错误处理程序。

(1) 捕获错误:On Error Goto line (On Error Goto 0会在当前过程禁用错误处理程序) 在这个语法中,line指定了发生运行期间错误时控制将跳转到的代码行。

(2) 编写错误处理程序:给用户显示错误信息;提示补救方法;允许继续或取消操作。使用Err对象: 属性 Number Description Source HelpFile HelpContextID LastDLLError 说明 存储最后一个错误的数字ID。这是默认属性 存储说明错误的有关信息 包含发生了错误的对象名或应用程序名 包含帮助文件的名字 包含错误号对应的帮助上下文ID 包含最后一次调用DLL的系统错误代码

Raise方法可以让用户自定义错误处理信息,还可把错误处理信息传回调用过程: Err.Raise number[, source, description, helpFile, helpContext]

Clear方法清除Err对象的所有属性值:Err.Clear (当调用On Error, Exit Sub, Exit Function, Exit Property, Resume 等语句时,会自动调用Err.Clear方法。)

(3) 退出错误处理程序:

①0n error Resume:当错误处理程序已经修复错误后,可以用它来返回控制给引起错误的语句。但注意如果错误还在的话,会引起无限循环。

②0n error Resume Next:忽略错误语句,继续下一句。

③Resume [LineLabel]: 把控制传递给行标号(必须和Resume语句处在同一个过程中)所在点的语句。

④也可使用Exit Sub或者Exit Function甚至End语句退出已产生错误的过程,但这些语句应放在错误处理程序之前,这样当未产生错误时就不会执行错误处理程序。

第11讲 启动和结束界面的设计

11.1使用控件设计用户界面

首先要进行需求分析:应用程序的客户是谁,使用的数据的来源,数据保存在哪,对数据怎么操作,输出结果是什么?然后根据用户需求来添加控件(标签,按钮,复选框,选项按钮,列表框,组合框,滚动条控件,微调控件。)使用工作表还是用户窗体完全取决于个人的爱好和应用程序的用户。熟练Excel用户适合以工作表的形式工作。初级用户适合使用用户窗体。

1.向工作表添加控件: 视图|工具栏|窗体|点选控件到工作表|右击工作表上的控件选设置控件格式。通过使用控件、设置格式和公式,可以执行一些简单的自动化任务(至少对你的用户来说是这样)。

2.向用户窗体添加控件 (1)添加用户窗体: 打开一个新的工作簿|工具|宏|VBE|VBE的工具栏上的“插入用户窗体”按钮(或者选择“插入|用户窗体”,显示出新添加的用户窗体)。 (2)设置用户窗体的Name(一般前缀推荐取frm),Caption等属性。

(3)添加控件到用户窗体上:只要从工具箱中选择想要使用的控件,然后使用鼠标把控件拖到窗体上就可以了。

(4)设置控件的Name,Caption和其它相关属性:控件Name命名前缀规范:复选框chk,组合框cbo,命令按钮cmd或者btn,分组框grp或者fra,图像img,标签lbl,列表框lst,多页(MultiPage)mul,选项按钮opt,引用编辑(RefEdit)ref,滚动条hsb或者vsb(取决于是水平的还是垂直的),微调项spn,选项卡条(TabStrip)tab,文本框txt,切换按钮tog。

①命令按钮Default属性:一个窗体上只有一个命令按钮的Default属性可以设置为True。把Save(保存)/Cancel(取消)按钮的Default属性设置为True。在窗体上当按下回车键时,窗体将执行保存/取消操作。

②控件的尺寸调整为一致并对齐:同时选中两个控件|点工具栏上“宽度相同”按钮旁边的向下箭头|选'两者都相同'|点“对齐”工具栏按钮旁边的向下箭头|选'左对齐'。

③禁用控件:把Enabled(启用)属性设置为False就可以禁用控件。

④为控件分配Tab键切换顺序:设置TabIndex属性值,可以从第一个控件起设置其TabIndex为0,1,2..,也可以从最后一个控件起逆序设置每个TabIndex为0(原理:当把某个控件的TabIndex属性值设置为0时,其他所有控件的TabIndex属性值都会加1)。

⑤为控件分配加速键(键盘访问键):在控件的标题字母中找出一个作为该控件的加速键,把该字母赋值给控件的Accelerator属性,当设置完成以后,控件标题中该字母下会有下划线。

(5)运行用户窗体: 按F5键 11.2 启动和结束界面的设计

要使编写的EXCEL VBA界面美观,一般要编写一个启动的界面和结束的界面。要达到这个目的,需要使用用户窗体实现。

在VBE编辑器中,选择“插入”-“用户窗体”。 窗体有许多属性,可以根据需要改变。 一般需要设定两个参数。 其一是(名称),为了便于识别,一般不采用默认的名称。VBA默认的名称是UserForm1、UserForm2等等。本例中改为UserForm_begin,即为开始界面。

其二是Caption,窗口标题显示的名称。一般要改为本窗口具体含义的名称。本处改为“开始窗口”。

在窗口上,加入标签控件LABEL。方法先单击要选取的控件,然后在窗口上拖动鼠标到需要的大小。单击LABEL1标签,输入“工资管理”,字体及其大小可以通过Font属性进行设置。

至此,启动窗口设置完成。窗口上的内容可以根据实际需要进行设置,当然也可

以加入其他需要的控件。

结束窗口的界面设置方法基本与上相同,将窗口名改为UserForm_end,将LABEL显示内容改为“欢迎使用”。其他可根据自己的想法调整。

双击“模块1”,输入如下程序: Sub auto_open()

UserForm_begin.Show End Sub

Sub auto_close()

UserForm_end.Show End Sub

auto_open()是在打开工作簿时自动执行。auto_close()是在关闭工作簿时自动执行。UserForm_begin.Show 是显示UserForm_begin窗口。结束窗口同样采用相同的方式。

第12讲 菜单程序设计 12.1 独立菜单的设计 1.建立菜单

在Thisworkbook 中输入建立菜单的程序。

Private Sub Workbook_Open() On Error Resume Next '忽略错误

MenuBars(\删除自定义选单 MenuBars.Add (\Sheets(\

'增加第一个菜单选单项\项目初始\

MenuBars(\项目初始\'以下在一级菜单下增加几个级连子菜单

MenuBars(\项目初始\变动项目初始化\变动项目初始化\

MenuBars(\项目初始\其他项目初始化\其他项目初始化\

MenuBars(\项目初始\退出\OnAction:=\退出\

'增加第二个菜单选单项\工资计算\

MenuBars(\工资计算\

MenuBars(\工资计算\计算应发和实发工资\计算应发和实发工资\

MenuBars(\工资计算\部门汇总\部门汇总\

MenuBars(\工资计算\月度汇总\月度汇总\

'增加第三个菜单选单项\查询打印\

MenuBars(\查询打印\

MenuBars(\查询打印\查询工资表\查询工资表\

MenuBars(\查询打印\查询部门汇总表\查询部门汇总表\'根据业务需要增加相应的菜单选项 '激活自定义选单

MenuBars(\

Application.Caption = \星月软件有限公司\End Sub

本程序执行后,原来EXCEL的菜单已经不再显示出来。如果要启动VBE,可直接按Alt+F11。

2.子程序的编制 (1)退出

在“模块1”中输入如下程序。本模块程序的功能是删除已经建立的菜单,退出系统。

Private Sub 退出()

On Error Resume Next '忽略错误 Application.Caption = \MenuBars(\Application.Quit End Sub

12.2 在EXCEL上增加菜单的设计

在EXCEL已经有的菜单上增加菜单,也是常用的方式之一,这在EXCEL的基础上,可根据专用需要增加必要的功能。

在ThisWorkbook中增加如下程序: Private Sub Workbook_Open()

Dim myCmd As Object, myCtr As Object Application.CommandBars(1).Reset

Set myCmd = Application.CommandBars(1).Controls(2).Controls '2代表EXCEL的第二个菜单\编辑\

With myCmd.Add(msoControlButton, , , , True) .Caption = \显示窗口\ .OnAction = \

' FormShow 表示选择该菜单后,执行FormShow 过程,此过程要放到模块中 End With End Sub

在模块中增加如下子程序: Sub FormShow() UserForm1.Show End Sub

这段程序的作用就是显示UserForm1用户窗口。

然后再增加一个用户窗口,用户窗口的名称是UserForm1。

执行结果,在EXCEL的“编辑”菜单的最后,显示一个“显示窗口”的功能。

选择“显示窗口”功能后,执行FormShow()子程序,执行具体的功能。

根据这种方法,可以根据需要在EXCEL中增加所需的功能,达到实现特殊功能的目的,也不影响EXCEL功能的应用。

本文来源:https://www.bwwdw.com/article/u8ww.html

Top