|
VBA过程
================
一个过程就是执行某些动作的代码组合。
VBA过程分Sub过程和Function过程。
1、Sub过程总是以“sub 过程名()”开头,以“End Sub”结尾,一个过程就是执行某项动作的一套指令,Sub过程不返回运行的结果。
2、Function总是以“Function 程序名()”开头,以“End Function”结尾,和Sub过程的区别是Function过程返回程序运行的值,值可以是一个值或一个数组,就像我们的工作表函数,Function过程也就是我们说的自定义函数。
在这里,叶枫主要要给大家讲的是Sub过程,Function过程如果需要的话,在后面我们再讲。
好了,今天已经讲得够多了,你对VBA应该已有一个简单的认识了吧?
要设计一个过程,其实很简单,把需要的对象收集起来,看看我们要对他们的属性进行怎样的修改?我们需要做什么?需要用什么样的方法?要用哪些事件?收集起来就是一个完整的过程。
只要你肯动手,一定会觉得很简单,你不要被那一大堆的对象、属性、方法和事件给吓晕了,完全不必全部记住它们,需要的时候知道在哪里找就行,而代码也不必一个一个的去输入,还记得前面一贴我们说的录制宏吗?当你需要进行某项操作的时候,不妨先录一段宏,但是宏是呆板的,有许多我们不需要的东西,给它修修枝,剪剪叶,整理整理,一个程序就OK了。
同时,建议你在VBE窗口中,单击“工具——选项”,在弹出的“选项”对话框里勾选“自动列出成员”。
1.jpg (32.45 KB)
2009-8-13 16:24
设置好后,试着在代码窗口里输入点代码,看看,有什么?呵呵......,不用我说了,对于初学的我们,很需要它吧?
2.jpg (15.69 KB)
2009-8-13 16:24
了解了对象,属性,方法及事件后,猪八戒按门铃开门的过程我们都可以把它写成程序:
Sub 门铃_单击()
如果 嫦娥.位置=在家 那么 门.开
End sub
上面这个并不是真的程序,但都有了程序的思想了,程序里,事件、对象、属性及过程都有了,你能找出来吗?
多尝试,温故知新,你可以想着用程序去解决一些你在使用Excel过程中遇到的问题,每一个问题的解决,你都会发现自己得到了很大的进步.
好了,还是那句话,路在脚下,继续走,精彩会慢慢为你上演,让我们一起努力,共同进步。
[ 本帖最后由 ggsmart 于 2009-8-13 18:13 编辑 ]
我是一只不努力的菜鸟。但我也要飞的更高,飞的更高。。。嗷。。。嗷。。。
|
UID536933 帖子739 精华1 经验764 威望0 阅读权限30 在线时间304 小时 查看详细资料
| 引用 使用道具 报告 回复 TOP
|
ggsmart
Excel Home中级
 
