office - Excel - VBA入门基础 - 图文

更新时间:2023-03-13 17:03:01 阅读量: 教育文库 文档下载

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

VBA基础入门

VBA的功能实在太强大,可初学的我们,面对那一串串尤如外星文的代码,你是不是看得头昏脑胀?想学,是不是却茫然得找不到入口?

在这里,我把我自己的学习心得和笔记放出来,和大家一起分享交流,一起学习,共同进步。对了,还要告诉大家,我也是初学者,不是高手,如果有什么说得不对的,希望大家及时指出。我的目的不是教学,而是期望创造一个有你,有我,有他的学习氛围! 开始吧,记住一个共同的目标——掀开那层神秘的面纱,看看VBA的真实面目。

-----贴子内容---

1、什么是VBA?为什么要学习VBA 2、VBA与宏 3、VBE简介

4、对象、属性、方法、事件 5、VBA过程

6、数据类型、变量、数组、常量 7、(回复)该定义变量为何种数据类型 8、VBA的函数

9、程序流程控制:if语句

10、程序流程控制:Select Case语句 11.程序流程控制:For—next语句

12、几个for—next 循环的例子(作者:老朽 13、程序流程控制:For—Each语句 14、程序流程控制:Do While语句 15、程序流程控制:Do Until语句 16、程序流程控制:Go to 语句 17、用户窗体

18、再说Excel的对象模型

19、[小试牛刀]制作一个个性化的欢迎界面 20、处理单元格数据(复制、剪切、删除 21、Range对象的End 属性(带作业) 22、花名册分类(实例) 23、花名册汇总(实例 24、新建工作表

25、认识数组(一)

26、Worksheet的Change事件(带作业)

27、关于Application.EnableEvents属性(有实例动画) Application.EnableEvents补充说明

28、关于Worksheet的SelectionChange事件(有实例动画) 29、Worksheet的SelectionChange事件实例(trustwxq 朋友提供)

什么是VBA?为什么要学习VBA? ========

VBA是Visual Basic For Application的简称,具体说来,可能让叶枫三天三夜也说不完,叶枫也只知道VBA是建立在Office中的一种应用程序开发工具,其实知道这也就够了。很懒很笨的叶枫只想吃香喷喷的大米饭,可从没想要知道大米饭是怎么来的。

Excel本身的内臵函数其实已经很强大了,甚至有人说,只要学会二三十个函数,就已经可以满足普通用户日常的工作需求。

那我们为什么要学VBA? 是的,如果只需要满足一些普通的工作需求可能永远也不会用到VBA,但在实际应用的过程中,人们的操作却越来越大,需要也越来越高,这时候就需要用VBA来对Excel进行二次开发了,VBA可以有效地自定义和扩展Excel的功能。

但有一点叶枫想要告诉大家,VBA功能很强大,但并不是万能的,也并不是所有工作都需要用VBA来解决,也并不是所有工作用VBA来解决都会很简单,这要根据实际情况而定,有些工作你用VBA来解决的话相反会变得很麻烦。

VBA与宏

======

刚开始的内容听起来很枯燥,请大家不要分心,耐着性子看下去,兴趣总是慢慢积累的。

1、亲自动手,录制一段属于自己的宏

提到VBA,相信很多人想到的就是宏,但是VBA与宏是不是一回事?我觉得它们不是一回事,但这不重要,我们要做的是先

来认识一下宏。 宏是什么?

我理解的宏是一系列固定动作的集合,这个集合当遇到让他执行的条件后就逐个执行。

有人把我们录制的宏比喻成一个武术运动员在比赛中练就的一段武术套路动作,这个套路遇到一定的条件(比赛)就执行。 好了,别闲着,动一动你可爱的右手,点点鼠标,打开一个Excel文件,录制一段宏来来研究研究,步骤如下: (1)选中任意一个单元格;

(2)打开菜单—>工具—>宏—>录制新宏,调出宏录制对话框,输入宏名(mysub),确定;

(3)设臵单元格字体为仿宋体,红色; (4)点击停止录宏。

这样,一个简单的设臵单元格格式的宏就录好了。

-------------------------------------------------------------------------------------------------------------------

2、鼠标点一点,宏给单元格换新装 下面我们来执行这段宏。

(1)选中需要设臵的任意单元格或单元格区域(为了看出效果,单元格最好有字符);

(2)打开菜单—>工具—>宏—>宏,显示?宏?对话框(快捷键:Alt+F8);

(3)选择我们刚才录制的宏,单击?执行?。

这样我们看到已经为刚才选中的单元格的字体已被修改成仿宋体,红色。自己动手试着录制几段宏,再执行一下,加深印象。

神奇了吧?以后当你再需要一遍又一遍地重复若干相同的操作的时候,会不会想到让宏来替你做这一切?这是一个不错的奴隶,不用花钱,且不用开工资,赚了吧? 好了,收起你贪婪的笑容,继续往下看。

宏是什么?现在相信你能想出一千种说法,由你了,又笨又懒的叶枫可没你聪明,也不再多说。

上面说的执行宏的过程是不是让你感觉很麻烦?希望用快捷键来控制宏?这个我们可以在录制宏之前在录制宏对话框里

进行设臵。也可以在录制宏后进行设臵,按Alt+F8显示宏对话框,单击?选项?,在?宏选项?对话框里进行设臵

------------------------------------------------------- 3、寻根问底,找到宏的老窝

如果你忘记了,请你再打开宏录制对话框,在宏名的下面,有一个?保存在?的选项,点一点下拉的箭头,我们可以看到,宏可以保存在三种不同的位臵,分别是: (1)当前工作簿(系统默认):宏保存在当前工作薄的模块里,只有当该工作薄打开时,宏才起作用。 (2)新工作簿:新建一个工作薄保存。

(3)个人宏工作簿:这是为宏而设计的一种特殊的具有自动隐藏特性的工作簿,如果你要让某个宏在多个工作簿都能使用,那么就应当创建个人宏工作簿,并将宏保存于其中。 上面我们录制的宏是保存在当前工作薄里,今天我们在这里也只介绍保存在当前工作表里的宏。

------------------------------------------------------- 4、拨开层层迷雾,查看庐山真面目

宏靠什么来控制Excel的运行?是不是感觉深在浓浓的迷雾里,感觉一头雾水?让我们鼓一鼓劲,拨开它的衣服,开开那家伙里面到底是什么?

(1)按Alt+F8快捷键打开?宏?对话框;

(2)选择我们刚才录制的宏,点?编辑?按钮。

眼前一亮吧?这是一个新的天地——VBA的编辑器窗口(VBE),这个我们以后再说,先将注意力集中到显示的代码上。代码如下:

复制内容到剪贴板 代码:

Sub mysub() ' mysub Macro

' 宏由ggsmart录制,时间: 2009-2-27' With Selection.Font

.Name = \仿宋_GB2312\ .Size = 12

.Strikethrough = False .Superscript = False

.Subscript = False .OutlineFont = False .Shadow = False

.Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With

Selection.Font.ColorIndex = 3 End Sub

现在你可能感觉到上面这些乱七八糟的代码会很陌生,甚至在问自己是不是来到外星人的世界,反正叶枫当初是这样感觉的,但不要为此感到害怕,将来我们会慢慢熟悉他,就像闭上眼睛也能准确地将那个又大又红的苹果送到自己的嘴里。

------------------------------------------------------- 5、再进一步,给宏安上门铃

一遍一遍地在宏对话框里选择宏名称,按?执行?按钮来运行宏的麻烦是不是让你郁闷得有些想吐血?指定快捷键虽然方便,但别人用自己的工作表时能不能快速上手?就算是自己,如果宏多了,或是放的时间长了,你还记得哪个快捷键控制哪个宏?

作为excel开发者,一个主要的目标是为自动化提供一个易于操作的界面,?按钮?是最常见的界面组成元素之一,我们可以把宏指定给特定的按钮,通过按钮来执行宏,还是用刚才我们录制的那个宏来举例。通过使用?窗体?工具栏,可以为工作簿中的工作表添加按钮。在创建完一个按钮后,可以为它指定宏,然后你的用户就可以通过单击按钮来执行宏。在本练习中,将创建一个按钮,并为它指定一个宏,然后用该按钮来执行宏。具体步骤如下: (1)打开菜单—>视图—>工具栏—>窗体,调出窗体工具栏。

1.jpg (7 KB)

(2)单击?窗体?工具栏中的?按钮?控件,在工作表中希望放臵按钮的位臵按下鼠标左键,拖动鼠标画出一个按钮,松开鼠标后,Excel会自动显示?指定宏?对话框。

2.jpg (31.38 KB)

(3)从?指定宏?对话框中选择?mysub?,单击?确定?。这样,就把该宏指定给命令按钮。 引用:

课间休息,插播一段广告:按钮,工作表等这些对象就像是Excel的众多儿女,儿女太多,怎么称呼这群儿女也是一个问题.为了不出现叫"儿子"就七八个一起跑出来,同许多农村父母给儿女起"老大,老二,老三……"的称呼一样,Excel也用这种顺序的起名方法给这些儿女贴上了标签.比如第一个按钮

是"按钮一",再画一个就是"按钮二",然后是"按钮三","铵钮四"等等.这样,以后你要叫第三个儿子的时候直接叫"按钮三"即可.如果你嫌这个名字乡下味太浓,如果你嫌这个名字不能很好地反映点击它后会执行怎样的操作不清楚,你可以通过双击按钮表面激活它,可重新为按钮贴上合适的显示标签.需要提醒你的是,这里的标签只是它显示在你面前的样子,实际上它是什么名字?我们可以点击它,看一下名称框里是什么.

3.jpg (16.03 KB)

为什么显示出来的是一样,而实际的名字却是另一样呢?也许你现在会感到迷茫,但不用管它,以后当我们学习了属性后,一切就自然明白了.

下面我们来试一试用按钮操作: (1)选择单元格或单元格区域; (2)单击按钮。

4.jpg (61.93 KB)

按钮就像装在楼下的门铃,美丽的嫦娥仙子家住在502,猪

八戒来到楼下,找准号码502,轻轻一按,?叮咚,叮咚……?,嫦娥在楼上就给八戒开门了,八戒不用在楼下大声地喊?嫦娥,开门。?也不用花两毛钱给嫦娥打个电话,当然更不用顺着下水管从墙上爬进嫦娥的窗户,方便而实在吧?

这种遥控式的命令的确能让繁琐的操作变得简单而方便,让我们获得了一些使用Excel标准命令所不能实现的功能。如果你是八戒,当你熟悉了如何使用这种遥控一样的门铃以后,你可能都会奇怪自己当初在没有门铃的情况下,那段漫长的爬下水管道的日子是怎么熬过来的。

让嫦娥仙子开门的方法有很多种,同样执行宏也有多种方法可以选择,我们还可以把宏指定给图片,自选图形,这些比较简单,和指定给窗体按钮是一样的,同时我们还可以把宏指定给某个?事件?,比如单击工作表,双击工作表,激活工作表,打开工作簿等等,你要安什么要的门铃,选什么样的音乐,随你了。 需要强调一点的是,我们刚说的?事件?是一个重要的概念,八戒按门铃,就是一个?事件?,这个?事件?引发了嫦娥的开门,只有门铃响了,嫦娥才会去开门。除此而外?方法??对象??属性?都是接下来我们会经常接触到的,慢慢走,留心点,一路上将会精彩不断。

------------------------------------------------------- 6、小结 到这里,我们对宏应该有一个简单的了解了吧?宏实际上就是一个简单的VBA的Sub过程,它保存在模块里,以Sub开头,以End Sub结尾,执行时就从第一句逐句执行,直到End Sub结束。就像前面我们说的武术运动员练的那段套路动作,总是抱拳,扎马,出拳然后踢腿,永远不可能没有扎马就出拳,没有出拳就踢腿。我们今天录的这段宏也总是先设字体,再改字体颜色,这种顺序永远不会乱。 说完这些,你是不是感觉这些操作古板得没有生气?是不是感觉这宏的操作不能满足自己的需求?

叶枫想告诉你的是,宏代码绝不等于VBA,它只是VBA里最简单的运用,尽管许多Excel过程都可以用录制宏来完成,但是通过宏代码还是无法完成许多的工作,如: (1)不可以建立公式,函数; (2)没有判断或循环的功能;

(3)不能进行人机交互; (4)无法显示用户窗体;

(5)无法与其他软件或文件进行互动。

…….所以,你看了上面的内容后千万不要以为宏就是VBA了,更不要以为自己已经会VBA了,事实上是你才刚沾上VBA的边,或者说连边都没沾上,甚至连宏今天我们都只是作了简单的介绍。

路漫漫其修远兮,还等着我们上下去求索,路在脚下,武林高手总是从练习简单的套路动作开始,不要厌倦扎马的单调,静下心多练练,这会是你以后练习武功招式的一个基础,孔子老人家说了,要温故而知新,记得复习巩固,不要学了后面忘了前面,到下次叶枫再见到你的时候你什么都忘记了,好了,今天就到这里,让我们一起加油~~~~

VBE简介=============================== 什么是VBE?

相信你还没忘记吧?VBE就是VBA的编辑窗口,所有的VBA操作都在VBE里完成。

VBE是一个分离出来的应用程序,它可以与Excel无缝结合,但是需要说明的是要运行VBE必须先运行Excel,VBA模块与Excel工作薄文件一起存储,除非激活VBE,否则VBA模块是看不见的。

1、运行Excel后,怎样切换换到VBE窗口?

打开大门的钥匙有很多把,千万别猴急地去爬下水管道。 (1)按ALT+F11快捷键;

(2)选择?工具?—>?宏? —>?Visual Basic编辑器?命令。

1.jpg (29.14 KB)

(3)右击工作表名称标签,点击查看代码。

2.jpg (17.69 KB)

(4)单击控件工具箱里的?查看代码?。

3.jpg (28.24 KB)

如果你的窗口里找不到控件工具箱,请通过?视图?—>?工具栏? —>?控件工具箱?打开它。

4.jpg (35.59 KB)

(5)通过控件工具箱建立一个新的控件,双击控件。

5.jpg (36.24 KB)

2、初识VBE窗口

这个界面相信你不陌生吧?查看宏的时候我们已经见识过它了。

6.jpg (85.09 KB) ?工程资源管理器?显示一个树型图示,包含了当前在Excel中打开的所有Excel对象,包含工作表,模块,窗体,加载宏及

隐藏的工作薄,每个工作薄被认为是一个工程。 在工程资源管理器里右击,可以在右键菜单里选择相应的命令插入模块或窗体。如果你想删除它或者保存它,同样也可以在这里进行相应的操作。

7.jpg (30.89 KB)

?属性窗口?显示当前你选择的Excel对象的属性。选中某个对象后,可以在属性窗口中修改选中的对象的的各样属性.如颜色,名称等。

8.jpg (37.77 KB)

?立即窗口?,这是一个非常有用的窗口,在其中可以直接执行VBA语句,测试语句和调试代码,就跟我们在DOS下输入DOS命令一样。如果你的立即窗口不可见,按 CRTL+G调出来,可以在里面尝试输入:

[a1]=?我在学习VBA?

回车,看一看A1单元格里发生了什么变化?

9.jpg (36.51 KB)

?代码窗口?是干嘛用的?相信你已经很清楚了,当然是用来编辑VBA代码的地方,工程中的每一项都有一个与之相关联的代码窗口,

如果要查看某对象的代码窗口,或者说如果要查看某对象上面究竟编写了什么VBA代码,在?工程资源管理器?窗口中双击对象即可。

10.jpg (30.07 KB)

当然,你打开后的窗口不一定和上面一样,VBE的窗口也不只上面几个,我们可以打开?视图?菜单,在里面进行选择需要显示的窗口。

对象、属性、方法,事件

==============

这是很重要的几个概念,是写VBA程序的基础,大家仔细读,一定要弄清楚。

1、对象及对象层次结构

对象就是存在的东西,是VBA处理的内容,包括工作薄、工作表、工作表上的单元格区域、图表等等。对象可以相互包含,就像一个文件夹里可以包含多个文件夹一样,而这个文件夹又可以被其他的文件夹包含,一个工作薄对象可以包含多个多个工作表对象,一个工作表对象又可以包含多个单元格(或图表,图形等),这种对象的排列模式称为Excel的对象模型。 ----------

集合这个概念经常遇到,我理解的集合是对相同类型的对象的统称。

某中学有5000个学生,名字各不相同,我们对他都统称为某中学的学生,而不和一一去叫他们的名字,\某中学的学生\在这里是集合。

对象的引用,在Excel里,Workbooks集合包含在Application对象里,当我们要引用某工作薄的时候,要遵循从大到小的规则。跟表示硬盘里的某个文件的位臵一样,比如我们想引用D盘?我的文档?文件夹下的名为?我的VBA课程.doc?文件时要输入的是:

D:\\我的文档\\我的VBA课程.doc

同样,如果我们要引用名称为?mybook.xls?的工作薄时就是:

Application.Workbooks(?mybook.xls?) 和引用文件不同的是,VBA里使用的分隔符是点。

同理,当我们引用?mybook.xls?里面的工作表?mysheet?时应是:

Application.Workbooks(?mybook.xls?).Worksheets(?mysheet?)

可以继续延伸到下一层,引用?mybook.xls?里工作表?mysheet?里面的单元格区域?A1:D10?:

Application.Workbooks(?mybook.xls?).Worksheets(?mysheet?).Range(?A1:D10?)

但是并不是每一次引用都必须这么呆板,就像猪八戒不用每一次都去爬下水管道。如果我们引用的是活动对象,也就是被激活的对象,引用就可以进行简化。

如果是mybook工作薄是激活的,引用可以简化为 Worksheets(?mysheet?).Range(?A1:D10?)

如果mysheet当前也是激活的,引用甚至还可以简化为Range(?A1:D10?) ,也可以直接输入[A1:D10] ,如果引用的单元Range是单个的单元格,还可以用Cells(行号,列号)的引用方式。

------------------------------------------------------- 2、属性

每一个对象都有属性,一个属性就是对一个对象的一个设臵。

猪八戒背着媳妇高秀兰回自己的紫云洞,猪八戒的媳妇就是对象,?高秀兰?就是猪八戒的媳妇的一个属性(name属性),引用对象的属性同样也要用点来分隔。 猪八戒的媳妇.name=高秀兰

别闲着,还是动动你的右手,打开一个工作表,Alt+F11(千万别说你不知道这个快捷键是干什么,要不我保证被你气个半死),如果立即窗口没有打开,按Ctrl+G打开,在里面输入: 复制内容到剪贴板 代码:

Msgbox Worksheets(1).name 回车。

1.jpg (53.4 KB)

Worksheets(1)和Worksheets(?sheet1?)有什么区别? Worksheets(1)表示Worksheets集合里的第一个工作表。 Worksheets(?sheet1?)表示Worksheets集合里名为\的工作表。

至于Msgbox是什么,那就自己问Help了,在立即窗口里用鼠标左键把Msgbox抹黑,按F1,就弹出Help里对它的说明了。 抹黑代码,再按F1即可看到相应的帮助。叶枫说:?这个办法很适用,一般人我不告诉他。?

2.jpg (42.52 KB)

一个对象有哪些属性我们可以在属性窗口里查看,要修改一个对象的某种属性,如名称、显示状态、颜色等等,也可以在属性窗口里进行修改,当然我们还可以利用代码进行修改。改当前工作薄里的第三个工作表的名称为?这个名字是我用VBA改的?,想想怎么写代码?

把你的代码输在立即窗口里,回车,看看效果,你做到了吗? ------------------------------------------------------- 3、方法

每一个对象都有方法,方法就是在对象上执行的某个动作。 和属性相比,属性表示的是对象某种状态或样子,是静态的,就像是语文里的名词、形容词和副词,而方法则是做某件事的一个动作,就像动词,对象和方法同样用点来分隔。

例如Range对象有有一个方法是Select,他的作用是选中指定的Range(单元格区域)对象,在立即窗口里输入代码: 回车,可以看到D1:F10已经被选中了。

3.jpg (36.23 KB)

------------------------------------------------------- 4、事件

在上一面猪八戒按门铃那里,我们已经接触过什么是事件了。

简单点说,事件就是由用户或者系统触发的,可以在代码中响应的一段代码。比如,当我们移动鼠标,打开工作薄,激活工作表,选中单元格,改变单元格的数值,点击按钮或窗体,敲击键盘等等这些都会产生一系列的事件,通过编写代码响应这些事件,当发生此类事件时,程序代码就会进行相应的操作。

这样解释你会不会有些晕?感觉又一次进入了外星人的世界?还是举例说明,我们需要当激活某工作表的时候,自动弹出一个对话框,告诉我们激活的工作表的名称。

(1)打开一个工作表,Alt+F11打开VBE窗口,在?工程对象管理器?窗口里双击你要进行设臵的工作表,使其代码窗口显示。

(2)左面选择对象Worksheet(工作表对象),右面选择Activate事件,我们可以看到在代码窗口里系统已经为我们自动输入了一段代码。 复制内容到剪贴板 代码:

Private Sub Worksheet_Activate() End Sub 引用:

提醒: 初学的我们,不必完全记住对象及事件的名称,也不必手

工输入,系统早为你准备好了,你可以在代码窗口里进行选择,左边是对象,右面是事件,如果你想知道某个对象(例如工作薄、工作表、窗体等)有哪些事件,只需要双击这个对象,然后在代友窗口里查看即可。我们需要做的只是:当自己需要它的时候,知道打开哪个箱子把它拿出来即可.

4.jpg (47.51 KB)

废话说完,再回到问题里: 要达到问题的目的,我们只需要在已给我们列出的两段代码中间加入需要进行操作的代码就可以了,这里我们需要的是一个对话框来提醒,对了,还记得Msgbox吧? 输入代码: 复制内容到剪贴板 代码:

MsgBox \你现在激活的工作表名称是:\上面的代码相信你应该能看懂吧?

&和我们工作表里的函数是一样的,连接文本的作用,Activesheet.name是当前活动工作表的名字(用了一个name属性)。

回到工作表,激活你刚才设臵代码的工作表,如果你刚才设臵的工作表是激活状态,请选择其他工作表,然后再重新激活它,看看你看到了什么?

5.jpg (34.5 KB)

看一下上面的代码,对象和事件之间用什么来分隔?还是不是点?

千万别懒,一定要动手,换其他的事件或其他的对象试一试,试着用代码改一下其他对象的属性,在单元格里添加点什么东西,这些随你了,你可千万别说你不知道哪些事件是干嘛用的。 别忘记,抹黑代码,按F1,再重复一遍,这是一件好武器,一般人我不告诉他. 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)

设臵好后,试着在代码窗口里输入点代码,看看,有什么?呵呵......,不用我说了,对于初学的我们,很需要它吧?

2.jpg (15.69 KB)

了解了对象,属性,方法及事件后,猪八戒按门铃开门的过程我们都可以把它写成程序: Sub 门铃_单击()

如果 嫦娥.位臵=在家 那么 门.开 End sub

上面这个并不是真的程序,但都有了程序的思想了,程序里,事件、对象、属性及过程都有了,你能找出来吗?

多尝试,温故知新,你可以想着用程序去解决一些你在使用Excel过程中遇到的问题,每一个问题的解决,你都会发现自己得到了很大的进步.

好了,还是那句话,路在脚下,继续走,精彩会慢慢为你上演,让我们一起努力,共同进步。

在上面,我们简单介绍了VBA的开发环境、几个常用的窗口,并对对象、对象的属性、对象的方法、对象的事件等概念作了简单的介绍,贴子大家认真看了吗?有没有一点点的收获?学习成绩如何?

什么是对象?什么是集合?什么是属性?什么是方法?什么是事件?如何正确地表示它们? 这些,你都能回答了吗?

先沉思三秒钟,如果你不能回答,那请赶快回过头去,再看一遍,我们说VBA是采用面向对象的程序设计方式,这些都是很重要的概念,如果不弄清楚,实际应用时,你可能会感到手忙脚乱。

如果已经掌握了,那让我们一起继续本贴的内容。

这次,我们将继续单调的基本功练习,讲一些VBA里面的关键字,为程序设计打下基础,还是那句话,希望你不要嫌内容的单调,一口你永远也吞不下一个大胖子,学习是一个循序渐进的

过程。

------------------

数据类型、变量、常量、数组

====================

VBA的主要目的是什么?不用说了你也知道,当然是处理数据。某些数据存在于对象中,如工作表的单元格区域里,某些数据存在于我们自定义的变量中。

------------------------------------------------------- 1、数据类型

数据类型告诉计算机如何将数据存储在内存中,如以整数、字符串、日期等。

数据类型是变量的特性,数据类型包括:

数据类型 Byte Boolean Integer Long(长整型) 存储空 间大小 范围 1 个字节 0 到 255 2 个字节 True 或 False 2 个字节 -32,768 到 32,767 4 个字节 -2,147,483,648 到 2,147,483,647 Single (单精度负数时从 -3.402823E38 到 -1.401298E-45;正4 个字节 浮点型) 数时从 1.401298E-45 到 3.402823E38 负数时从 -1.79769313486232E308 到 Double (双精度8 个字节 -4.94065645841247E-324浮点型) 4.94065645841247E-324 1.79769313486232E308 Currency 8 个字节 (变比整型) ;正数时从到 从 -922,337,203,685,477.5808 922,337,203,685,477.5807 到

Decimal 没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,14 个字节 而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001 8 个字节 100 年 1 月 1 日 到 9999 年 12 月 31 日 4 个字节 任何 Object 引用 10 字节加字符串长0 到大约 20 亿 度 字符串长1 到大约 65,400 度 Date Object String (变长) String(定长) Variant(数字) 16 个字节 任何数字值,最大可达 Double 的范围 22 个字节Variant(字符) 加字符串与变长 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的背后,像一个?养在深闺未得见?的美丽姑娘,她飘在墙角的那缕模糊却美丽的身影对我们充满了诱惑,现在我们正在想法设法寻找她的联系电话,要想成功俘虏她,这一步能少吗?

看的没有动的快,动手操作才是学习的正确方法。发现问题,解决问题,这岂不是一个快乐的过程。 有人问:如何知道该定义变量为何种类型? ===========

这就要根据你的实际需要,再结合各种数据的的范围来看。 在编写程序的过程中,选择需要存储空间尽量小的数据类型来保存所需要的数据,这是很有必要的,虽然我们可以把变量设为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运行它,看看是什么结果?尝试修改一下定义的数据类型,看看修改后的运行结果! VBA函数 =========

用Excel的时间相信你也不短了,什么是函数就不再细说了。

与其他编程语言一样,VBA含有各种内臵的函数。很多的VBA函数都与Excel的工作表函数类似,或者一样。

使用VBA函数的的方式与使用工作表公式中函数的方式相同,在VBA代码中,我们可以使用很多Excel的工作表函数,例如Sum,Abs等。 例如:

复制内容到剪贴板 代码:

Sub myabs()

a = InputBox(\请输入数值:\提示\ labs = Abs(a)

MsgBox \你输入的值的绝对值为:\ End Sub

这是一个求绝对值的过程,通过InputBox提示用户输入一个数值给变量a,再用Abs函数求出变量的绝对值,最后通过MsgBox返回结果。

InputBox同MsgBox函数一样,是很常用的函数,关于它的功能及用法,请用绝招:抹黑,按F1,

但并不是所有的工作表函数在VBA里都可以直接调用,但由于WorksheetFunction对象包含在Application对象中,如果我们要在VBA语句里使用某个不能直接调用的工作表函数,只需要在函数名称前加上Application.WorksheetFunction语语即可。 如:在VBA里使用counta函数则代码为: application.worksheetfunction.counta(range(\ VBA里面的函数很多,可以简化我们的计算和操作,功能强大啊。但当你面对那一堆英文字母,是否为该怎么记住它们感到晕菜?有人对我说,记住常用的几个,其他的不用记那么清楚,有个模糊的印向,用时再翻Help,知道在哪里找就万事OK了。我觉得这个方法很好,现转送给你!

控制程序的流程,有判断、分支和循环三种语句。 接下来我们将一样一样地进行讲解。

===================== 程序流程控制—>if语句

==================== 1、if—then语句

这个句式相当于中文里面的?如果.......那么?。 格式:

if 逻辑表达式 then 语句块 end if

解释:如果逻辑表达式的结果为true,则执行语句块里的所有语句,否则执行end if后面的语句。语句块可以是一句指令或多条指令,也可以调用一个或多个过程,当然,也可以为空,就是没有语句。

如:要判断A1单元格是否已输入内容,设计程序: 复制内容到剪贴板 代码:

Sub test1()

If [a1] = \

MsgBox \单元格没有输入任何内容!\ End If End Sub

2、 if—then—else语句

这个语句相当于中文里面的?如果......那么......否则......?句式。 格式:

if 逻辑表达式 then 语句块1 else

语句块2 end if

解释:如果逻辑表达式的结果为true,则执行语句块1里的所有语句,如果逻辑表达式的结果为Flase则执行语句块2里的所有语句。

如:要判断A1单元格是否已输入内容,设计程序: 复制内容到剪贴板 代码:

Sub test2()

If [a1] = \

MsgBox \单元格没有输入任何内容!\ Else

MsgBox \单元格已经输入了内容!\ 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] = \

MsgBox \单元格没有输入任何内容!\ ElseIf [a1] Mod 2 = 0 Then

MsgBox \单元格的数能被2整除!\ ElseIf [a1] Mod 3 = 0 Then

MsgBox \单元格的数能被3整除!\ ElseIf [a1] Mod 5 = 0 Then

MsgBox \单元格的数能被5整除!\ Else

MsgBox \单元格的数不能被2、3、5其中之一整除!\ End If End Sub

IF语句.rar (6.7 KB)

程序流程控制——Select Case语句 =============================

Select Case语句同IF语句一样,也是条件判断的语句。

它的功能也可以用IF语句来完成。但是,当程序的条件太多,用IF语句来判断的话就存在一些不足了,比如程序是否美观?是否便于阅读?程序的执行效率等等。Select Case语句在执行的效率上,同IF语句相比,肯定是要快得多。 [Select Case语句的语法] Select Case 测试表达式 Case 条件表达式1 语句块1

Case 条件表达式2 语句块2 Case 条件表达式3 语句块3 ......

Case 条件表达式n 语句块n Case Else

语句块Else End Select.

当某个条件表达式与测试表达式相匹配时,则执行其后的语句块,否则执行Case Else后的语句块,然后结束Select Case块的执行。同IF语句一样,可以不要Case Else语句。 ?如对A1单元格的学生成绩进行等级评定,小于等于30分的为差,30分到59分的为不及格,60分到79分的为及格,80分到89分的为良好,90到100分的为优秀。?用Select Case语句来解决就是:

复制内容到剪贴板 代码:

Sub test()

If [a1].Value = \

MsgBox \单元格没有输入数字。\ Exit Sub ' 退出程序 End If

Select Case [a1].Value Case 0 To 29 MsgBox \差\

Case 30 To 59

MsgBox \不及格\ Case 60 To 79 MsgBox \及格\ Case 80 To 89 MsgBox \良好\ Case Else

MsgBox \优秀\ End Select End Sub

Select Case语句.rar (6.44 KB) Select Case语句.rar (6.44 KB)

需要补充一点的是,无论是IF语句还是Select Case语句, 都是可以进行嵌套的! 引用:

ggsmart的补充说明:楼上写的代码,我只考虑分数是整数的时候,这里我只是举个例子,目的是让大家认识Select Case语句,因为没有考虑小数和负数的情况.一旦出现29.5之类的,就都全是优秀.所以,程序本身并不全面.为此,38度OFFICE技术论坛的老朽对代码进行了修定,提供了另一段全面的代码,非常感谢!

代码:

'修订:38度:老朽

'网址:http://www.38duoffice.cn/bbs '日期:2009-7-1 上午 11:22:21 Sub Test()

If [a1].Value = \

MsgBox \单元格没有输入数字。\ Exit Sub ' 退出程序 End If

Select Case [a1].Value Case Is < 30 MsgBox \差\ Case Is < 60

MsgBox \不及格\

Case Is < 80 MsgBox \及格\ Case Is < 90 MsgBox \良好\ Case Else

MsgBox \优秀\ End Select End Sub

程序流程控制——For—Next 循环语句 ============================= 什么是循环?

这里我们指的循环是指重复地执行某项动作(语句块)。 同学们在操场上跑步,两万米长跑,每圈400米。?呯?,枪一响,开始跑,一圈,两圈,三圈......直到跑满50圈才停止。这里,同学们就是在循环地在操场的跑道上执行跑步的动作。

我们来看一下For—next 的句式:

For 循环变量=初值 to 终值 step 步长 循环体1 [exit for] 循环体2

next 循环变量

解释:从开始到结束,反复执行For和Next之间的指令块,除非遇到Exit For语句,将提前跳出循环。其中,步长和Exit For语句以及Next后的循环变量均可省略,步长省略的时候默认为 1。Exit for 语句是强制终止循环的语句,执行它后将退出循环,执行next后面的语句。

循环变量是一个变量,可以在循环体中对其进行修改,但一般就避免在循环体中对其修改。 对句式进行了初步的认识后,我们用这个句式来叙述上面学生跑步的问题。把它编成程序,20000米,要跑50圈,也就是要50次,同学们要在上面一圈,两圈。。。。直到满50圈才停止循环跑步,当然,如果你要提前退赛,就不用跑满50圈了。有

了这个思想,程序可以写成: Sub 循环跑步()

dim 圈数 as byte

for 圈数=1 to 50 step 1 If 学生.要求=退赛 exit for End If Next 圈数 End Sub

当然,这只是一个实例,帮助你对For—next语句的理解,下面我们来用一个实例来讲解For-next语句!

问题:求1到1000的自然数的和。程序编为: 复制内容到剪贴板 代码:

Sub mysum()

Dim Lsum As Long, i As Long For i = 1 To 1000 Lsum = Lsum + i Next

MsgBox \到1000的自然数和为:\End Sub

for_next-1到1000自然数的和.rar (6.14 KB) 以下代码由老朽提供 引用:

ggsmart说明:以下代码为38度OFFICE技术论坛的老朽版主提供,主要是帮助大家对VBA语句的认识. 复制内容到剪贴板 代码:

撰写:38度:老朽

'日期:2009-7-1 上午 11:40:59 Sub 求1到10000之间偶数和() Dim I&, J&

For I = 0 To 10000 Step 2 J = J + I Next

MsgBox \到10000之间偶数和为\End Sub

复制内容到剪贴板 代码:

'撰写:38度:老朽

'日期:2009-7-1 上午 11:40:59 Sub 求1到10000之间偶数和2() Dim I&, J&

For I = 10000 To 1 Step -2 J = J + I Next

MsgBox \到10000之间偶数和为\End Sub

复制内容到剪贴板 代码:

'撰写:38度:老朽

'日期:2009-7-1 上午 11:40:59 Sub 求1到10000之间奇数和() Dim I&, J&

For I = 1 To 10000 Step 2 J = J + I Next

MsgBox \到10000之间奇数和为\End Sub

复制内容到剪贴板 代码:

'撰写:38度:老朽

'日期:2009-7-1 上午 11:40:59 Sub 求1到10000之间奇数和2() Dim I&, J&

For I = 9999To 1 Step -2'此句于2009年8月18日纠正 J = J + I Next

MsgBox \到10000之间奇数和为\End Sub

引用:

感谢109楼artemis_xu朋友对以上代码的纠正! 复制内容到剪贴板 代码:

'撰写:38度:老朽

'日期:2009-7-1 上午 11:40:59

Sub 求1到10000之间能被5整除的数之和() Dim I&, J&

For I = 0 To 10000 Step 5 J = J + I Next

MsgBox \到10000之间能被5整除的数之和为\End Sub

复制内容到剪贴板 代码:

'撰写:38度:老朽

'日期:2009-7-1 上午 11:40:59

Sub 求1到10000之间能被5整除的数之和2() Dim I&, J&

For I = 10000 To 1 Step -5 J = J + I Next

MsgBox \到10000之间能被5整除的数之和为\End Sub

程序流程控制——For—Each 循环语句 ===============================

有了前面对循环一词的理解,这里我们不用再多说,如果你知道了For—next语句的工作原理,这里再来学习For—each循环以及下面我们接着要讲的句式,那就相当简单了,同样的工作原理。

学会了吃苹果,那么离会吃梨的道路还会远吗?

呵呵,只是开个小小的玩笑,下面我们继续,首先来看看For—Each语句的句式:

For Eacn 元素变量 In 对象集合或数组名称

语句块1 [Exit For] 语句块2 next 元素变量

和上面For—next句式是一样的工作原理。

这里的?元素变量?是用来遍历集合或数中中元素的变量,它从集合或数组的第一个元素开始,直到最后一个元素,然后退出循环。

这里我们举个例子,把当前工作薄中工作表的名称写在A列,程序为: 复制内容到剪贴板 代码:

Sub shtname()

Dim i As Integer, sht As Worksheet i = 1

For Each sht In Worksheets Cells(i, 1) = sht.Name

i = i + 1 '让写入名称的单元格下移一行 Next End Sub

for-each返回工作表名称.rar (7.52 KB) for-each返回工作表名称.rar (7.52 KB)

程序流程控制——Do While语句 ===========================

Do While也是循环语句,它分为两种情况,一种是把循环条件放在开头,一种是把循环条件放在结尾。 1、开头判断循环条件 语句格式:

Do Wihle 循环条件 语句块1 [Exit Do] 语句块2 Loop

首先判断循环条件,条件为真则执行Do到Loop之间的语句。 2、结尾判断循环条件 语句格式: Do

语句块1 [Exit Do] 语句块2

Loop Wihle 循环条件

先执行一次Do到Loop之间的语句,再判断循环条件,满足条件则进行循环。

两种格式的区别:因为第二种格式是把循环体放在尾部,得先执行一遍语句再进行循环条件判断,所以,同样的条件,第二种格式的循环会比第一种多执行一次循环部份的语句。 我们用Do While语句来解决求1——1000的自然数的和的问题: 复制内容到剪贴板 代码:

Sub mysum()

Dim Lsum As Long, i As Long i = 1

Do While i <= 1000 Lsum = Lsum + i i = i + 1 Loop

MsgBox \到1000的自然数和为:\End Sub

do while1到1000自然数的和.rar (6.19 KB) do while1到1000自然数的和.rar (6.19 KB)

程序流程控制——Do Until 语句

这个和Do While语句类似,它也有两种形式,学了Do While 语句,再看这个,就可以无师自通了。下面就简单介绍下: 1、开头判断循环条件 语句格式:

Do Until 循环条件

语句块1 [Exit Do] 语句块2 Loop

2、结尾判断循环条件 语句格式: Do

语句块1 [Exit Do] 语句块2

Loop Until 循环条件

执行Do 和Loop之间的指令,直到循环条件为真时退出循环。

直到循环条件为真时退出循环,这是Do Until 与 Do While的区别。而它两种语句格式的区别,也是第二种比第一种多执行一次循环部分的语句。 还是求1——1000自然数的问题,这次我们换用Do Untile语句: 代码:

Sub mysum()

Dim Lsum As Long, i As Long i = 1 Do

Lsum = Lsum + i i = i + 1

Loop Until i > 1000

MsgBox \到1000的自然数和为:\End Sub

do until1到1000自然数的和.rar (6.19 KB) do until1到1000自然数的和.rar (6.19 KB)

是的,你看了上面的代码,觉得和楼上我们写的代码变化并不大。这里我用的是第二种格式(结尾判断)的语句,你可以试着用第一种句式写一写,或者改一改其他的问题.这里,我只是举个例子,路还得让你自己走!

程序流程控制——Go to 语句 ===========================

Go to 在英语里是什么?相信大家的英语都比我好得太多,不用多说。其实Go to 语句的作用用定两个英语单词就说明问题了,?Go to 地点?就是去到哪儿的意思。 Go to 语句是将程序转到指定的标签的语句位臵,然后继续往下执行。Go to 语句通常用来作错误处理。

同样的,还是用Go to 语句来做1——1000自然数的和: 代码:

Sub mysum()

Dim Lsum As Long, i As Long i = 1

x: '为go to 语句设臵的标签,必须以英文状态下的冒号结尾 Lsum = Lsum + i i = i + 1

If i <= 1000 Then GoTo x '如果i<=1000,则程序跳到标签X处

MsgBox \到1000的自然数和为:\End Sub

go to 1到1000自然数的和.rar (6.34 KB) go to 1到1000自然数的和.rar (6.34 KB) 注意:为Go to 语句设臵的标签必须以英文状态的冒号结尾。 有人说,为了方便程序的阅读,规范程序,在程序里也避免少用Go to 语句,我很赞同,也希望你们能养成这个习惯。 用户窗体

-----------------------

用户窗体(UserForm对象)是VBA的另一类对象。它表现出来是一个窗口或对话框,如前面我们说的MsgBox与InputBox语句弹出来的都属于窗体。使用窗体可以提供一个形象的用户界面。同我们可以在工作表(WorkSheet)上在添加不同的控件一样,在这个界面上,我们可以添加命令按钮、标签、图像、列表框等控件,用户可以通过修改控件的属性、编写不同的事件过程在程序运行过程中与程序进行交互。 1、添加窗体

如果你还没有忘记怎么插入模块?那请用同样的方法插入

一个用户窗体。

Alt+F11快捷键打开VBE编辑窗口,在工程资源管理器窗口中单击右键,选择?插入——用户窗体?命令。

1-1.jpg (33.67 KB)

Excel为用户窗体取名,同为工作表、按钮等取名一样,采用?老大,老二,老三……?的取名方式。所以新插入的用户窗体默认名称为?UserForm1?,如果再继续插入窗体,就是?UserForm2?,接着是?UserForm3?……

当然,你可以为它重新取一个你喜欢的名字,新名字叫大花二花,或者是大狗二狗,随你了,为了方便学习,这里我们统一为其更名为?我的窗体?,方法为:在工程资源管理器中双击窗体对象,在属性窗口中重新修改?(名称)?(对象的name属性)为?我的窗体?即可。修改完成后,可以在工程资源管理器窗口中看到相应的名称已经改变了。

1-2.jpg (81.78 KB)

这时,窗体的?名称?已经修改好了,再看看窗体,左上角还显示着?UserForm1?,这就相当于贴在一个按钮表面的标签,想要修改它,只需要修改对象的?Caption?属性即可。用改?名称?的方法,我们把这个窗体的?Caption?属性修改为?我的第一个VBA窗体?。

就像你家里贴的地板一样,新建的窗体的大小样子都一样。但是我们根据自己的需要对其进行美化或修改。如大小,背景颜色,背景图片等等,我们可以手动在属性窗口里对其进行修改,也可以程序中用代码进行修改。如修改该窗体的宽度,代码设臵为: 代码:

我的窗体.Width = 500 '500是你需要修改后的宽度,以磅(Point)为单位

动手试一试,在属性窗口里设臵?我的窗体?宽300 Point(Width属性),高200 Point(Height属性)。 2、为窗体添加界面元素

窗体就像一个舞台,舞台上得有演员才能和观众进行互动。同样,我们得为窗体这个舞台添加演员,演员可以是命令按钮、标签、文字框等等,你可以根据自己的剧本的需要安排不同的角色。

向窗体添加控件,同在工作表中添加窗体控件一样。如果你现在的VBE编辑窗口中没有?工具箱?,请通过?视图——>工具箱?菜单命令,或单击?工具栏?上的?工具箱?按钮打开它。

1-3.jpg (55.44 KB)

想知道?工具箱?里的控件是哪一种是?命令按钮?,哪一种是?标签?,哪一种是?文字框?,只需要把鼠标指针移到相应的控件上面,即会显示相应的说明。

在工具箱里用鼠标点选相应的控件,在窗体上按下鼠标左键,拖动即可将控件添加到用户窗体。控件的大小、在窗体上的位臵我们可以通过鼠标进行修改,当然,同修改其他属性一样,我们也可以在属性窗口或程序的过程中用代码进行修改。 别闲着,动手试一试:

(1)向窗体添加一个命令按钮

改按钮名称为?确定?。设臵显示在按钮上的文字(Caption属性)为?完成?,高25(Height属性),宽60(Width属性),距?我的窗体?左端220(Left属性),距?我的窗体?顶端80(Top属性)。 引用:

当然,上面只是教你怎样在属性窗口里对控件的属性进行修改。要求不是太完美的时候,我们可以在窗体上用鼠标拖动修改一下就可以了。

(2)向窗体添加一个标签 改标签的名称为?说明?。设臵字体(Font属性)为?宋体,五号,斜体?,显示的内容(Caption属性)为?请输入内容?(慢速双击激活控件即可输入)。 (3)向窗体添加一个文字框 改文字框的名称为?内容?,设臵字体(Font属性)为?楷体五号字?,字体颜色(ForeColor属性)为?红色?。

回到窗体设计模式,按F5键(或者执行?运行——>运行子过程/窗体?菜单命令,或单击工具栏上的?运行子过程/窗体?命令按钮),完整的一个用户窗体就显示在桌面上了。

1-4.jpg (23.78 KB)

当然,因为没有添加任何的VBA指令,此时,窗体里的控件是不会工作的。

(4)为命令按钮添加事件过程

上面的标签,文字框,命令按等控件(ActiveX控件,同我们刚开始说的窗体控件是有区别的)都属于对象,我们可以通过编写相应的代码设臵其属性,调用其方法,响应其事件来达到我们需要实现的操作。

比如在?我的窗体?中,如果需要在点击?完成?按钮(按钮名称为?确定?)后,用一个Msgbox告诉我们,文字框(名称为?内容?)里输入的是什么内容。

有了这个思想,我们可以模拟把程序写为: Sub 确定_单击()

Msgbox ?文字框里输入的内容是:? & 内容.输入的内容 End Sub

有了这个模拟的程序,再来写就简单了。

?单击?是?确定?的一个事件,即Click事件,?内容.输入的内容?是读取?内容?的Value属性。 这样,我们的程序实际上是: 代码:

Sub 确定_Click()

MsgBox \文字框里输入的内容是:\内容.Value End Sub

回到窗体,双击按钮,切换到代码模式,在左面?对象列表?中选择对象?确定?,右面事件列表中选择事件?Click?,将Sub与End Sub之间输入代码MsgBox \文字框里输入的内容是:\内容.Value。回到设计模式下,按F5键,再次运行窗体,在文字框里输入内容,单击?完成?。

也许你需要在文字框里什么也没有输时,单击按钮后,提示我们?文字框里没有输入任何内容?,并退出程序。可以的,加一个If—Then语句即可。如果需要将文字框里的内容换行显示,那么在提示内容与显示内容之间再连接一个?Chr(13)?,就个的作用相当工作表中的?Char(10)?,这里不再多说。 我最后写的代码是: 代码:

Private Sub 确定_Click() If 内容.Value = \

MsgBox \文本框里没有输入任何内容!\

Exit Sub '退出sub过程,不再执行下面的语句 End If

MsgBox \文字框里输入的内容是:\内容.Value End Sub

3、显示窗体

显示窗体就是把窗体显示给用户。 显示窗体可以调用窗体的Show方法。 窗体的显示模式有两种:

(1)模式窗体:窗体显示后将停显示之后的代码直到退出或隐藏此窗体,并且必须退出或隐藏此窗体后,才可以操作非此窗体的其他界面元素。

也就是说,当你使用模式窗体显示某窗体的时候,当程序执行完?显示窗体?这条命令后,将暂停执行程序里剩余的语句,真正这个窗体被隐藏或退出。关且当窗体显示出来以后,你不能激活该窗体以外的任何区域。

(2)无模式窗体:窗体显示后会继续执行程序里余下的语句,而其他的窗体或界面也可以进行操作。 显示窗体的语句:

(1)模式窗体的显示代码: 窗体名称.Show vbModal

也可以写成:窗体名称.Show 1 (2)无模式窗体的显示代码: 窗体名称.Show vbModeless 也可以写成:窗体名称.Show 0

引用:

悄悄告诉你:因为对于Show方法,如果不指定模式,则默认为模式窗体,又因为我很懒,所以我的习惯是:当我需要用模式窗体的时候,就直接?窗体.Show?,需要无模式的时候就?窗体.Show 0?,多个0少个0而已,懒得去记那有模式无模式的字母,我英文差,反正看了也不一定认识。 4、关闭窗体

当不再需要使用某个窗体后,我们需要把它关闭。当然,每

一个窗体上都有?关闭?按钮。但这肯定不能满足我们在程序的设计过程中的需求。

我们可以通过Hide来隐藏窗体。代码为: 窗体名称.Hide

也可以通过Unload来卸载窗体。代码为: Unload 窗体名称

二者都可以关闭窗体,但是却是有区别的。Show一个Hide的窗体比Show一个Unload的窗体用的时间要短。所以,当你需要反复使用某个窗体的时候,建议你用Hide而不用Unload。

------------------------------------------------------- 上面讲的这些内容,打开VBE窗口,插入窗体,添加控件,修改属性,编写事件过程等等,这些,你都跟着做了吗?如果你已经做了,那最后我再留给你一点事情算是作业吧:

(1)插入一个模块,编写两个Sub过程,分别以?模式窗口?和?无模式窗口?显示?我的窗体?(可在显示窗体命令的下一行再编写另外一条指令查看两者在程序执行过程中的区别);

(2)在工作表上插入两个窗体控件的按钮(记住是窗体控件),分别改按钮上显示的字为?模式窗体?和?无模式窗体?,并把刚才编写的两个宏分别指定给它们;

(3)再次进行入?我的窗体?的设计模式,添加两个按钮,分别改其?Caption?属性为?隐藏窗体?和?卸载窗体?。分别为两个按钮编写响应其相应事件的代码,使得当单击?隐藏窗体?按钮时,隐然?我的窗体?,单击?卸载窗体?时,卸载?我的窗体?。

弄好后,你可以点击工作表上的铵钮,调出窗体,看看自己的第一件作品了。

为避免大家都不习惯,我还是不客气好了。。。。。11楼的代码 为什么前面要if呢?为什么不全部case? Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Select Case [a1].Value Case \

MsgBox \未输入任何字符\

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

Top