Excel vba怎么用

在 Excel 众多的概念中,VBA 是最重要也是最难学的一部分。如果涉及到数据处理工作,VBA 几乎可以实现任何功能,从简单的数据处理,到批量数据分析,再到与 Office 其他软件交互,甚至与操作系统交互实现复杂的功能,VBA 几乎都可以胜任。

那么什么是 Excel VBA,如何学习它,懒人Excel 带你进入 VBA 的世界,从最基础的部分开始讲起,一步一步入门到精通,写出自己的 VBA 程序。

什么是 Excel VBA?

首先,第一个问题,什么是 VBA?

Visual Basic for Applications(VBA)是 VisualBasic 的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展 Windows 的应用程序功能,特别是Microsoft Office软件。

以上是 VBA 的百科定义,说简单点,VBA 是运行在 Microsoft Office 软件之上,可以用来编写非软件自带的功能的编程语言。Office 软件提供丰富的功能接口,VBA 可以调用它们,实现自定义的需求。基本上,能用鼠标和键盘能做的事情,VBA 也能做。

正如前文所述,VBA 可以运行在 Office 软件上,包括 Excel、Word、PPT、Outlook 等。VBA 语言在 Office 软件中是通用的,基本语法和用法都相同。但是每一个软件具有自己独有的对象,例如 Excel 有单元格对象,Word 有段落对象,PPT 有幻灯片对象。

回到 Excel VBA,用它可以编写自定义函数,插入任意图表、批量处理大量数据单元格,编写插件自动化工作。甚至可以编写基于 Excel 的复杂的管理系统,其功能可以媲美桌面软件。

在本系列教程中,我们学习 VBA 语言语法和 Excel 特有的对象的使用。在往后的教程中,如没有特殊说明,文章提到的 VBA 指的是 Excel VBA。

VBA 与宏有什么区别?

在学习 VBA 过程中,经常会出现一个说法,「」。简单的说,宏是一段可以运行的 VBA 代码片段,也可以说是一个简称,并没有特别的不同之处。所以学习 VBA 时,不用纠结于两者到底有什么区别,只需要记住一点,宏是使用 VBA 编写的一段代码片段。

学习 Excel VBA 有什么用处?

前面我们说到,Excel 中,VBA 几乎可以实现任何功能,从简单的数据处理,到批量数据分析,再到与 Office 其他软件交互,甚至与操作系统交互实现复杂的功能,VBA 几乎都可以胜任。以下是 Excel VBA 几个典型的用途。

  • 节省时间:只需一次点击就可以重复执行任意数量的操作。例如,现在要新建 20 个工作表,手动操作可能需要一分钟的时间。使用 VBA 只需一秒即可。
  • 自动化任务:只需一次点击就可以按预先设置好的步骤,自动完成操作。例如,插入一个图表并设调整格式,根据其复杂程度,可能需要多达几分钟时间。而使用VBA编写调整步骤,一次点击,几秒内即可完成所有的操作。
  • 减少错误:相比于手动操作出现的错误,只要正确编写 VBA 代码,执行过程中就不会出现错误。例如,从一区域中筛选指定数据,并复制到另外一个位置,手动操作可能会出现漏选的可能。但是使用 VBA,极短的时间内正确无误的完成操作。
  • 与其他软件交互:使用 VBA,可以在 Excel 里创建、更新 Word、PPT 等文件。还可以与系统交互,做到复制、移动、重命名其他文件等操作,无需打开其他文件。

Excel VBA 基础

  • Excel VBA 中的 10 个基本概念(熟悉 VBA 中的基本概念)
  • 启用 Excel 开发工具教程(准备 VBA 开发工具)
  • 如何打开 Excel VBA 编辑器?(三种方法打开编辑器)
  • Excel VBA 设置宏安全性(正确设置 VBA 开发安全选项)
  • Excel 保存包含 VBA 代码的工作簿(使用指定类型保存含 VBA 代码的工作簿)
  • 使用 VBA 编辑器进行 Excel VBA 开发(熟悉 VBA 开发工具的用法)
  • 编写你的第一个 VBA 宏(基础实战练习)
  • Excel 录制宏并查看宏代码(写 VBA 代码的技巧)
  • Excel 中如何运行 VBA 代码?(从工作表运行 VBA 代码)