积分1066 财富695 ¥ 技术3 注册时间2008-7-4 总积分排名 570 | 7楼 大 中 小 发表于 2009-8-12 21:31 只看该作者
★2009第4期优秀会员名单揭晓★ ★EH优秀会员奖励计划★
在上面,我们简单介绍了VBA的开发环境、几个常用的窗口,并对对象、对象的属性、对象的方法、对象的事件等概念作了简单的介绍,贴子大家认真看了吗?有没有一点点的收获?学习成绩如何?
什么是对象?什么是集合?什么是属性?什么是方法?什么是事件?如何正确地表示它们?
这些,你都能回答了吗?
先沉思三秒钟,如果你不能回答,那请赶快回过头去,再看一遍,我们说VBA是采用面向对象的程序设计方式,这些都是很重要的概念,如果不弄清楚,实际应用时,你可能会感到手忙脚乱。
如果已经掌握了,那让我们一起继续本贴的内容。
这次,我们将继续单调的基本功练习,讲一些VBA里面的关键字,为程序设计打下基础,还是那句话,希望你不要嫌内容的单调,一口你永远也吞不下一个大胖子,学习是一个循序渐进的过程。
------------------
数据类型、变量、常量、数组
====================
VBA的主要目的是什么?不用说了你也知道,当然是处理数据。某些数据存在于对象中,如工作表的单元格区域里,某些数据存在于我们自定义的变量中。
--------------------------------------------------------------------------------------
1、数据类型
数据类型告诉计算机如何将数据存储在内存中,如以整数、字符串、日期等。
数据类型是变量的特性,数据类型包括:
数据类型
| 存储空间大小 | 范围 | Byte | 1 个字节 | 0 到 255 | Boolean | 2 个字节 | True 或 False | Integer
| 2 个字节 | -32,768 到 32,767 | Long(长整型) | 4 个字节 | -2,147,483,648 到 2,147,483,647 | Single (单精度浮点型) | 4 个字节 | 负数时从 -3.402823E38 到 -1.401298E-45;正数时从 1.401298E-45 到 3.402823E38 | Double (双精度浮点型) | 8 个字节 | 负数时从 -1.79769313486232E308 到
| -4.94065645841247E-324;正数时从4.94065645841247E-324 到 1.79769313486232E308 | Currency
| 8 个字节 | 从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 | (变比整型) | Decimal | 14 个字节 | 没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001 | Date | 8 个字节 | 100 年 1 月 1 日 到 9999 年 12 月 31 日 | Object | 4 个字节 | 任何 Object 引用 | String
| 10 字节加字符串长度 | 0 到大约 20 亿 | (变长) | String(定长) | 字符串长度 | 1 到大约 65,400 | Variant(数字) | 16 个字节 | 任何数字值,最大可达 Double 的范围 | Variant(字符) | 22 个字节加字符串长度 | 与变长 String 有相同的范围 | 用户自定义
| 所有元素所需数目 | 每个元素的范围与它本身的数据类型的范围相同。 | (利用 Type) |
--------------------------------------------------------------------------------------
2、变量
变量是用于保存在程序运行过程中需要临时保存的值或对象。就相当于我们在操作工作表的时候插入的辅助单元格、辅助列或辅助表一样。
同工作表的单元格一样,变量可以接纳很多种的数据类型,如其名,程序运行后,变量的值是可以改变的。
如何定义变量?
定义变量可以使用Dim语句:
Dim 变量名 As 数据类型
变量名有一定的命名规则,这里我就不详细说明了,需要提醒的是在程序的设计过程中,你可能会定义很多的变量,为了阅读及修改程序的方便,你定义的变量名尽量能让人一看就明白这个变量具体代表的是什么。在Dim语句中,我们可以不必声明变量的数据类型,直接输入“Dim 变量名”此时定义的变量将被指定为Variant类型。
但我们在程序设计的过程中,一般应该明确数据的类型,这是一个好的编程习惯,因为指定数据类型后会提高程序的运行速度。
我们可以在模块中输入“Option Explict”作为第一句语句来强制声明所有变量。也可以点“工具——选项”,在选项对话框里勾选“要求声明变量”。这样,VBA在遇到没有声明的变量名称,该语句将导致程序停止。
定义变量除了可以使用Dim语句外,比较常的还有:static语句,Private语句,Public语句。使用不同的语句定义的变量不同的是它们的作用作用域不同,具体为:
(1)如果在一个过程中包含了一个Dim或Static语句,此时声明的变量作用域为此过程,即本地变量。
(2)如果在一个模块的第一个过程之前包含了Dim或Prvate语句,此时声明的变量作用域为此模块里所有的过程,也就是在此模块里所有的过程都可以使用它,即模块作用域下的变量;
(3)如果在一个模块的第一个过程之前包含了Public语名,此时声明的变量作用域为所有模块,即公有变量。
变量的作用域是指变量保留其值的这段时间,也称为变量的生成周期,它决定变量可以用于哪个模块或过程中。
给变量赋值
用等号(=)是VBA里的赋值运算符。
比如我们把"我在学习VBA变量!"这个字符串赋给变量A,则直接输入:
A="我在学习VBA变量!"
对了,你可以在立即窗口里试一下逐条输入:
A="我在学习VBA变量!"
Mgbox A
看一下效果。
注意,在VBA里文本是要用英语引号引起来的,还有日期要用#号,比如将日期2009-3-10赋给变量A,则为:
A=#2009-3-10#
--------------------------------------------------------------------------------------
3、常量
执行过程时,变量的值会发生改变,所以我们称它为“变量”,但有时候我们需要引用不会发生变化的数据,这就是常量。常量声明后,不以对它进行再赋值。
声明常量设定常量的值,需要用Const语句:
Const 常量名 As 数据类型 = 常量的值
--------------------------------------------------------------------------------------
4、数组
除了变量和常量以外,数组也是我们常用到的。
什么是数组?
数组是具有相同数据类型并且共享一个名字的一组变量的集合。数组也是变量。
数组中的元素通过索引数字加以区分。
如何声明数组?
可以用Dim语句或者Public语句声明数组。
Dim/Public 数组名 (a to b) as 数据类型
a 和b 是数组中元素的个数,数组元素素最小值为a,最大值为b,元素个数为(b-a+1)个,当然,你也可以直接输入个数,此时默认最小索引号为0。
如: Dim myarr(5) As Integer
这个数组的最小元素索引号为0,元素个数为6。
上面定义的只是一维数组,你还可以定义二维、三维、四维…….
如: Dim myarr(1 to 5,1 to 10) As Integer
这就是一个二维数组,元素个数为5*10=50个。
在程序设计的过程中,定义数组的时候我们可能不能确定数组的元素个数,对数组进行声明后,可以在运行时用ReDim语句重新指定数组的大小。
--------------------------------------------------------------------------------------
今天的这一部分内容实在很枯燥,连叶枫都有点耐不住了,拉拉杂杂说了这么多,也不知道你看出点门道没?同前一贴讲的内容一样,这些基础都是非常重要的,多读几遍,扎好马才能修练更高深的武功,千万别嫌这个过程的漫长。
一个让你心仪的女孩子,想牵上她的小手,徜徉在公园里的林荫小道上,先前的送花、打电话等等那一串串巴结的行动你会不会嫌太漫长?
VBA不像函数那样直面我们,它躲在Excel的背后,像一个“养在深闺未得见”的美丽姑娘,她飘在墙角的那缕模糊却美丽的身影对我们充满了诱惑,现在我们正在想法设法寻找她的联系电话,要想成功俘虏她,这一步能少吗?
看的没有动的快,动手操作才是学习的正确方法。发现问题,解决问题,这岂不是一个快乐的过程。
[ 本帖最后由 ggsmart 于 2009-8-13 16:37 编辑 ]
我是一只不努力的菜鸟。但我也要飞的更高,飞的更高。。。嗷。。。嗷。。。
|
UID536933 帖子739 精华1 经验764 威望0 阅读权限30 在线时间304 小时 查看详细资料
| 引用 使用道具 报告 回复 TOP
|
ggsmart
Excel Home中级
 
