熟练使用Excel的朋友们可能会知道Excel主要包含六大主题,其内容包括:Excel基础操作、图形与图表、函数与公式、数据透视表与数据透视图、SQL语句及VBA语言等,其中VBA是Excel最核心的一大主题。今天,小编给大家简单地分享一些VBA的语法知识及几个应用示例,希望大家有所收获。
一、VBA简介
VBA,是Visual Basic for Application的简称。它是一种面向对象的宏语言。其主要用途是用来扩展Windows的应用程序,特别是Office软件。因此,熟练地掌握这门语言可以提高Windows平台和Office软件日常办公效率,实现业务逻辑的定制化和自动化。
二、VBA语法概要
1、对象、属性和方法
熟悉一些编程语言的朋友对这些术语可能不陌生。简介也提到过,VBA是面向对象的脚本语言。如果你熟悉这些概念,你可以跳过。如果你不太明白,我给你讲个故事。故事是这样的:话说某年某一天,某某拿着一个白色的碗,拄着破旧的老竹竿行走在车水马龙的街道上,在拥挤的人流中,它环顾着四周,突然,它发现了一个角落,嗯,这地方不错,他说道。然后它放下碗,将兜里的支付宝二维码纸片放在地上......。这个故事中:某某,碗,竹竿及纸片就是对象,白色是碗的属性,拿着、拄着和行走等是这个人的行为,即方法。相应于Excel应用程序而言,Application就是Excel应用程序对象,Worksheets就是Excel工作表对象集合。例如:WorkSheets("xxx").Name,其中WorkSheets("xxx")代表工作表xxx对象,Name就是xxx工作表的名字属性。WorkSheets("xxx").Close,Close就是xxx工作表的关闭方法。因此,只要熟练掌握了Excel对象模型层次结构,这门语言就很简单啦。以下列出一些常用的对象(依附于对象的方法或属性比较多,不列举出来):
Application::Excel应用程序对象
Window: 窗体对象
Worksheet:工作表对象
Sheets:工作表集合对象
ShapeRange:形状区域对象
PivotTable:数据透视表对象
Workbook:工作簿对象
Shape:绘图层中的对象
Range:单元格对象
Name:单元格区域的定义名称对象
Chart:图表对象
FileDialog:文件对话框对象
2、数据类型
VBA包含十几种数据类型,其内容包括:Byte(字节型);Boolean(布尔型);Integer(整型);Long(长整型);LongLong;LongPtr;Single(单精度浮点型);Double(双精度浮点型);Currency(变比整型);Decimal;Date;Object;String(变长和定长)、Variant(数字和字符)及用户自定义类型等。为什么要划分如此多的数据类型呢?你可以想想商店卖啤酒为什么按瓶卖给客户,工厂生产啤酒为什么用桶装。很显然,为了尽可能地减少计算机内存的占用,合理使用和分配内存,使程序更高效、更快速地运行,使用合适的数据类型声明变量是有必要的。
既然VBA定义了这么多数据类型,那么接下来,我们就需要声明常量和变量了。声明常量语法如下:
[Public | Private] Const constname [As type] = expression
Public和Private是可选的。其中,Public是用于在模块级别中声明在所有模块中对所有过程都可以使用的常量,在过程中声明常量不能使用Public。Private:用于在模块级别中声明只能在包含该声明的模块中使用的常数,不能在过程中使用(参数信息可以参考文档,如下图所示):
声明变量有四种方式:Dim、Public、Private和Static,其中最常用的是Dim,其语法格式如下:
Dim [WithEvents] varname[([subscripts])] [As [New] type]
WithEvents是可选的,表示声明varname是一个用来响应由ActiveX对象触发的事件的对象变量。只在类模块中才有效。
subscripts是可选的,表示数组变量的维数。
New是可选的,表示隐式创建对象。若使用New来声明对象变量,在第一次创建引用变量时将创建该对象的实例。因此,不必再使用Set语句对该对象赋值。例如使用Excel调用外部引用对象Outlook.Application。可以有以下两种写法:
Dim ol as Outlook.Application
Set ol = New Outlook.Application
或者这样写:
Dim ol as New Outlook.Application
其中,第二种方式直接创建对象的实例了,因此不必再使用Set获取实例对象了。
3、操作符
VBA主要有算术操作符、比较操作符、连接操作符及逻辑操作符等四种运算符包括,其内容如下所示:
算术操作符为:+(加法);-(减法);*(乘法);/ (除法);\(取整除法);^(幂);Mod(求余)。
比较操作符为:<(小于);<=(小于或等于);>(大于);>=(大于或等于);=(等于);<>(不等于);Like(字符串的比较);Is(对象引用比较)。
逻辑运算符为:And(逻辑与);Or(逻辑或);Not(逻辑非);Eqv(逻辑等价); Imp(逻辑蕴含);Xor(逻辑互斥)。
连接操作符为:&(连接);+(有条件的连接操作)。
其他操作符基本很好理解,除了+运算符。+运算符具有两义性。当至少有一个表达式不是Variant类型情况下,两个表达式都是字符串或者其中一个表达式是字符串,另一个是除Null的任意Variant时,+代表字符串连接。如下所示:
当两个表达式都是Variant的情况下,表达式都是字符串时,+表示字符串连接操作。如下所示:
4、过程
VBA有三种过程,分别为:Sub过程、Function过程和Property过程。其中Sub过程和Function过程最常见也最有用,接下来主要说明这两种过程。
4.1 Sub过程语法
Sub过程是使用Sub语句声明的子过程,使用开发工具中的录制宏按钮录制出来的过程都是Sub过程。其语法格式如下:
Private | Public | Friend | [Static] Sub name [(arglist)]
[statements]
[Exit Sub]
[statements]
End Sub
一些重要的参数解释如下:
Public:表示所有模块的所有其他过程都可访问这个Sub过程。如果在包含Option Private的模块中使用,则这个过程在该工程外是不可使用的。
Private:只有在包含其声明的模块中的其他过程可以访问该Sub过程。
Friend:只能在类模块中使用,表示该Sub过程在整个工程中都是可见的,但对对象实例的控制者是不可见的。
Static:表示在调用时保留Sub过程的局部变量的值。Static属性对在Sub外声明的变量不会产生影响。即使过程中也使用了这些变量。
4.2 Function过程语法
[Public | Private | Friend] [Static] Function name [(arglist)] [As type]
[statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function
Function语法与Sub语法基本一致,除增加了Function返回的类型一项以外。它们的区别主要在于:Function只能返回引用对象的某个属性值或者运算结果,而不能对对象的属性、格式等信息进行改变,而Sub过程却可以这样做。
三、帮助文档
以上内容简单地介绍了VBA的一些语法知识。像VBA函数,循环语句,条件语句、事件、具体对象的使用等VBA知识,还未涉及在内。这些内容将在以后的文章中分享给大家。另外,上述语法内容有些参数还未详细说明,或者你希望获取更多关于VBA语法与对象的知识,小编分享两份VBA开发者手册(一份是英文版Office2013开发者手册,一份是中文版Office2003开发者手册,如下图所示)给大家,希望对大家编写VBA宏语言有所帮助。手册下载链接内置在公众号自动回复中,中文版请留言cn,英文版请留言en即可获取百度云下载链接。
四、应用实例
VBA语法知识和帮助文档都一一介绍完了。接下来,我给大家编写三个VBA应用实例吧~~~
一、读取Excel活动工作簿中各个工作表的名称,并写入到第一张工作表中。
代码如下所示:
二、将如下左图数据按照ABCD类别进行合并,形成右图的数据。
代码如下所示:
说明:
Option Explicit表示强制要求在此模块中明确申明变量。若使用了未申明的变量,将引发“编译错误:变量未定义”的警告框。
Public Const Delimeter As String = "|"定义了一个模块级别的字符串常量,代表连接对象的分隔符。
ArrayLength定义了一个模块级别函数,该函数用于计算数组中元素的个数。UBound及LBound函数请参考帮助文档。
在Concate_Items子过程中,Dim语句声明了一组变量,On Error Resume Next表示遇到错误时不打断程序的执行流程。set语句获取一个字典对象,用于存储键值对。iRow获取活动工作表已用区域的最大行号。接着,使用For...Next循环语句A1:A10单元格,将其作为字典的键,通过Range对象的Offset偏移方法获取字典的值con。若键值对不存在字典中将其添加到字典中,若字典中存在此键,将其取出来与新的值做连接,然后移除原来的键值对,再添加到字典中。最后,使用Cells对象将数据写入工作表中。
三、将上图右侧数据按照分隔符拆分成左侧数据。
代码如下所示:
方法同例2,使用了VBA函数Split将单元格中的值按照分隔符Delimeter分开,再循环写入相应数据,Split函数用法请参考帮助文档。