VBA 变量、类型、运算符

  • VBA 变量基础教程(VBA 核心概念)
  • VBA 常量基础教程(基础概念)
  • VBA 运算符基础教程(加减乘除+高级操作)
  • VBA 数据类型基础教程(程序更高效、更精准)

VBA 程序结构

  • VBA 程序结构入门(认识 VBA 程序骨架)
  • VBA 表达式和语句(最基本的程序单元)
  • VBA 变量的声明和赋值(是程序动起来)
  • VBA 程序顺序结构(VBA 程序默认执行顺序)
  • VBA 程序选择结构(选择性的执行 VBA 代码)
  • VBA 程序循环结构(重复执行一段代码)
  • VBA With 结构(简化程序书写)
  • VBA GoTo 结构(程序之间跳转执行)
  • VBA 注释教程和实例(使程序更容易阅读和理解)

VBA 过程和函数 (Sub | Function)

  • VBA 过程(Sub) 入门教程和实例(组织代码的容器)
  • VBA 函数(Function)入门教程和实例(重复使用相同代码)
  • VBA 函数与过程的 6 个不同点(正确使用过程和函数)
  • VBA 过程和函数:传递参数教程和实例(正确定义和调用带参数的过程和函数)
  • VBA 中 ByVal 和 ByRef 的基础用法和区别(学会正确传递参数)
  • VBA 变量作用域
  • VBA 过程或函数作用域

