资源描述
初识VBA
既然题目是初识VBA,那么我想先给大家一个直观的感受——什么是VBA?,往往在一些EXCEL的教材中,都会讲:VBA是一种自动化语言,它可以使常用的程序自动化,可以创建自定义的解决方案。就我看书学习的经验来说,我感到这样的定义式的描述带有很典型的中国式教材的风格,然而却不能让人立即理解,那么这样的定义有什么用呢?我给VBA下的定义是:VBA是一些代码的组合。可能这个定义没有上面教材的定义那么严谨和准确,但我想你一看就应该能明白,原来VBA就是写代码,或者说就是写程序。(如果掌握了VBA,居然我也能写程序了~~惊喜吧?)
那么你用了这么久的EXCEL,可能从来没在EXCEL的XLS文件中看到过代码,难道就写在单元格里?那我就带你去找找,VBA的代码藏在哪里吧,这也正式我今天要谈的第二个问题。当你打开一个EXCEL文件,你只能看到由许多单元格组成的工作表,这时,你可以通过【视图】菜单的【工具栏】项目,打开一个工具栏,名字叫“控件工具箱”,从左往右属第三个按钮,名字叫“查看代码”,点一下,就可以打开VBA代码编辑窗口。更简单的方法是,通过【ALT】+【F11】的快捷键,打开VBA代码编辑窗口,看到了吧,原来代码就是藏在这里的哦~~~
怎么写代码呢?你也太心急了点吧,你还没掌握命令、语法、关键字、对象、事件、属性等等内容,就想写代码?一口是吃不成个胖子的,还是让我来带你先认识下这里的每个角落吧,就像进了一间陌生的屋子,总归每个角落都得转到吧?最上面的几行,和EXCEL以及每一个微软平台下的应用程序都一样,总归是标题栏、菜单栏、工具栏等,接下来,看左边,有一个纵栏,写着“工程---VBAProject”,这里是工程资源管理窗口,里面通过树形列表展示了这个XLS文件(或者标准的应该叫“工作簿”)所包含的各个工作表对象以及工作簿对象本身。有什么用呢?你双击任何一个SHEET,比如SHEET1,试试?是不是在右侧打开了一个文档编辑窗口?那么你就能明白,如果是SHEET1的代码,就应该写在这里了,那么SHEET2的呢?当然就写在双击SHEET2后打开的窗口里咯~那么SHEET3呢?你烦不烦啊~~~人家都明白了!!!再看看右侧的文档窗口吧,顶上有两个下拉列表框,一个写着“通用”,一个写着“声明”,什么东东啊?左边的那个是对象列表框,可以让你选择在这个SHEET里面包含的所有对象,右边的那个是过程列表框,可以让你选择和左侧当前选中的对象关联的系统或自定义过程。那么什么是对象?什么又是过程呢?今天没时间了,什么?领导要我马上去开会?不会加工资了吧?哈哈,明天继续!
昨天我们在VBA代码编辑器里转了一圈,是不是有别有洞天的感觉啊?可是,这里对于大家都是陌生的环境,到底该怎么用这里的每一个工具呢?别心急,且听我慢慢道来。在讲代码之前,我首先必须介绍一下OOP的概念和基本知识。去去去,怎么你也学着那些教材里挑些专用名词来忽悠我们啊?呵呵,因为这样才能体现作者,也就是本人的水平啊!(别扔鸡蛋,说你呢!下次不说了,还不行吗?)所谓OOP就是指Object Oriented Programming,即面向对象的程序设计方法,这种程序设计思想主要是相对于以前的面向过程的程序设计方法而言的。下面我就给大家讲个故事,很久很久以前,写程序还是很专业很神秘的一种技术活,这个时候的程序员写出来的东西,是必须要按照他给你安排好的步骤来执行的,比方说,你运行一个程序,必须先输入一条打开数据表的命令,然后才能对这个数据表进行操作,否则就会报错,甚至对于有些设计不完善的程序就会崩溃。这样写出来的程序一个是缺乏灵活性,难道作为用户就不能自己决定先浏览还是先打印?另一方面,对于那时候写出来的程序,如果将来要修改或扩充功能,那将牵一发而动全身,也为在设计这些功能的时候是一步一步安排好的,如果要修改后面的步骤,必然会影响到前面的代码,这样导致了程序员非常累。(所以高薪啊~~其实也不过是重复劳动,呵呵)。后来,出来了一个聪明人,写出了一个叫“Smalltalk”的语言,这个语言本身并没有什么特别的地方,但其中其中表现出来的接近现实形态描述的对象思想却让整个软件设计理论提升了一个新的层次。说这些和我有什么关系啊?呵呵,下面的东西就和你有关了,也为现在的基于可视化架构的程序设计基本都引入了OOP的思想,所以如果你将OOP中最主要的概念搞清楚了,那么将对以后的学习奠定扎实的基础。
面向对象的程序设计思想中主要包含四个概念。对象、事件、方法和属性。别看这些概念这么复杂,我给大家举个例子就明白了。对象是什么?就像现实中看得见摸得着的东西一样,是实实在在的东西。比如,一个苹果,就可以作为一个对象,围绕对象概念,延伸了一个“类”的概念,什么是类呢?苹果就是一个类。晕,刚才还说苹果是对象呢,怎么一会又成了类了?其实作为类而言的苹果的概念,就是指区别于梨和橘子的苹果类的概念,而不是具体指某一个苹果。红苹果、绿苹果都属于苹果这个类,哪怕烂苹果也是。(别扔啊!)我们在设计程序的时候,可以定义一个自己的类,这样以后要用到这类对象的时候,就可以通过这个类来派生出来,而不用每次都去写定义。还有个好处是,以后修改对象属性的时候,就可以通过修改类的属性来达到同时修改通过这个类派生的所有对象的属性的目的。对象的基本概念还有三个,属性、方法和事件。苹果的颜色可以看作苹果这个对象的一个属性,苹果的大小也可以看作他的一个属性,你自己还能说出什么属性吗?恩,重量、好坏、产地等等。慢点,价格是不是啊?这个问题留给大家思考吧。从上面的例子可以看出,属性是描述对象在某一方面的特征的,通过不同属性的值就可以区别开不同的对象。方法呢?对于苹果来说“吃”就是方法,啥?吃苹果也是方法?恩,别馋啊,对苹果而言,吃就是方法,因为这个是可以作用于这个对象的,还能举个例子吗?比方相对于表格对象的方法就可以是打开、关闭、修改等。方法是用来作用于对象,使其产生某种变化的。事件是什么呢?事件就是被设计用来触发某些代码来自动执行的,这个就叫做事件驱动机制。还记得刚才我们谈到的面向过程的程序设计方法的缺点吗?对,代码的执行顺序是由设计者在设计时指定的。这种吃力不讨好的事情,劝大家以后还是少做做。我们有了事件驱动机制以后,这样的情况就可以避免了。现在,可以通过将代码写在可能发生的事件中的办法,由用户决定啥时候运行这些代码,只要程序运行时,用户的操作行为触发了相应的事件,那么该事件中定义的代码,就会被自动执行了。
因为大家都刚接触VBA,可能光听我介绍还没有直观的感受,为了帮助大家理解,下面先介绍两个方法,可以让大家看到更多的东西。首先要介绍的是对象浏览器。打开这个对话框有三种方法。(中国的教材和教育模式下的考试,最喜欢列举完成一件事情的方法,我就纳闷,只要能解决问题,知道了一条路,干嘛还要打破沙锅问到底?)一个是通过【视图】菜单的【对象浏览器】项目,另一个是在工具栏上点击【对象浏览器】按钮。最方便的是按【F2】快捷键。打开了以后,大家看到了一个新的窗口,这里列举了三种信息,最上面的部分是用来搜索和查找信息的,中间的部分分了三栏来分别列举“库”、“类”和“成员”信息。最下面是提示和说明部分,用来说明当前选中对象的信息。为什么要介绍对象浏览器呢?大家通过这个工具可以搜索到和EXCEL以及VBA有关的各种各样的“类”和“对象”。顺便说一下,这里说的“成员”基本相当于对象、属性、方法和事件;类是成员的上级;很多类又组成了一个类库,在这里叫做“库”。以后大家如果有不明白的类,就可以在这里找到这个类有哪些对象、属性、方法和事件,以及他们之间是什么层级关系。其次,简单介绍下如何使用帮助。其实按照微软的体系,VBA的帮助包括了两个部分,一个是本地脱机帮助,也就是安装完OFFICE软件就自带的帮助,这里只是简单的介绍了VBA的基本信息。另一个部分则被微软放在了MSDN里面,这是微软单独提供给微软平台的开发人员的独立帮助工具,其中包含了非常详细的各种编程信息、技巧和案例。通过仔细研读MSDN里的内容,可以快速掌握之前不了解的编程知识,并且MSDN总是被微软的工程师们不断更新并保持着最新的状态。
下面,我们就继续昨天的内容,接着讲面向对象的编程。什么?昨天的已经都忘记了?那就先回头去看看再继续吧。今天主要给大家介绍VBA中最常用到的一些关键字。什么是关键字,关键字就是那些在OFFICE软件里已经被定义好了特定含义和用法的字符串。比方说,“IF”这个字符串,表示“如果”的意思,在VBA里用来表示条件语句的起始,那么关键字和普通字符串有什么区别呢?关键字被规定为不可以用来表示变量名、过程名、函数名等用户定义的信息,只能根据系统规定的含义使用。也就是说,你如果有个变量起个名字叫“IF”,你写一条赋值语句“IF = 1”,这样系统在编译的时候就会提示一个错误,而不能通过编译和运行。想看看VBA里一共有多少个关键字吗?从明天开始,我们将开始一一给大伙讲解,欢迎继续关注。
代码起步——关键字
第一课
今天开始,我们将正式进入代码的学习阶段。我多年以来的授课经验告诉我,学代码应该从关键字开始。下面列举了一些常见的关键字给大家先了解下。
【框架类关键字】
工程(Project): 是指用于创建一个应用程序的文件的集合。
对象(Object): 可控制的某个东西,例如窗体和控件。
窗体(Form): 应用程序的用户界面。
控件(Control): 指的是各种按钮、标签、文本框等。
属性(Property):是指对象的特征,如大小、标题或颜色。
工作表(Worksheet):指EXCEL文件里的工作表,例如sheet1、sheet2等。
模块(Module):指在VBA工程中存放独立于用户定义对象代码的容器。
过程(Sub):容纳和组织代码的限定符号,一般和End Sub联用,不返回结果。
函数(Function):容纳和组织代码的限定符号,一般和End Function联用,并返回结果。
【控件类关键字】
标签(Label):用来显示文本。
文本框(Textbox):用来提供给用户输入文本。
命令按钮(CommandButton):用来组织和提供程序功能。
列表框(ListBox):用来提供给用户选择列表中的数据。
组合框(ComboBox):用来提供给用户下拉选择列表中的数据。
选项按钮(OptionButton):用来提供给用户指定单项数据,一般成组使用。
复选框(CheckBox):用来提供给用户指定多项数据,一般成组使用。
【声明类关键字】
Public:声明公共类型的数据;
Private:声明私有类型的数据;
Static:声明静态类型的数据;
Dim:声明数据类型;如:Dim myCell As Range
reDim:定义未显式声明的数组的维数和元素;
Const:声明常量数据;如:Const limit As Integer = 33
As:一般用于声明数据类型中的“As Type”子句;
Type:声明用户自定义数据类型;
【数据类型关键字】
Byte:字节类型;
Integer:整型数值类型;
Long:长整型数值类型;
String:字符串类型;
Boolean:逻辑类型;
Single:单精度类型;
Double:双精度类型;
Currency:货币数值类型;
Decimal:可以容纳小数的数值类型;
Variant:任何数字值或字符串值;
Object:对象类型;
用户自定义:利用TYPE语句由用户自己定义的数据类型。
【运算符关键字】
这类关键字太多了,而且有很多种分类方法,比如按参数个数分为单目运算符、双目运算符、三目运算符和多目运算符等,按参与运算的参数类型可以分为数值运算符、字符运算符、逻辑运算符、日期运算符、字节运算符等,按照运算符的作用范围可以分为过程级运算符、函数级运算符和模块级运算符。
【程序结构类】
IF...ELSE...END IF:分支判断选择语句;
DO WHILE...LOOP:先判断后执行循环语句;
DO...LOOP WHILE:先执行后判断循环语句;
FOR...NEXT:限定次数循环语句;
GOTO...:无条件转移语句。
第二课
记得我在学写程序的时候(那是很久很久以前的事情了),我最怕的就是看到这些E文字母。我经常去看HELP里面的例子,然而那里面居然连变量和过程的名字都是很长的E文。没办法,谁叫人家微软是美国公司呢!(记得之前有过几个用中文写程序的编辑器,甚至还热过一阵某语言,但随着时间的流逝,好像现在也不知去向了......)那么怎么样才能记住这些又长又难记的单词呢?不用记,你如果用VBA编程,你会发现只要你输入了正确的第一个关键字之后,可以通过支持VBA语言的编辑器自动提示输入接下来的单词,是不是很简单啊~其实多使用几次,你也就记住了。还有一个可以判断是否输入正确的方法,就是你总是用小写字母书写关键字,如果正确,编辑器会自动修正你录入的关键字的第一个字母为大写。
Project,中文翻译为工程、项目等。这个关键字在VBA中表示一个工作簿所关联的代码的总容器。所有和这个工作簿(XLS文件)关联的代码,都装在这个容器里。但这个容器不仅仅装代码,还能装好多东西,比如工作表、模块、过程、函数等。那么这个容器是不是一个对象呢?请大家结合前面的讲解思考下这个问题?答案是肯定的。(如果你答错了,请接着往下看;否则请跳过下一段。)
Object,对象,实体。在VBA中,工程、窗体、控件、工作表、模块等无一不是对象,因为这些都是实体,具备了独立存在的所有条件。比如,我问你书是对象嘛?是,因为书可以独立存在。那么颜色是对象嘛?不是,因为你无法单单拿出来一个叫“颜色”的东西,它只能作为其他东西的一种属性而存在。同样,工程,在VBA中是独立存在的,可以作为对象来看待。窗体、控件、工作表、模块也是一样。还有个小提示给大家,大家以后看到代码中某个对象名称后面跟了个S,在E文里应该表示复数,即多于一个的意思。那么在VBA中表示什么意思呢?表示多个对象放在一起,我们给它们一个名字叫“集合”。集合是对象嘛?不是,是多个对象放在一起。这个千万要注意,因为中文是没有复数的表示方法的,所以不能理解为“一个人是人嘛?是;一群人是人嘛?当然是!”,那就错了,在VBA里“一群人”不是人,是人的集合!那么你可能又会将集合同我们之前讲的“类”搞在一起了,类是对象的抽象,还拿书做例子,一本实实在在的书是一个对象,它可能是文学书,也可能是计算机书,当然可能是红色的,也可能是绿色的。而如果你脱离了具体的书而说“书”的概念,那么这时就指书这个类了。一个典型的例子是来自于生物界的分类。比如某只麻雀和某只鸽子,都是具体对象,而麻雀和鸽子都可以作为独立的一类鸟这个概念来描述,这时应该说成是麻雀类和鸽子类,同时它们又都属于鸟类这个概念,所以在类这个东西里,是可以分很多层次的,但除非具体到某一只鸟,不然就都是类的概念,而不是对象。集合呢?一群麻雀或者一群鸽子,就是集合,因为它们是由具体的很多只麻雀或鸽子组成的。干嘛费那么大劲说这些概念呢?可能你听得都快睡着了。但我还是要说,因为如果你不弄清楚类、对象和集合等概念,那么在以后写代码的时候,你就会犯糊涂,“怎么我写了一个‘对象’,就是不能用它的某个属性或方法呢?”,其实,很有可能你把对象写成了类或集合,因为他们就差一点点。(比如Row可以作为一个类,也可以作为一个对象,就看你如何声明它,同时,Rows就是一个集合)。
我还要讲一下如何使用类、对象和集合。类一般在声明部分使用,比如DIM A As Range,这里Range就表示“行”这个“范围”类,而A被声明为属于“行”这个类的类型的变量,换句话说,A在经过这样的声明以后,就可以用来引用某个具体的行对象了。比如Set A = Sheet1.rows(1)。那么这时,A就可以代表第一行这个对象了。这里的ROWS代表Sheet1的所有行对象的集合。一般集合有一个属性,叫做COUNT,表示在这个集合中的对象的个数。同时,要用集合表示具体对象时,要在集合名称后加上一对括号,里面填写对象的索引值或名称。
Form,窗体。你一般在Windows里运行的程序,都具备可视化的功能。那么这就是Form的功劳。通过引用FORM对象,你可以对这个工程里的一些窗体进行属性的设置、事件的定义以及运行某些方法。
Control,控件。 指的是各种按钮、标签、文本框等。它们可以装饰你的窗体,并在窗体中提供用户各种功能。从某种意义上讲,窗体也可以看做是控件的容器。
Worksheet,工作表。指EXCEL文件里的工作表,例如sheet1、sheet2等。通过引用这个对象,可以对工作表以及下级对象的属性进行设置、事件进行定义、方法进行执行。
Module,模块。指在VBA工程中存放独立于用户定义对象代码的容器。如果你想定义一些变量、过程或函数,并且想在各个对象(比如Sheet1、Sheet2等)中都能使用,并且可以互相传递值。那么就应该将这些声明或代码写在模块中。详细的以后用到再详述。
以上讲的都是对象,请大家参考对象的用法,具体操作一下如何声明、如何引用它们。至于如何通过对象设置属性、定义事件和执行方法,我们在具体讲解各类对象的时候再详细阐述。
Sub,过程。容纳和组织代码的限定符号,一般和End Sub联用,不返回结果。Function,函数。容纳和组织代码的限定符号,一般和End Function联用,并返回结果。这两个概念,本来应该在代码里讲的,这里只是提示一下。大家只要明白一个概念,除声明语句外其他代码都应该放在这两种容器内。
Property,属性。是指对象的特征,如大小、标题或颜色。最后讲讲这个。还记得上面讲到的对象的声明和引用的例子吗?刚讲过,应该不会忘吧,否则应该回头重新看下这篇文章了。现在,A已经被声明为一个Range类对象,并且已经赋予A引用为Sheet1的第一行了。那么如果想对Sheet1表的第一行设置为值都等于0,应该如何做呢?其实只要对Range类对象的一个Value属性设置一下就可以了,即:A.value=0。把上面所有的代码都放在Sheet1的一个叫“Worksheet_SelectionChange”的事件中,然后随便用鼠标点一个单元格试一下,是不是第一行的所有单元格都是0?恭喜你,写出了第一个完整的程序!不仅如此,你还可以在设置属性的语句后面,再写一句“A.Select”,这个是什么意思?先运行下试试(别忘记先保存)。是不是在将第一行都赋值为0以后,又把第一行都选中了?这里执行了Range类对象的一个叫“Select”的方法,作用是选中对象。回过头来想想,事件是什么?看下这个事件的名称吧:Worksheet_SelectionChange,翻译过来就是“工作表的选中项目发生改变”,也就是说只要该工作表(Sheet1)中的选中位置发生了变化,那么这个事件就会被触发,其中的代码就会被自动执行。现在明白什么叫“事件触发机制”了吧?换了以前基于过程的编程方法,那么必须规定啥时候这个单元格会被选中,而用户必须在这个规定的时候选中这个单元格,而现在有了事件触发机制,随便什么时候,只要满足事件触发的条件,这个动作就会被执行。
今天讲的所有的代码总结如下,你可以直接把它们复制粘贴到Sheet1的代码集中:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) '声明一个Worksheet_SelectionChange事件的私有过程
Dim A As Range '声明一个变量A,并制定为Range类型
Set A = Sheet1.Rows(1) '将A赋值为(引用)Sheet1工作表的第一行
A.Value =0 '设置A变量(表示Sheet1工作表的第一行)的Value属性值为0
A.Select '执行A变量的Select方法
End Sub '事件过程结束标志
具体示例程序见下面的附件。(打开EXCEL表格后,可以通过按“【ALT】+【F11】”的方法打开代码编辑窗口,并通过双击左侧Sheet1工作表的方法打开该工作表下的代码集)。
第三课
【控件类关键字】
标签(Label):用来显示文本。
文本框(Textbox):用来提供给用户输入文本。
命令按钮(CommandButton):用来组织和提供程序功能。
列表框(ListBox):用来提供给用户选择列表中的数据。
组合框(ComboBox):用来提供给用户下拉选择列表中的数据。
选项按钮(OptionButton):用来提供给用户指定单项数据,一般成组使用。
复选框(CheckBox):用来提供给用户指定多项数据,一般成组使用。
先来说说,什么是控件,顾名思义,控件就是提供给用户控制程序运行的组件。回忆一下,以往我们用过的程序很多,都用过哪些控件呢?可能之前都没有注意,但现在既然要做程序给别人用,就得注意了。我们看到,一般在我们打开的窗口上,都会有些文字,这些文字只是提供了一些信息,比如告诉你这里是输入姓名的,那里是选择性别的等等,这些文字用户并不能修改或删除,那么这些文字是不是就是写在窗体上的呢?不是,窗体只是一个容器,里面是空的,就像不能在空气里写文字一样。VBA给我们提供了一个可以写这些文字的控件,我们给它一个名字叫“标签”,E文叫“Label”。从我们上面描述的文字可以总结出标签控件的特点和作用:无法修改,主要用于显示提示信息。这是第一个控件。
第二个控件叫做“文本框”,E文叫做“Textbox”。这个控件和标签有点类似,也是放文字的,但这里的文字是让用户输入的,而不是显示给用户看的,所以我们把文本框的特点和作用做个总结就是:可以提供用户文字编辑功能,主要用来供用户录入文字信息供程序处理或存入数据库。
第三个控件叫命令按钮,E文叫“CommandButton”。这个控件的作用不用我多说了吧?当你之前每次用鼠标点击按钮,你可曾想过,为什么这么多按钮会有各种各样不同的功能?按钮除了能单击还能双击嘛?按钮的作用是在按下的时候发生还是放开的时候发生呢?所有这些问题的答案都在于事件是如何写的。按钮提供了单击、双击、按下、放开等事件,如果代码写在了按钮的某个事件里,那么在用户做出相应动作以后就会触发执行这些代码。
第四个控件叫列表框,E文叫“ListBox”。这个控件的外观,像一张一维表格(只有列标题)。这个控件的作用除了可以提供给用户一些整齐的列表信息外,还可以通过选中、单击、双击等事件,实现用户选择标准化录入的效果。
第五个控件叫组合框,E文叫“ComboBox”。这个控件比较灵活,有三种形态。第一种是下拉列表的形式,主要提供给用户选择列表里的值,用户的选择只能限于下拉列表提供的内容,不能自己输入,并且选择只能是单选。第二种是用户除了可以选择下拉列表提供的内容外,还可以输入自定义的内容,即兼具了文本框和下拉列表框的作用。第三种是用户可以对下拉列表框提供的内容进行复选。组合框是比较常用且功能较为强大的控件之一。
还有两个控件,一个叫选项按钮,就是我们平时说的单选按钮,另一个叫复选框,这两个控件经常被成组提供,主要让用户选择某些项目,而避免了文本框的不规则文本录入的问题,达到了录入结果标准化的效果。
说了这么多控件,还没看见呢!?别急,下面就告诉你怎么添加控件。如图(
1.jpg (3.83 KB)
2009-1-21 17:04
)单击“控件工具箱”工具栏中的某一个控件按钮,然后在SHEET表上就可以按住左键拖动鼠标勾画出某种控件,就这么简单。画好了,看到了,可没任何作用啊?呵呵,接下来就是要给这些控件“赋予生命”了。
再次看到“控件工具箱”工具栏,从左数第一个按钮(如图:
2.jpg (4.14 KB)
2009-1-21 17:04
),这个按钮的作用是进入设计模式和退出设计模式,如果在非设计模式下,那么对于你添加的控件就会按照你所定义的事件代码触发执行,如果要编辑这些按钮,就必须确保这个切换设计模式的按钮处于被按下的状态,这时候就进入了设计模式,这时对上述你添加的控件进行操作就不会触发你定义的事件代码,就可以提供给你编辑修改这些控件属性和代码的机会。请确认切换设计模式按钮处于按下状态,双击你添加在当前工作表中的任何一个控件,你就能看到自动打开了VBA编辑窗口,并生成了与被双击控件关联的一个事件,当前光标正在这个事件过程中一闪一闪的等你呢!请把目光移到代码编辑窗口的最顶端的两个下拉列表框那里(还记得前面讲的叫什么名字嘛?),左侧的下拉框显示的是当前控件的名称,右侧下拉框显示的是该控件的默认事件,(如图:
3.jpg (3.32 KB)
2009-1-21 17:04
)比如文本框,默认名称为“TextBox1”,默认事件为“Change”,这个事件表示当文本框内容发生变化的时候被触发执行。你可以下拉右侧的列表框,你会发现,和当前控件关联的事件有很多,至于如何用我们下面会逐个讲解。现在请重新回到SHEET1工作表界面,再重新选择另外一类控件,添加这个控件并双击进入编辑窗口,看看和这种(比如命令按钮)控件关联的事件有哪些?至此,知道如何给控件添加代码了嘛?
还有个小问题,你考虑过为什么这里出现的控件名称都是一样的,只是在最后添加了数字以示区别嘛?因为你没有修改控件的名称,所以就只能用默认的名称咯。其实每个控件都有名称,因为每个控件都是对象嘛!所以,设置控件的名称就是设置控件对象的一个属性。除了名称属性外,常见的还有哪些属性呢?我在这里讲一个查看属性的方法,大家不妨自己去看看各类对象的属性。所谓“师傅领进门,修行在个人”嘛!上面提到的“控件工具箱”工具栏还在吗?刚才讲了从左边数第一个按钮的作用,除了各类控件外,还有2个按钮,也就是从左边数第2个和第3个按钮没用过,你一定猜出来了,不错,第二个按钮是打开属性对话框的(如图:
4.jpg (32.43 KB)
2009-1-21 17:04
),点了这个按钮就可以看到当前选中对象的属性,而第三个按钮则和双击某个控件一样,是打开代码编辑窗口的。
最后,我想结合一个实例讲讲常见控件的常见属性和事件。(实例: 例2.rar (9.07 KB)
例2.rar (9.07 KB)
下载次数: 1649
2009-1-21 17:04
)
一般控件常见属性主要有如下几个:Enable,取值为逻辑值,通过设置该属性可以决定控件当前是否可用;Visible,取值为逻辑值,通过设置该属性可以决定控件当前是否可以被显示出来。对于标签控件,常见属性就是Caption属性,取值为文本,该属性决定了标签当前显示出来的文本。对于文本框、列表框、组合框控件,常见属性有Value属性,取值为文本,该属性决定了文本框、列表框和组合框的内容,可读写。对于命令按钮控件,常见属性有Caption属性,取值为文本,该属性决定了按钮当前显示出来的文本。
接下来,大家新建一个空白的EXCEL文档,在Sheet1工作表中,依次添加标签、文本框、命令按钮各一个,如图:
5.jpg (6.38 KB)
2009-1-21 17:04
。设置标签控件的名称属性为:Lbl_A1;Caption属性为“A1单元格的值:”;文本框控件的名称属性为:Txt_A1;命令按钮控件的名称属性为:Cmd_A1;Caption属性为“读取”;接着,双击命令按钮控件,打开代码编辑器窗口,并在Cmd_A1_Click()事件中,添加如下代码:Txt_A1.value = Cstr(Sheet1.Range("A1").value)。保存后,回到Sheet1工作表编辑界面,单击控件工具箱的左侧第一个按钮,即退出设计模式。这时候,在A1单元格输入一个值后,只要按一下命令按钮,在文本框中就会出现A1单元格的值。
由于时间关系,今天只是简要的讲述了一些常见控件的常见属性、方法和事件,至于其他一些控件和大家以后遇到的新的控件的属性、事件和方法,可以参照我上面讲述的过程和方法自己去学习、练习和使用。
第四课
【声明类关键字】
Public:声明公共类型的数据;
Private:声明私有类型的数据;
Static:声明静态类型的数据;
Dim:声明数据类型;如:Dim myCell As Range
reDim:定义未显式声明的数组的维数和元素;
Const:声明常量数据;如:Const limit As Integer = 33
As:一般用于声明数据类型中的“As Type”子句;
Type:声明用户自定义数据类型。
考虑到该类关键字属于一个相互联系的整体,并且一般在写代码的时候都会遇到,因此我想分三个部分来讲解。首先我们先了解下VBA代码的语法结构。每一种编程语言都有各自的语法组织结构,什么内容就应该放在什么地方,就像人身上的“部件”,如果鼻子长到了眼睛的上面,那就不属于正常的人了。VBA代码一般都按照事件、过程、函数、模块、类模块等来组织,不管是系统内部定义好的还是开发人员自定义的过程、函数或模块,使用前都必须声明。声明也就是告诉VBA代码的编译器,我下面的程序中会用到这些变量、过程、函数和模块等。声明分两种,一种是显式声明,也就是将声明部分代码明确的写出来。另一种是非显式声明,意思正好和前一种相反。当您的模块中含有这条语句“Option Explicit”,那么系统就强制规定您必须显式声明该模块中的所有变量,否则将编译出错。如果没有出现上述语句,那么您可以在使用变量前不显式声明该变量,系统编译时将默认该变量类型为Variant。
声明语句可以命名和定义过程、变量、数组以及常数。当声明一个过程、变量或常数时,也同时定义了它的作用范围,而此范围是取决于声明位置以及用什么关键字来声明它。这就是我要讲的第二个问题。先说声明的位置,如果你在某个工作表的某个过程中声明了一个变量或函数,那么这个变量或函数的作用范围就局限于这个过程;如果你在一个工作表的(通用)部分声明了一个变量或函数,那么这个变量或函数的作用范围就局限于该工作表代码模块中。这就表明声明的位置可以决定变量或函数的作用范围。除了声明位置外,采用哪个关键字也可以决定被声明对象的作用范围。比如,如果你在一个自定义模块中,采用PUBLIC这个关键字来声明一个变量,那么这个变量在所有应用程序的所有没有使用 Option Private Module 的模块的任何过程中都是可用的(若该模块使用了 Option Private Module,则该变量只是在其所属工程中是公用的)。而采用PRIVATE声明的变量,其作用范围就只有该模块内部,称为私有变量。上述两个关键字只能在模块级别代码中使用。(所谓模块级别就是只在过程外部的代码,即某个工作表的<通用>部分中写的代码,区别于过程级别的代码,即过程中书写的代码)除此以外,还有一个DIM关键字,用这个关键字可以在模块级别中声明变量,也可以在过程级别中声明的变量;前者声明的变量对该模块中的所有过程都是可用的,而后者则只在过程内是可用的。STATIC关键字是用来声明静态类型变量的,这是什么意思呢?举个例子你就清楚了,一般声明的过程级别变量,在程序代码运行完该过程之后,该变量的值就自动清空了,该变量也由于所在过程的运行完毕而结束了其生存周期。这样的过程级别的变量称为动态变量。那么有另外一种变量,虽然也是在过程级别中被声明的,但在该过程运行结束以后,该变量的值仍然保持不变,直至该变量所在过程所在的模块运行中止为止。这样的变量就叫做静态变量。静态变量只能在过程级别中使用,用于声明变量并分配存储空间。在整个代码运行期间都能保留使用 Static 语句声明的变量的值,并且其生命周期与包含该过程定义的模块相同。从作用范围来讲,这类变量由于在过程级别的代码中被声明,因此其作用范围只是局限于其所在的过程内部。
如下图所示:
变量关系图.jpg (81.61 KB)
2009-1-22 16:52
今天的内容可能比较枯燥,但绝对重要。正确理解声明类关键字的用法,对把握变量、过程、函数等对象的作用范围和生命周期有着非常总要的作用。希望今天的讲解能对大家正确理解这部分关键字带来帮助。
第五课
还记得年前我们说完了声明类关键字,今天我们要讲的是数据类型关键字,列举如下。
【数据类型关键字】
Byte:字节类型;
Integer:整型数值类型;
Long:长整型数值类型;
String:字符串类型;
Boolean:逻辑类型;
Single:单精度类型;
Double:双精度类型;
Currency:货币数值类型;
Decimal:可以容纳小数的数值类型;
Variant:任何数字值或字符串值;
Object:对象类型;
用户自定义:利用TYPE语句由用户自己定义的数据类型。
首先,我们先谈谈VBA中大伙见到的文字有哪些。大家在VBA中能够见到的文字,除了之前列举的几大类关键字(保留字)外,就是些数据和注释了。注释是以西文半角方式的单引号开头的文字,在VBA编辑器里显示为绿色。这些字主要用来注释解说变量或代码的用途。数据则有很多种,这才是我们今天要讲的主要内容。在VBA中,数据按照形态大致分为三类,常量、变量和数组。常量就是指在程序中已经指定的值,并且常量的值在程序中保持不变。举个例子,我们声明一个常量名字叫“Name”,我们在可以在声明的时候直接赋予这个常量一个值比如“张三”。那么在这个程序里,我们就不用直接引用“张三”这个名字了,我们在需要引用的时候只要用Name这个常量就可以替代了。可能有的朋友会说,既然Name就是代表“张三”,那我们为什么不直接在程序里写“张三”呢?这里有这么几个原因。一是有可能直接使用“张三”不方便,如果起个有意义的名字更便于阅读和维护代码。二是如果以后需要修改程序,需要将程序中使用到“张三”的地方都改成“李四”,那么如果用引用一个常量的这种方式的话,就只需要修改Name这个常量的值就可以了。变量和常量有点类似,都是以一个名字来命名并赋予一个值给它,不同之处在于,常量的值在整个应用程序代码中是不变的,而变量的值会随着代码位置的不同而发生变化。在这里提供一个小建议,在给变量起名字的时候最好起一些有意义的名字,否则在今后维护代码的时候会遇到困难。比如可以给整型变量加上INT的前缀,如果这个变量用来保存“编号”的,那么可以起这样的名字“INT_name”,如果是保存“生日”的日期型变量呢?可以这样起“DATE_birthday”,等等。再来说说数组,数组也是变量,不同之处是数组是一组变量的集合而不是单个变量。因此,数组一般由变量名和下标组成,例如:NAME
展开阅读全文