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 基础

 

VBA 变量、类型、运算符

 

VBA 程序结构

 

VBA 过程和函数 (Sub | Function)

 

130 评论
最新
最久 最赞
内联反馈
查看所有评论
Jerry
2 天 前

老大,VBA的模块继续增加内容吧。

大宝徐
18 天 前

请问下,word当中表格里面有合并单元格,既有水平方向,也有垂直方向的, 它的行数和列数是怎么来的,有些单元格访问不到。请问如何遍历所有的单元格呢?

大宝徐
8 天 前
回复给  懒人Excel

我现在想到的就是加上on error resume next, 基本能解决问题
for i=1 to table.rows.count step 1
for j=1 to table.columns.count step 1
on error resume next
//to do something here
next j
next i

大宝徐
20 天 前

word表格里面有合并的单元格,既有行合并的单元格,也有列合并的单元格,我要怎么样遍历所有单元格呢?

noalias
21 天 前

大佬,关于省略引用有没有好的总结?有时候在模块中创建的过程中对象省略引用,在工作表中调用就容易报错。
还有个迷惑的地方,将一个range赋值给variant变量,该变量可作为一个数组使用,但用 join 函数操作该数组就会报错

最后编辑于 21 天 前 @ noalias
Stena
22 天 前

跪求博主分享一些类似合并 拆分类的案例讲解~~

大东东
24 天 前

excle vba 好多方法,有API或者网站可以查询没

小菜菜
23 天 前
回复给  懒人Excel

关注是公众号懒人Excel吗?

大东东
22 天 前
回复给  小菜菜

官网看了还行 就是没有离线的帮助文档

微微*
28 天 前

这些是全部么?已经更新完了?

大宝徐
1 月 前

工作中碰到vba操作word文档,想要修改项目编号列表中的数字,比如4.5.1改成4.3.5之类的,有办法吗?

大宝徐
20 天 前
回复给  懒人Excel

已经搞定了,我直接强制改了。

COCO
1 月 前

我想问一下,如何在Excel表格内设置一个VBA可以将同文件夹内的TXT类型文件内的数据整理到Excel表格内
是多个TXT文件,不是单个的哦

最后编辑于 1 月 前 @ COCO
COCO
1 月 前
回复给  懒人Excel

谢谢啦,可以的话具体操作可以有个SOP吗?

Coral
1 月 前

每一种语言或工具都有核心或精华,比如C语言精华就是类,请问您认为VBA的精华是什么?

Coral
1 月 前
回复给  懒人Excel

多谢。我以为是对象。毕竟VBA的语法简单,掌握了如何操作对象,就基本上可以搞定很多问题了。

爱说实话
1 月 前
回复给  Coral

毛*啊,我觉得VBA语法超级复杂,就函数过程的sub end sub ,还有返回值 和其它语言比 弱爆了,啰里啰唆, 哪里简单? 超级复杂无用。 你看看python ,java , 那个函数定义写这么多废话。也就是excel 原生支持VBA没办法了 ,

Coral
1 月 前
回复给  懒人Excel

多谢回复。期待更新。

Coral
2 月 前

有的篇章并没有在上面的列表里,如’如何打开 Excel VBA 编辑器?’(从其他篇章的尾部链接进入的)。是不是它已经包含在上述列表的某个篇章里了,如’使用 VBA 编辑器进行 Excel VBA 开发‘?

Coral
2 月 前

在VBA里写的所有不带参数的过程,都会自动产生一个对应的Macro? 而带参数的子过程和函数(不管带不带参数),则不会自动产生一个对应的Macro?
另外,以学完所有篇章,期待后续更新,尤其是对象。写的很棒。非常感谢。

Coral
2 月 前
回复给  懒人Excel

是的,我想错了。不是产生,是显示在macro列表中。那么可以认为无参数的过程就等同于macro?

Coral
1 月 前
回复给  懒人Excel

专业!高手。回复的很全面。

eric
2 月 前

有没有防止vba被查杀的方法

Coral
2 月 前

写的好棒。希望看到持续更新。即使选了’自动缩进‘,还是需要自己按’TAB‘键,或点击’缩进‘按钮。可以像python那样,回车后就能自动缩进吗?