积分1066 财富695 ¥ 技术3 注册时间2008-7-4 总积分排名 570 | 8楼 大 中 小 发表于 2009-8-12 21:32 只看该作者
★Excel服务器学习和下载园地★

有人问:如何知道该定义变量为何种类型?
===========
这就要根据你的实际需要,再结合各种数据的的范围来看。
在编写程序的过程中,选择需要存储空间尽量小的数据类型来保存所需要的数据,这是很有必要的,虽然我们可以把变量设为Variant型,但上面我说了,定义变量类型会提升程序的运行速度,这也是VBA提供各种数据类型存储空间的原因。
该定义变量为哪一种类型?看一看它的长度。
用生活中的一个实例来说这个问题:
有一天你上街去买一斤菜油,我们需要选择一个容器来装我们所要买的菜油(相当于声明变量的类型),如果我们没有选择选择容器,上帝可不知道你要买多少斤菜油,他就扔给你一个超级大的水缸,这个水缸无论你要买多少菜油都是可以装得下的。可是携带这样一个水缸上街你会不会觉得太不方便了?用一个水缸来装一斤菜油会不会太浪费了?所以我们得自己选择一个瓶子去装我们的油,一斤油,用一个瓶子刚好合适,当然,如果你只用一个茶杯去装,那也是不行的。
用数据来打比方,我们需要用变量来保存一个学生某学科考试成绩的分数,那么用Byte数据类型就可以了(它的范围是0——255),如果在这里使用Integer、Long、Single这些数据类型的话,就相当于我们用水桶,水缸去装那一斤菜油,只是对计算机存储空间的浪费,当然,如果你的值的范围超过了Byte的范围,那定义成Byte也是不行的。
定义变量的类型时,除了考虑长度外,还要考虑变量的值的类型。
买油的时候不管是用瓶子还是用水缸,反正都能装回来,但是如果你用麻袋能不能装那一斤油回来?
还是那句话,如果你没有定义变量类型或定义变量类型为Variant,聪明的计算机会先看你打的油是固体还是液体,是液体的话把麻袋扔在一边,给你弄口大缸子。但是如果你自己选择麻袋上街去买油,你还能不能把你的油带回来?
用数据来打比方,如果你定义了一个变量为Integer型,那你再用把学生姓名的字符串赋给它,行吗? 复制内容到剪贴板 代码:Sub mysub()
Dim a As Integer
a = "我在学习VBA变量"
MsgBox a
End Sub
将这个过程提制到模块里,按F5运行它,看看是什么结果?尝试修改一下定义的数据类型,看看修改后的运行结果!
[ 本帖最后由 ggsmart 于 2009-8-13 16:53 编辑 ]
我是一只不努力的菜鸟。但我也要飞的更高,飞的更高。。。嗷。。。嗷。。。
|
UID536933 帖子739 精华1 经验764 威望0 阅读权限30 在线时间304 小时 查看详细资料
| 引用 使用道具 报告 回复 TOP
|
ggsmart
Excel Home中级
 
