本文主要包括以下几个方面的内容:
- VBA是什么?
- 为什么要用VBA?
- 怎么用VBA?
VBA是什么?
一、宏:macro
在具体介绍VBA之前,我们先将目光转向“开发工具”选项卡,在这个选项卡的“代码”功能区中,出现了一个名词:宏。同时,还出现了一个操作:录制宏。
录制宏的意思就是将一系列的操作录制下来,保存之后还可以多次重复执行这些操作。
举一个比做工资条还要更加简单的例子,比如删除第一行,然后保存工作簿这一系列的操作。
注:做工资条这个例子是老生常谈了,我所见过的VBA教程的第一个例子都是这个,在这里我就不多解释了。原因有两个,第一,我不想讲,对,任性;第二,最后录制的那个宏中的代码并没有太多可以讲解的内容,因为自己录制的宏都不包括循环过程,也不会涉及具体的算法,着实简单。这个例子可以查看我之前的文章:《Excel 有哪些可能需要熟练掌握而很多人不会的技能?》中 第五部分--排序功能巧用举例 和 第十部分--基本VBA与宏 的相关内容。
假定在A1:E22的区域内的每一个单元格中内的值代表的是初始行号,比如A1单元格内的值是1,B5单元格内的值就是5了。
问题一:如何迅速做到快速填充行号?并且将数值固定下来?请思考。
鼠标操作使用录制宏功能,本例的情况下,在出现的对话框中没必要进行任何操作,直接点击确定即可开始录制宏。
我们需要录入的步骤主要有鼠标选中第一行、鼠标右键点击删除、选中A1单元格、保存工作簿。
操作完上面的步骤之后,点击“开发工具”选项卡中的停止录制,这时,一个宏就录制完成了。
录制完的宏可以通过点击“开发工具”选项卡中的“宏”功能进行查看,会弹出如下的对话框。
为了验证这个宏是否有效,我们可以选中宏1进行执行。执行一次之后,A1单元格的值变成了3,这说明我们所录制的宏是准确且有效的,的的确确删掉了一行。
宏的英文名为macro,从本质上来讲,宏就是一段VBA代码,只不过这段代码比较简单,也存在较大的缺陷,比如无法进行判断和循环等。
在后面的介绍中,我们可以看到,sub过程在Excel中体现出来就是一个宏。
二、VBA代码:Visual Basic For Application
既然宏就是一段VBA代码,那么VBA代码到底是什么呢?
通俗来说,VBA是一种基于Office软件的编程语言,可以使用VBA在Office中来实现一些自定义的功能,而不仅仅局限于软件中已经给出的功能。
再通俗点,就是可以用VBA来在Excel中实现一些花里胡哨的功能。当然在word、access中也可以用到相应的VBA程序,这就不在我们这个系列的讨论范围之内了。
三、xlsm格式的Excel文件
为了更好地使用VBA这一利器,建议大家将包含VBA代码的Excel文件全部另存为.xlsm格式,这个格式的全称叫做 Excel 启用宏的工作簿。
使用这个格式的文件就可以更加肆无忌惮地写VBA代码了,不用担心不支持宏的问题。此外,什么宏的安全性之类的问题也就没必要管了。
当然了,如果出现一些奇怪的问题,直接上网搜索吧,更管用,没必要记住那些乱七八糟的操作。
问题二:如何才能快速另存为xlsm文件呢?请思考。
四、VBA的编程环境:VBE窗口
在点击“开发工具”选项卡中的“宏”功能后弹出的对话框(这个对话框可以使用Alt + F8快捷键唤出)中点击编辑后,就会弹出一个新的窗口,这个窗口就是进行VBA编程的地方,名为VBE窗口(Visual Basic Editor,可以直接使用Alt + F11快捷键唤出VBE窗口)。
VBE窗口主要包括菜单栏、工具栏、工程资源管理器、属性窗口、代码窗口和立即窗口。
其中,在工程资源管理器中可以看到所有打开的Excel工作簿和已加载的宏,一个工作簿就是一个工程,名称为VBA Project(工作簿名称),如下图所示。
在工程资源管理器中,有一个文件夹叫做模块。模块是保存VBA代码的地方。
当然,其实代码可以保存在工作表对象中,也可以保存在ThisWorkbook对象中,还可以保存在类模块中。一般情况下,为了避免发生错误,建议将VBA代码保存在模块中。
在立即窗口中可以直接输入命令,回车后将显示命令执行的结果。不过,这并非立即窗口的最重要的作用,立即窗口最重要的用途就是调试代码,也就是将在本文第三部分涉及的debug语句。
其他的部分,我不用解释,看名字就能看懂了,我就不多做解释了。
除此之外,为了更方便地写代码,需要这样操作:菜单栏 → 视图 → 工具栏 → 勾选编辑和标准两项。尤其是编辑这一项勾选之后,会出现关键性的功能:缩进、注释、取消注释以及自动完成关键字。
缩进可以用tab键来实现,但是注释和取消注释似乎并没有直接可以用的快捷键,手动打个单引号又无法实现范围注释,所以这个功能强烈推荐。
自动完成关键字的功能,可以使用Ctrl + Space快捷键来使用,也是一个神技。当然更多情况下,采用上下箭头选择到某个关键字,然后使用tab键就可以直接输入了。
为什么要用VBA?
介绍了半天VBA是什么,于是就来到了这个深刻的问题:我凭什么要用VBA?我是铁头娃怎么了?
VBA好处都有啥?
一,可以简化重复性的操作,比如那种需要重复无数次的操作,可能只需要几行代码加个循环就能轻松实现。没必要手动地一个一个来。
二,可以实现那些采用一般手法难以完成的谜之操作,比如V001里涉及的双条件下对数据的重新组织的情况。
当然了,点开这篇文章的朋友,都是要学VBA的,多说无益了。
怎么用VBA-读懂、会写?
介绍了是什么和为什么之后,我们接下来进入真正的正题,到底应该怎么用VBA?
我觉得会用VBA有两个层次,第一层是能够读懂代码;第二层是会自己写代码。
现在网络资源如此丰富,只要搜索关键词恰当,有些问题完全可以从网上直接下载代码来解决。再不济一点,稍微修改修改,保留核心算法,也就可以解决问题了。因此,读懂是至关重要的。读懂代码也是自己写代码的基础。
一、VBA程序/VBA代码的基础知识
在一段VBA程序/VBA代码中包括什么呢?一段代码是由哪些内容构成的呢?
以前面提到的删除一行,然后保存的宏为例,我们可以在VBE窗口找到这个宏的代码。
在这段简单的代码中,包括了两个非常核心的东西:过程与对象。
(1)过程
在VBA中,过程指的是完成一个任务的所有操作的集合,或者是完成一个任务的代码的有序组合。在VBA中,基本的过程有Sub过程和Function过程。
其中Sub过程就是很简单的一堆代码放一起,一般情况下都用Sub过程,录制的宏就是一个Sub过程,录制宏也只能生成Sub过程。上面的这段代码就是一个Sub过程。
Sub过程所定义的过程名会出现在Alt + F8弹出的对话框中,与我们自己录制的宏并无二异。
只有在特殊的情况下,才会用到Function过程。Function过程的含义就是自定义一个函数,自定义的内容包括函数的各个方面,函数名、参数个数、参数所要求的数据类型、运算方法、错误提示,甚至你要是愿意,都可以自己写一个函数文档。
Function过程定义的函数,可以像Excel自带函数那样进行调用,也就是采用函数名+参数的方式进行调用。
一般来说,返回一个值的时候,可以考虑采用Function过程,而要进行一些特殊的动作时,比如填充单元格颜色,移动单元格,修改工作表名称等类似的特殊操作时,就需要采用Sub过程来实现。
Sub过程和Function过程具体的定义方法将在后续更新中展开,此处暂时不多赘述。
(2)对象
对象指的是用代码操作和控制的东西,如工作簿、工作表、单元格、图片、图表、透视表等内容。在上面这段代码中,Rows("1:1")和Range("A1")就是对象,其中Rows("1:1")指的是第一行,Range("A1")指的是A1单元格。
每个对象都有不同的属性,属性是对象包含的内容或特点。举个简单的例子,单元格对象的属性就有包含的值、长宽、填充颜色等。对象与属性之间用半角的点(.)来进行连接,对象在前,属性在后。
除了属性之外,每个对象都有方法,方式是指在对象上执行的某个具体动作。比如上面这段代码中出现的select选中,delete删除,save保存等。对象与方法之间也用半角的点(.)来进行连接,对象在前,方法在后。
在过程中,使用合适的对象,调用对象的属性和方法,辅以合适的算法,就能够完成一段可以发挥实际作用的VBA代码,来解决遇到的各种问题。
二、VBA代码写作的一些规范
为了在写代码的时候少犯错,也为了更好地调试代码,就需要对代码的写作进行规范。
(1)强制声明变量
在VBA中,可以不先声明变量,也就是说,不用先定义一个变量,我再去调用这个变量,但是那样的话,可能就会搞不清楚到底搞了多少个变量。因此,一般情况下,建议开启强制声明变量选项。
在菜单栏 → 工具 → 选项中可以进行操作。
或者在每次写代码时,自己在最开头写上Option Explicit。这两种方法均可。
(2)控制好缩进
由于VBA的代码窗口体验很差,不是所有编译器都是Sublime Text。在VBA中,代码完全不缩进也丝毫不会影响到最后的结果,能用还是能用,但是,不缩进会导致代码阅读体验极差,甚至会导致看不懂代码,所以希望大家在写程序的时候控制好缩进。
缩进可以使用tab键来完成。一般来说,嵌套一对代码就进行一次缩进,比如if...end if一次,就缩进一次(这一段可能不太好理解,在之后的讲解中,会再进行说明)。
(3)及早配对
及早配对的意思是,在循环语句、判断语句中,整个语句都是有头有尾的,写出开头的时候,就要先把结尾写上,然后再再中间写代码,这样才不容易出错。
举例来说,if判断语句的开头是if,结尾是end if;for循环语句的开头是for,结尾是next。
(4)多写注释
在VBA代码中,以半角单引号开头的那一行就是注释语句,注释语句不会在程序中运行,仅仅是为自己提供一个注解,以便更好地写出代码,也方便别人或者以后的自己看懂代码。
除了给自己提供注解之外,注释还有一个妙用,就是把错误的无效的代码先注释掉,这在调试程序的时候非常管用。
(5)debug.print
这一语句主要用在调试代码的时候,该语句的作用是将需要查看的内容打印(print)到立即窗口,也就是输出到立即窗口。恰当地使用这一语句,将能够清楚地知道每一步输出的结果是什么,更好地完成代码的写作。
结语
本文的主要内容是简单地聊了聊宏、过程、对象等VBA的基础知识,以及提出一些代码写作的规范,方便自己,方便他人。(来自:XL)