其实,VBA很简单!

熟练使用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函数用法请参考帮助文档。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容

  • 1.1 VBA是什么 直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得...
    浮浮尘尘阅读 21,745评论 6 49
  • 本例为设置密码窗口 (1) If Application.InputBox(“请输入密码:”) = 1234 Th...
    浮浮尘尘阅读 13,647评论 1 20
  • 有一个乞丐,每天都是过着这一顿吃不饱,那一顿没得吃的生活。在一个寒冷的冬天,因为实在太冷了,已经一天没吃过...
    Yooblue阅读 619评论 0 1
  • 这个好玩....精神科医生朋友发来的 脑力测试小游戏 (点击进入) 自测评分标准参考: 10-19秒完成~~你是...
    Stephen潇雨阅读 1,412评论 0 1
  • 它悄悄的来过 转过转过身的错过 回忆不是故事 竟是执念 仿佛仿佛能的幻想 画面不是现实 竟是年华 即使写在纸上刻在...
    赵际朝阅读 239评论 0 0