积分1066 财富695 ¥ 技术3 注册时间2008-7-4 总积分排名 570 | 9楼 大 中 小 发表于 2009-8-12 21:33 只看该作者
★Excel服务器2008软件和教程下载★

VBA函数
=========
用Excel的时间相信你也不短了,什么是函数就不再细说了。
与其他编程语言一样,VBA含有各种内置的函数。很多的VBA函数都与Excel的工作表函数类似,或者一样。
使用VBA函数的的方式与使用工作表公式中函数的方式相同,在VBA代码中,我们可以使用很多Excel的工作表函数,例如Sum,Abs等。
例如: 复制内容到剪贴板 代码: Sub myabs()
a = InputBox("请输入数值:", "提示")
labs = Abs(a)
MsgBox "你输入的值的绝对值为:" & labs
End Sub
这是一个求绝对值的过程,通过InputBox提示用户输入一个数值给变量a,再用Abs函数求出变量的绝对值,最后通过MsgBox返回结果。
InputBox同MsgBox函数一样,是很常用的函数,关于它的功能及用法,请用绝招:抹黑,按F1,
但并不是所有的工作表函数在VBA里都可以直接调用,但由于WorksheetFunction对象包含在Application对象中,如果我们要在VBA语句里使用某个不能直接调用的工作表函数,只需要在函数名称前加上Application.WorksheetFunction语语即可。
如:在VBA里使用counta函数则代码为: application.worksheetfunction.counta(range("a1:a10"))
VBA里面的函数很多,可以简化我们的计算和操作,功能强大啊。但当你面对那一堆英文字母,是否为该怎么记住它们感到晕菜?有人对我说,记住常用的几个,其他的不用记那么清楚,有个模糊的印向,用时再翻Help,知道在哪里找就万事OK了。我觉得这个方法很好,现转送给你!
[ 本帖最后由 ggsmart 于 2009-8-13 16:56 编辑 ]
我是一只不努力的菜鸟。但我也要飞的更高,飞的更高。。。嗷。。。嗷。。。
|
UID536933 帖子739 精华1 经验764 威望0 阅读权限30 在线时间304 小时 查看详细资料
| 引用 使用道具 报告 回复 TOP
|
ggsmart
Excel Home中级
 
