首页
学习
活动
专区
工具
TVP
发布

像看小说一样学习VBA,看完这篇文章,你就真正进入编程的世界了

关注TongDog工作室更多知识分享

故事的开篇

一、到底什么是VBA?

【2018-12-24】今天,阳光明媚,清晨刚到办公室,泡好香茗一杯,便开始构思,该如何组织这篇帖子,看来 我是作好了打持久战的准备,不管最终出来的是又臭又长的裹脚布还是无厘头的流水账,只要能对 您带来一点帮助或者乐趣,我就很满意了。 既然题目是初识 VBA, 那么我想先给大家一个直观的感受——什么是 VBA?, 往往在一些 EXCEL 的教材中, 都会讲: 是一种自动化语言,它可以使常用的程序自动化,可以创建自定义的解决方案。 VBA 就我看书学习的经验来说,我感到这样的定义式的描述带有很典型的中国式教材的风格,然而却不 能让人立即理解,那么这样的定义有什么用呢?我给 VBA 下的定义是:VBA 是一些代码的组合。可 能这个定义没有上面教材的定义那么严谨和准确,但我想你一看就应该能明白,原来 VBA 就是写代 码,或者说就是写程序。 (如果掌握了 VBA,居然我也能写程序了~~惊喜吧?) 那么你用了这么久的 EXCEL,可能从来没在 EXCEL 的 XLS 文件中看到过代码,难道就写在单元 格里?那我就带你去找找,VBA 的代码藏在哪里吧,这也正式我今天要谈的第二个问题。当你打开 一个 EXCEL 文件,你只能看到由许多单元格组成的工作表,这时,你可以通过【视图】菜单的【工 具栏】项目,打开一个工具栏,名字叫“控件工具箱”,从左往右属第三个按钮,名字叫“查看代码”, 点一下,就可以打开 VBA 代码编辑窗口。更简单的方法是,通过【ALT】+【F11】的快捷键,打开 VBA 代码编辑窗口,看到了吧,原来代码就是藏在这里的哦~~~ 怎么写代码呢?你也太心急了点吧,你还没掌握命令、语法、关键字、对象、事件、属性等 等内容,就想写代码?一口是吃不成个胖子的,还是让我来带你先认识下这里的每个角落吧,就像 进了一间陌生的屋子,总归每个角落都得转到吧?最上面的几行,和 EXCEL 以及每一个微软平台下 的应用程序都一样,总归是标题栏、菜单栏、工具栏等,接下来,看左边,有一个纵栏,写着“工程 VBAProject”,这里是工程资源管理窗口,里面通过树形列表展示了这个 XLSX 文件(或者标准的应 该叫“工作簿”) 所包含的各个工作表对象以及工作簿对象本身。 有什么用呢?你双击任何一个 SHEET, 比如 SHEET1,试试?是不是在右侧打开了一个文档编辑窗口?那么你就能明白,如果是 SHEET1 的 代码,就应该写在这里了,那么 SHEET2 的呢?当然就写在双击 SHEET2 后打开的窗口里咯~那么 SHEET3 呢?你烦不烦啊~~~人家都明白了!!再看看右侧的文档窗口吧,顶上有两个下拉列表框, ! 一个写着“通用”,一个写着“声明”,什么东东啊?左边的那个是对象列表框,可以让你选择在这个 SHEET 里面包含的所有对象,右边的那个是过程列表框,可以让你选择和左侧当前选中的对象关联 的系统或自定义过程。那么什么是对象?什么又是过程呢?今天没时间了,什么?领导要我马上去 开会?不会加工资了吧?晚上平安夜,从我们的大数据中心监测的微博打卡地最多的居然是酒店?不理解!哈哈,明天继续!