Joe
2 月 前

之前见过别人的Excel数据表里头,手动输入的数字是黑色,用公式算出来的数字是蓝色,请问这个也是用vba做出来的吗?可以出个教学吗?谢谢!

levi
2 月 前

非常感谢大大的教学,通俗易懂,小白学习起来也不吃力

大马力开动
4 月 前

文章整理的很棒

果粒橙
4 月 前

太感谢了,这正是我想要的资料,而且做得很方便

路人甲
4 月 前

刚刚开始学习,非常感谢分享!整理得很实用!

Rand
4 月 前

期待更新

NRD90M
4 月 前

楼主可以写一个关于一个工作簿,工作表,单元格都包含什么属性吗

eos_li
5 月 前

我想请教一下:我该如何调用含有数组传递的函数,下面的语法错误该如何纠正
——————————————————————————–
‘根据数据文件生成新文件
Sub createFileAccordingDatafile()
  Dim fileNum As Integer
  Dim i As Integer
  Dim getFileTitleNum As Integer
  Dim fileNameList(1 To 1000) As String
   
  getFileTitleNum = GetFileList(fileNameList)
  For i = 1 To getFileTitleNum
    CreateNewFile( fileNameList, getFileTitleNum) //这句说是语法错误
  Next
   
End Sub

‘创建新文件
Sub CreateNewFile(fileName() As String, getFileTitleNum As Integer)

eos_li
5 月 前

请问数组章节在哪里?正需要

imdandanlee
5 月 前

Rnd*100不用加()吗?

为12345
5 月 前

期待后续的实例更新

dqgtc001
5 月 前

太谢谢作者了,职场新人就靠这份教程学习了。

Rover
5 月 前

感谢作者!
这是我看到过最好的VBA教程,逻辑严谨,步步深入,快速上手。

benZ
5 月 前

感谢这么好的教程分享!期待更多的更深入的教程更新!
作者大大太无私了,没有广告,没有付费,没有扫码,真正的互联网精神!

xiaobing
5 月 前

非常不错,果断收藏,比百度靠谱多了

jinx
5 月 前

感谢分享

ESAKA
6 月 前

二刷打个卡

gmmsis
6 月 前

感谢分享,教程很好,期待接下来能继续有更新。

天程君
6 月 前

请问有结合实例来更新吗??

ll2387560
7 月 前

非常好的教程,清晰简洁、明了,系统、完整、结构化

water
7 月 前

感謝 用心製作

娜娜娜娜
7 月 前

感谢!通俗易懂!

我想吃火锅
7 月 前

感谢作者,全篇通俗易懂,很nice

ESAKA
8 月 前

看完了打个卡,感谢博主

BLUE
10 月 前

内容通俗易懂又不失重点。很赞!!
请问教程到此结束了吗?数组和对象有讲解吗?意犹未尽啊~~~

大宝徐
10 月 前

我原来以为VBA只是在excel,没想到还可以操作word,powerpoint,outlook等等一众office组件。太厉害了。

大宝徐
10 月 前

太棒了,最近用excel生成一个word文档,顺便系统学习下,感谢!

韦大帅
10 月 前

真是太感谢作者了,正好有这方面的学习需求

Tim
11 月 前

还会加内容吗?想看图表处理和实例演示

HRY
11 月 前

good

leongmanlai
11 月 前

nice!

Will
11 月 前

非常不错,感谢作者

LRWJ
1 年 前

可以更新点高级的吗

hcat
8 月 前
回复给  懒人Excel

加油啊,很期待

Jaffen
1 年 前

VBA这部分内容写的真好,循序渐进,专业却易懂,对初学者来说是个很友好教程;持续关注中,期待能有更进一步的深度学习内容,比如对文档对象(工作薄)的操作,以及能有一些常见实例来对照学习能更好。
看作者不但软件水平好,英文水平也是相当不错,是不是两者是相辅相成的?

Terch
4 月 前
回复给  懒人Excel

感谢。有推荐的英文网站吗?

123
1 年 前

现在算是更新到百分之几的进度了?全看完了,在线等,不急

dongqing
1 年 前

十分感谢作者,在知乎上看到的,资源非常好!

130
0
希望看到您的想法,请发表评论。x
()
x