积分1066 财富695 ¥ 技术3 注册时间2008-7-4 总积分排名 570 | 10楼 大 中 小 发表于 2009-8-12 21:35 只看该作者
★财务、会计、人力资源、行政、生管、销售、市场、学校管理:Excel 行业应用系列视频课程精彩放送中★
控制程序的流程,有判断、分支和循环三种语句。
接下来我们将一样一样地进行讲解。
=====================
程序流程控制—>if语句
====================
1、if—then语句
这个句式相当于中文里面的“如果.......那么”。
格式:
if 逻辑表达式 then
语句块
end if
解释:如果逻辑表达式的结果为true,则执行语句块里的所有语句,否则执行end if后面的语句。语句块可以是一句指令或多条指令,也可以调用一个或多个过程,当然,也可以为空,就是没有语句。
如:要判断A1单元格是否已输入内容,设计程序: 复制内容到剪贴板 代码:Sub test1()
If [a1] = "" Then
MsgBox "A1单元格没有输入任何内容!"
End If
End Sub
2、 if—then—else语句
这个语句相当于中文里面的“如果......那么......否则......”句式。
格式:
if 逻辑表达式 then
语句块1
else
语句块2
end if
解释:如果逻辑表达式的结果为true,则执行语句块1里的所有语句,如果逻辑表达式的结果为Flase则执行语句块2里的所有语句。
如:要判断A1单元格是否已输入内容,设计程序: 复制内容到剪贴板 代码:Sub test2()
If [a1] = "" Then
MsgBox "A1单元格没有输入任何内容!"
Else
MsgBox "A1单元格已经输入了内容!"
End If
End Sub
3、if—then—elseif语句
这就相当于中文里面的若“如果…那么…否则如果…那么…否则”语句,当然,可以有多句“否则如果.......”
格式:
If 逻辑表达式1 Then
语句块1
ElseIf 逻辑表达式2 Then
语句块2
ElseIf 逻辑表达式3Then
语句块3
…
Else
语句块n
Eed If
解释:若逻辑表达式1的结果为True,则执行语句块1,接着继续执行EndIf后面的语句;若逻辑表达式1的结果为False,则检查逻辑表达式2的结果,若为True则执行语句块2,接着继续执行EndIf后面的语句.......一直到所有结果的条件都不满足时,才执行Else后面的语句块n。
如:要判断A1单元格的数是否能被2、3、5其中之一整除,设计程序: 复制内容到剪贴板 代码:Sub test3()
If [a1] = "" Then
MsgBox "A1单元格没有输入任何内容!"
ElseIf [a1] Mod 2 = 0 Then
MsgBox "A1单元格的数能被2整除!"
ElseIf [a1] Mod 3 = 0 Then
MsgBox "A1单元格的数能被3整除!"
ElseIf [a1] Mod 5 = 0 Then
MsgBox "A1单元格的数能被5整除!"
Else
MsgBox "A1单元格的数不能被2、3、5其中之一整除!"
End If
End Sub
IF语句.rar (6.7 KB) IF语句.rar (6.7 KB)
下载次数: 410
2009-8-13 17:52
|
|
|