''''''''''''''''' 以下所有文字均为答主手敲,转载请注明出处和作者 ''''''''''''''''''

如有条件的话,可以遵循以下的步骤学习:

1) 理解基本的语法,上机练习简单的操作

2) 反复阅读理解有经验人士的代码

3) 对于一些简单的需求,可以试着自己解决

4) 对于VBA而言,同一个目标可以有很多实现方法。故同样的需求,可比较别人的实现方法和自己的实现方法,并加以比较评判

5) 随着学习的深入,评判、重写自己的代码

'''''''''''''''''''''''''''''''''''''''' 我是正文 ''''''''''''''''''''''''''''''''''''''''

1. 一点历史

VBA,全称Visual Basic for Applications。从名称上看,至少包含了3个历史阶段的产物,依次是

- BASIC

- Visual Basic

- Visual Basic for Applications

BASIC是一门古老的计算机语言,首次发表于1964年。BASIC语言贴近于英语语法,使用者也不需要对计算机硬件知识(尤其是内存管理)有很多了解,故对于非专业程序员,也能极为迅速的上手。使用BASIC,计算机上需要安装一个叫“BASIC解释器”的软件,将BASIC程序代码翻译为计算机能够识别的机器指令。同时,BASIC解释器通常带有一个文本编辑环境供输入代码。随着个人电脑的普及,BASIC解释器通常是作为预装软件出现,故用户开机就能用上BASIC。

用于MITS Altair 8800型个人电脑的BASIC解释器是微软公司的第一个产品,由比尔盖茨等微软创始人亲自开发。此后,微软的DOS和Windows 3系列、Windows 9X系列都预装了BASIC解释器(称为QBasic)。从Windows 2000开始QBasic不再预装,但是QBasic仍然可以运行于Windows 10之上(只限32位)。

Excel vba怎么用

QBasic 运行于Windows 10

从BASIC的历史可以看出,这门语言本来就是为非计算机专业人士准备的,而且微软公司与之有不解的渊源。之后的发展也是如此。

计算机软件进入到图形用户界面时代,微软公司开发了可以编写Windows图形应用程序的新语言Visual Basic以及对应的开发软件Visual Basic IDE(所以Visual Basic既指一门语言又指微软为此提供的开发软件)。新语言Visual Basic继承了BASIC语言的关键字和语法,仍然保持易学易用的风格。尽管Visual Basic解释器是Windows操作系统的一部分,然而想用Visual Basic开发软件,仍然需要独立购买和安装Visual Basic IDE。

Excel vba怎么用

最后一个非.Net版本的 Visual Basic,即 Visual Basic 6 (1998)运行于Windows 10

1996年,微软开发了Visual Basic Scripting Edition(即VBScript)。顾名思义,VBScript适合快速书写类似批处理的脚本。VBScript的语法与Visual Basic一致。直到今天,Windows依然内置了VBScript解释器,以及能够直接解释文本代码的Windows脚本宿主。所以使用VBScript无需另外投资。

微软的Office系列产品同样集成了VBScript解释器,并提供了语言操控Office软件本身的能力。这个VBScript被称之为Visual Basic for Applications(即VBA)。目前主要Office软件都集成了VBA的解释器和集成开发环境(类似于一个简化版的Visual Basic IDE)。换句话说不仅在Excel里,Word、PowerPoint也可以用VBA。VBA的运行环境称之为宿主(Host)。比如,你在Excel里面使用了VBA,那么Excel就是宿主。这个概念也适用于VBScript,对应的宿主可以认为是Windows本身(实际上是Windows的一个组件:Windows脚本宿主WSH)。

那么从VBA的历史上我们可以看到,它实际上是由两部分组成的:一个是语言本身的特性,另外一个是宿主提供的功能。语言本身具有通用性,而宿主相关的部分和不同的宿主有关。这篇文章也会对应的分为两个部分,即通用的VBScript和Excel VBA。

2. 学习VBScript

学习VBScript,你只需要Windows系统本身。我们使用的工具是系统自带的命令提示符、记事本和Windows脚本宿主。

2.1 环境

首先我们建一个工作目录。以下两种操作均可:

1.新建一个文件夹,按住Shift然后鼠标右击,选择“在命令提示符中打开”

2.按Windows +R,输入cmd,回车。例如想建立的工作目录为 C:\Work,那么就输入

以下假设我们的工作目录是C:\Work。

接下来可以写程序了。在命令提示符下输入

当记事本提示你创建新文件时,选择“是”

比如我们写一个从1加到100的程序。在记事本里输入

dim i,sum
sum = 0
for i = 1 to 100
  sum = sum + i
next
wsh.echo sum

按Ctrl+S保存。

回到命令提示符,输入

命令提示符会输出一些版本信息,然后会出现结果5050。如果嫌版本信息太罗嗦,就加一个/nologo的选项:

cscript /nologo hello.vbs

因为Windows对扩展名为.vbs的文件进行了绑定,所以也可以直接运行

输出的形式略有不同,稍后解释。

2.2 基本语法
变量:
与数学上的变量意义相同。变量用来存储数据。变量不得使用数字作为开头,原则上不要使用中文作为变量的名字。应使用字母和数字、下划线,例如sum、my_result_0等都可以。

字面量:在代码中可见的数据,例如整数、小数和双引号包裹、可由任意字符组成的字符串。如100、"Hello"、"标题"等。

运算:与数学上的运算意义相同。

关键字:VBScript自带的命令符号,不得用于变量名称。VBScript不区分大小写。通常第一个字母大写。

注释:单引号'直到行尾的所有内容,VBScript均予以忽略。

声明一个变量使用Dim关键字。尽管变量在第一次赋值的时候会自动声明,但努力养成明确声明变量的好习惯。

'我是注释
dim x '声明了变量x
dim i,j '声明了变量i和j

用操作符=给变量赋值。=右侧的表达式将被求值,然后赋予=左侧的变量

可以把字面量、运算的结果或者函数返回的值赋给变量。=赋值只适用于整数、字符串等简单类型的赋值。

Option Explicit '强制要求变量使用之前必须声明

dim my_result
my_result = 1 '赋予字面量1
'获得函数的返回值
my_result = InputBox("输入一个数字","我的程序") 
my_result = my_result * 2 '获得运算的结果
WScript.echo my_result

函数与数学上的多元函数意义相同。函数需要零个或多个参数返回一个运算的结果。上面的代码在调用一个函数InputBox,并赋予其2个字符串参数,以逗号隔开。当不需要返回值时,括号可以省略。

InputBox是VBScript的内建函数,而这段代码最后的WScript.echo看起来也是个函数。即WScript.echo(my_result)的简写。这个“函数”并不是VBScript提供的,而是Windows脚本宿主的功能。不得不在这里介绍是因为需要有一个输出数据的方法,而输出数据的方法VBScript本身并没有提供。事实上Windows脚本宿主对WScript.echo的解释也有不同,当用cscript hello.vbs调用脚本宿主时,WScript.echo输出到命令提示符;当用wscript hello.vbs,或者直接运行hello.vbs时,WScript.echo表现为弹出对话框。

前面提到的代码都是逐条执行的。而条件分支的含义是根据数据的不同而选择性的执行不同的代码。举例

dim age
age = InputBox("输入年龄")
If age > 18 Then
  WScript.echo "成年"
Else
  WScript.echo "未成年"
End If

关键字 If-Then-Else-End If形成了两个分支,习惯上分支内部的代码最好给予一些空格缩进。If后面的语句是所谓条件表达式。整个表达式会被求值,若为Ture,则运行Then之后的语句后跳至End If,否则跳过Then后面的语句,直接从Else开始直到End If。如果没有Else分支,则直接跳至End If。故Else分支是可选的,当然可以有多个分支:

dim age
age = InputBox("输入年龄")
If age < 18  Then
  WScript.echo "少年儿童"
ElseIf age > 65 Then
  WScript.echo "老年"
Else
  WScript.echo "其他"
End If

实际上相当于嵌套的分支:

dim age
age = InputBox("输入年龄")
If age < 18  Then
  WScript.echo "少年儿童"
Else
  If age > 65 Then
    WScript.echo "老年"
  Else
    WScript.echo "其他"
  End If
End If

除了分支之外,某一段代码还可以反复执行。最简单的情况,例如打印5个"Hello"

dim i
for i = 1 to 5
  WScript.echo "Hello",i
next

关键字 for-to-next创建了一个循环。循环变量i依次赋值为1、2、3、4、5,每次赋值后,for-next之间的代码都会完整执行一次。

2.3 获取帮助

以上只是谈到了VBScript最最基本的用法,能够覆盖大概60%的常用情景。但完整使用VBScript需要掌握80%的功能。

答主极为推荐的Tutorial是下面这个:

VBScript Tutorial

只需要阅读VBScript Basics的部分,就可以掌握80%。

如果遇到了非常疑难的问题,应该参考最权威的官方文档(MSDN):

VBScript Language Reference

3. 学习Excel VBA
对于想要学习Excel VBA的非程序员朋友,可能遇到的最大的一个门槛就是“面向对象编程”的概念。但对于掌握VBA,对“面向对象编程”先能够理解到以下程度就基本OK了:

我家有一只宠物猫。这里,宠物是一个类(class),我家的猫是这个类的一个对象(object)。猫是白色的,白色就是这个对象的一个属性(property)。我家猫去做绝育就是设置(property set)该对象的另外一个属性。猫罐头是在执行该对象的一个方法(method)

可以认为,Excel以类库(Class Library)的方式扩展了VBScript。在面向对象编程中,对于一个类库有两种使用的方式:1是对类进行继承(例如,类“猫科动物”就是对类“哺乳动物”的继承);2是对类进行例化而形成特定的对象(例如,养一只猫)。对于Excel来说,绝大多数时候在使用第2种方式,即关心如何产生和使用对象。

对于某种功能,Excel将其设置为属性还是设置为方法是有讲究的,通常来说,对象自身的特性(标题、尺寸)等会被设置为属性,而涉及对象与其他对象交互的功能会被设置为方法。并不是所有的面向对象系统都如此。

本部分我们将设定一个简单的需求:在工作表中创建一个10x10的矩阵,每个元素都是1~100之间的一个随机整数。

3.1 环境

有两种方式可使用Excel VBA,一个是使用Windows VBS引入Excel对象,一个是在Excel内部编程。前一种的好处是,因为程序在Excel外部,故可以连续处理多个Excel文件。后一种的好处是有一个集成开发环境(Excel VBE)可以使用,便于调试,缺点是代码分散,且Excel必须启用宏。

下面分别讨论。

3.2 示例

第一种方法,仍然使用本文第二部分的环境,用记事本新建一个文件,录入以下代码:

Option Explicit

Dim app,workbook,sheet
Dim row,col

Set app = WScript.CreateObject("Excel.Application")
app.Visible = True
Set workbook = app.WorkBooks.Add

Set sheet = workbook.Worksheets(1)
'10x10 random value
For row = 1 To 10
  For col = 1 To 10
    sheet.Cells(row,col).Value = CInt(Int((100 * Rnd()) + 1))
  Next
Next
Set sheet = workbook.Worksheets(2)
'10x10 random value
sheet.Range("A1:J10").Formula = "=Int(Rand() * 100 + 1)"

“WScript.CreateObject("Excel.Application")” 是Windows脚本宿主提供的方法(method)

WScript就是Windows脚本宿主对象,方法在本质上是这个对象的成员函数。当你的电脑中安装了Excel之后,会在系统数据库中注册叫做Excel.Application这样一个服务。换句话说,WScript.CreateObject("Excel.Application")相当于“启动Excel这个软件”

注意到这里使用了Set关键字而不是直接赋值,这其中的原因是=只适用于简单数值的赋值,但函数WScript.CreateObject("Excel.Application")的返回值是一个对象句柄。凡对象句柄之间的赋值都要用Set。

接下来设置这个app对象的属性Visible为True,意为把Excel程序显示出来。如果批量处理很多文件,则不用设置这个属性,程序将在后台运行,不会跳出很多Excel来。

我们知道启动Excel时会自动新建一个工作簿(WorkBook),但编程创建的App对象不会自动创建工作簿。Excel中,已经打开的工作簿构成了一个工作簿集合。在VBA里面多个同类的对象通常被归拢到一个集合(collection)当中,而集合本身也是一个对象。在Excel VBA中有各种各样的集合,工作簿集合、工作表集合、图形集合等。对于集合对象有一些统一的方法,例如Add方法的含义是,在该集合中添加一个对象,并返回它。那么Set workbook = app.WorkBooks.Add这句话执行后,Excel就创建了一个新的WorkBook,程序获得了一个workbook对象。

每一个workbook对象在创立后,它的WorkSheets集合会自动添加3个工作表(如同Excel新建工作簿一样)可以通过调用worksheets方法来得到某个工作表。(注:Excel 2013以及后续,workbook对象在创立后只会自动添加一个工作表)

对于第一个工作表,我们设置了两重循环为10x10的矩阵设置随机值。CInt()、Int()和Rnd()函数是VBScript内建函数,具体用法可查阅MSDN。对于第二个工作表,我们利用Excel自带的公式得到随机值。这就是所谓“达成同样的目标有不同的方法”。

以上我们的代码都在Excel外部运行。Excel内部有VBA的集成开发环境,仍然以随机数为例:

在Excel中按Alt+F11组合键呼出集成开发环境。左侧的工程管理窗口会列出所有打开的工作簿,每一个工作簿对应一个VBAProject。每个VBAProject下除了列出所有的工作表独有的代码之外,还有一个ThisWorkbook的项目文件,代表这个工作薄范围内的代码。除此之外,VBAProject还可能有窗体、用户自己开发的类等等。

Excel vba怎么用

Excel 2013 Visual Basic for Applications Develop Environment,与Visual Basic 6非常相似。

Excel vba怎么用

Excel 2016 Visual Basic 编辑器(微软:对你们苹果用户做到这份儿已经够意思了,要啥自行车啊)。

我们将代码放进ThisWorkbook中。这个代码被一个Sub子过程包裹,名字是我们自己起的。这段代码和刚才的代码稍有不同,首先,对于一个句柄变量,声明时最好指定它的类型,其次,由于代码已经位于Workbook内部,故无需创建Excel进程、也无需创建workbook对象。Worksheets成为“内建函数”。而CInt等VBScript内建函数此处仍可以使用。

按F5,由于整个代码块只有一个子过程,该唯一子过程会立即执行。如果关闭了VBA集成开发环境,则可以在Excel菜单中执行“运行宏”来执行这段代码。

最后,由于Excel的安全策略,含有代码的文件需要保存为.xlsm格式。

3.3 获得帮助

学习Excel VBA较为正规的图书是 John Green的 Excel 2007 VBA Programmer's Reference,中文版由Excel Home翻译为《Excel 2007 VBA参考大全》。这本书应至少阅读完前7章。阅读完前4章即可以尝试解决工作中遇到的问题了。

MSDN的

Object model reference (Excel 2013 developer reference)

相当于一本“词典”,经常翻阅非常有好处。

4 写在最后

经常使用Excel的人士普遍对Excel公式掌握的出神入化,但Excel VBA却遵循着不一样的思维方式——它更接近于Excel软件自身的运行规律,而不是数据层面的特点。

VBScript和Excel VBA的系统性非常强,一本系统性强、例子丰富的书籍必不可少,MSDN乃居家必备。

当然搜索引擎也是一个好助手,把你的问题用英文表述直接Google,通常会获取丰富的答案。不能访问Google也很难科学上网的朋友可以试试

AOL - News, Sports, Weather, Entertainment, Local & Lifestyle

,aol的搜索后端是Google提供的。

众所周知,百度的中文技术资源质量一向低下(

百度 - 话题精华

),因此:

无论任何时刻都不要使用百度

无论任何时刻都不要使用百度
无论任何时刻都不要使用百度

无论任何时刻都不要使用百度
无论任何时刻都不要使用百度
(特别重要的事情说5遍)