【2018-12-25】你们昨晚都玩的很high吧?我们老人家,早早就睡下了,什么平安夜不平安夜的,早睡早起才是正道。不出意外今天就是圣诞节(废话!)。打开电脑,看到好多朋友都在关心这个帖子,而且好几位朋友提出了自己的见解和疑惑,想到昨天 讲了“类”,今天真的感到了好“累”。 因为大家都刚接触 VBA,可能光听我介绍还没有直观的感受,为了帮助大家理解,下面先介绍 两个方法,可以让大家看到更多的东西。首先要介绍的是对象浏览器。打开这个对话框有三种方法。 (中国的教材和教育模式下的考试,最喜欢列举完成一件事情的方法,我就纳闷,只要能解决问题, 知道了一条路,干嘛还要打破沙锅问到底?)一个是通过【视图】菜单的【对象浏览器】项目,另 一个是在工具栏上点击【对象浏览器】按钮。最方便的是按【F2】快捷键。打开了以后,大家看到 了一个新的窗口,这里列举了三种信息,最上面的部分是用来搜索和查找信息的,中间的部分分了 三栏来分别列举“库”、“类”和“成员”信息。最下面是提示和说明部分,用来说明当前选中对 象的信息。 为什么要介绍对象浏览器呢?大家通过这个工具可以搜索到和 EXCEL 以及 VBA 有关的 各种各样的“类”和“对象”。顺便说一下,这里说的“成员”基本相当于对象、属性、方法和事 件;类是成员的上级;很多类又组成了一个类库,在这里叫做“库”。以后大家如果有不明白的类, 就可以在这里找到这个类有哪些对象、属性、方法和事件,以及他们之间是什么层级关系。其次, 简单介绍下如何使用帮助。其实按照微软的体系,VBA 的帮助包括了两个部分,一个是本地脱机帮 助,也就是安装完 OFFICE 软件就自带的帮助,这里只是简单的介绍了 VBA 的基本信息。另一个 部分则被微软放在了 MSDN 里面, 这是微软单独提供给微软平台的开发人员的独立帮助工具, 其中 包含了非常详细的各种编程信息、技巧和案例。通过仔细研读 MSDN 里的内容,可以快速掌握之前 不了解的编程知识,并且 MSDN 总是被微软的工程师们不断更新并保持着最新的状态。 下面,我们就继续昨天的内容,接着讲面向对象的编程。什么?昨天的已经都忘记了?那就先 回头去看看再继续吧。今天主要给大家介绍 VBA 中最常用到的一些关键字。什么是关键字,关键 字就是那些在 OFFICE 软件里已经被定义好了特定含义和用法的字符串。比方说,“IF”这个字符 串,表示“如果”的意思,在 VBA 里用来表示条件语句的起始,那么关键字和普通字符串有什么 区别呢?关键字被规定为不可以用来表示变量名、过程名、函数名等用户定义的信息,只能根据系 统规定的含义使用。也就是说,你如果有个变量起个名字叫“IF”,你写一条赋值语句“IF = 1”, 这样系统在编译的时候就会提示一个错误,而不能通过编译和运行。想看看 VBA 里一共有多少个 关键字吗?

二、VBA里的关键字

“同学们好! ”, “老——师——好——”, “请坐下, 把书翻到 25 页, 今天我们讲……”, 才三岁的外甥已经开始模仿和憧憬着学校的生活了~~哈哈,当我们回忆起儿时上课的情景,亲切 吧?那就让我们重温一下这份感受吧。 今天开始,我们将正式进入代码的学习阶段。我多年以来的授课经验告诉我,学代码应该从关 键字开始。下面列举了一些常见的关键字给大家先了解下。 【框架类关键字】 工程(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……:无条件转移语句。 一下子列举了这么多的关键字,是不是眼睛都花了?是不是对这些关键字还是没搞明白该怎么 用?没关系,下面就给大家一一介绍。哎呀,今天的时间又快到了,明天继续吧,别换频道啊~~

【2018-12-26】什么今天讲?不,今天讲什么?哎太过激动以至于有点语无伦次了。对了,今天先说说框架类关键 字。列举如下:

【框架类关键字】 工程(Project): 是指用于创建一个应用程序的文件的集合。 对象(Object): 可控制的某个东西,例如窗体和控件。 窗体(Form): 应用程序的用户界面。 控件(Control): 指的是各种按钮、标签、文本框等。 属性(Property):是指对象的特征,如大小、标题或颜色。 工作表(Worksheet):指 EXCEL 文件里的工作表,例如 sheet1、sheet2 等。 模块(Module):指在 VBA 工程中存放独立于用户定义对象代码的容器。 过程(Sub):容纳和组织代码的限定符号,一般和 End Sub 联用,不返回结果。 函数(Function):容纳和组织代码的限定符号,一般和 End Function 联用,并返回结果。

记得我在学写程序的时候(那是很久很久以前的事情了),我最怕的就是看到这些 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 工作表的方法打开该工作表下的代码集)。

好了,今天先到这里吧!都看到这了,看见赞赏了吧?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190103G0F7A800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券