1. 先搞清楚 VBA 到底能帮你解决什么,再决定要不要学
如果你每天都要在 Excel 里做大量重复的复制粘贴、数据整理、格式调整、跨表汇总,或者需要把几十个报表手动合并成一个,那 VBA 就是你最该优先考虑的工具。它不是什么高深莫测的黑科技,而是内嵌在 Excel 里的一个自动化脚本语言,核心就一件事:把你手动操作的步骤,用代码记录下来,下次一键自动执行。
很多人被“编程”两个字吓到,觉得这是程序员的事。但 VBA 不一样,它的学习门槛远低于 Python 或 Java,目标非常明确——就是为了解决 Excel 工作中的重复劳动。你不用去理解复杂的算法,只需要学会如何“指挥”Excel 去完成你平时用鼠标和键盘做的那些事。比如,自动从十几个工作簿里提取指定列的数据,合并到一个新表里;或者每天定时把某个文件夹下的所有 CSV 文件导入 Excel,并按固定格式清洗好。
所以,这篇文章不是讲编程理论,而是从一个每天跟表格打交道的人的角度,告诉你如何用 VBA 把那些耗时、易错、枯燥的“体力活”自动化。我会从最基础的“怎么打开 VBA 编辑器”开始,带你一步步写出第一个能实际跑起来的脚本,再到处理真实工作中那些乱七八糟的数据文件。整个过程,你不需要任何编程基础,只需要一台装了 Excel 的电脑,和一份被重复工作折磨到想“摆烂”的心情。
2. 环境准备:你的 Excel 支持 VBA 吗?第一步别走错
动手之前,先确认你的“战场”是否就绪。不是所有 Excel 都能完美运行 VBA,这一步错了,后面全是白费功夫。
2.1 确认 Excel 版本与 VBA 支持
首先,打开你的 Excel,看看版本。主流的情况如下:
- Microsoft Excel 2010, 2013, 2016, 2019, 2021, 365 (Windows版):这些版本都原生支持 VBA,可以直接使用。
- Microsoft Excel for Mac:虽然也支持 VBA,但功能和稳定性上可能与 Windows 版有细微差异,部分 Windows API 相关的代码无法运行。如果你是 Mac 用户,需要有心理准备,一些复杂的网络操作或文件系统操作可能会受限。
- WPS Office:这是一个关键点。WPS 个人版对 VBA 的支持是不完全的,需要单独安装 VBA 插件,且即使安装了,兼容性也可能存在问题。很多在 Excel 里运行正常的代码,在 WPS 里可能会报错。对于学习和严肃的自动化工作,强烈建议使用 Microsoft Excel (Windows)。如果公司强制使用 WPS,请先与 IT 部门确认 VBA 支持情况,或寻找替代方案(如 WPS 的 JS 宏)。
- Excel Online (网页版):不支持 VBA。它只能处理基础的数据和公式。
如何快速检查?在 Excel 里按下Alt + F11。如果弹出了一个新窗口(通常是灰色背景,里面有代码编辑区域),那么恭喜,VBA 编辑器打开了,说明环境基本可用。如果没反应,或者提示“无法找到宏”,那很可能你的 Office 安装时没有包含 VBA 组件,或者使用的是不支持的环境。
2.2 启用“开发工具”选项卡
VBA 编辑器可以用快捷键打开,但为了方便,我们通常会把“开发工具”选项卡显示在 Excel 主界面的功能区里。这里存放着录制宏、运行宏、打开编辑器等常用按钮。
- 在 Excel 中,点击“文件”->“选项”。
- 在弹出的“Excel 选项”对话框中,选择“自定义功能区”。
- 在右侧“主选项卡”列表中,找到并勾选“开发工具”。
- 点击“确定”。回到 Excel 主界面,你应该能看到功能区多了一个“开发工具”选项卡。
2.3 调整宏安全设置(非常重要!)
为了防止恶意代码自动运行,Excel 默认的宏安全设置会阻止所有宏。在你学习和开发阶段,需要临时调整一下,否则自己写的代码也跑不起来。
- 点击刚才启用的“开发工具”选项卡。
- 点击“宏安全性”。
- 在“信任中心”对话框中,选择“宏设置”。
- 对于学习环境,建议选择“禁用所有宏,并发出通知”。这样,当你打开包含宏的文件时,Excel 会在顶部显示一个安全警告栏,你可以选择“启用内容”。这既保证了安全,又允许你运行自己的宏。
- 切勿在未知来源的文件上选择“启用所有宏”,这是极高的安全风险。
环境准备好后,我们不是直接去啃代码,而是先用 Excel 自带的一个“外挂”功能——宏录制器。这是理解 VBA 工作原理最快的方式。
3. 从“录制宏”开始:让 Excel 教你写第一行代码
对于零基础的人来说,直接看代码是天书。但如果你能让 Excel 把你手动操作的过程“翻译”成代码,再去看这些代码,就会豁然开朗。这就是“录制宏”的功能。
3.1 完成一次完整的宏录制实战
假设我们有一个常见任务:把 A 列的数据复制到 C 列,并把 C 列的字体加粗、变成红色。
- 准备数据:在 Excel 新工作表的 A1 单元格输入“测试数据1”,A2 输入“测试数据2”。
- 开始录制:点击“开发工具”选项卡下的“录制宏”。
- 设置宏名:在弹出的对话框中,给宏起个名字,比如
MyFirstMacro。快捷键可以不设,保存位置选择“当前工作簿”。点击“确定”。此时,Excel 已经开始记录你的每一个操作。 - 执行操作:
- 选中 A1:A2 单元格区域。
Ctrl + C复制。- 选中 C1 单元格。
Ctrl + V粘贴。- 保持 C1:C2 为选中状态,在“开始”选项卡下,点击B(加粗)按钮,再点击字体颜色按钮,选择红色。
- 停止录制:点击“开发工具”选项卡下的“停止录制”。
至此,你的第一个“宏”(其实就是一段 VBA 代码)已经录制好了。它完整记录了你刚才的所有步骤。
3.2 查看并理解录制的代码
现在,按下Alt + F11打开 VBA 编辑器。在左侧的“工程资源管理器”窗口(如果没看到,按Ctrl + R),找到“VBAProject (你的工作簿名)”,展开“模块”文件夹,你会看到一个叫“模块1”的东西,双击它。
右侧的代码窗口会出现类似下面的代码:
Sub MyFirstMacro() ' ' MyFirstMacro Macro ' Range("A1:A2").Select Selection.Copy Range("C1").Select ActiveSheet.Paste Selection.Font.Bold = True Selection.Font.Color = RGB(255, 0, 0) End Sub我们来拆解一下:
Sub MyFirstMacro() ... End Sub:这是一个“子过程”,你可以把它理解为一个可执行的任务包,名字叫MyFirstMacro。- 以单引号
‘开头的行是注释,不会被运行,只是给人看的说明。 Range(“A1:A2”).Select:这行代码对应你“选中A1:A2区域”的操作。Range代表单元格区域,Select是选中它。Selection.Copy:Selection指当前选中的东西(即A1:A2),.Copy就是复制。Range(“C1”).Select和ActiveSheet.Paste:选中C1,然后粘贴。Selection.Font.Bold = True:将当前选中区域(C1:C2)的字体加粗属性设置为“真”(即启用)。Selection.Font.Color = RGB(255, 0, 0):将字体颜色设置为 RGB(255,0,0),也就是红色。
看,是不是一下子就明白了?VBA 代码就是在用英语单词和对象(如Range,Font)命令 Excel 做事。录制宏的最大价值,就是帮你快速找到完成某个操作对应的 VBA 语句是什么。
3.3 运行与修改你的宏
- 运行:在 VBA 编辑器里,把光标放在
Sub MyFirstMacro()过程的任何位置,然后按F5键,或者点击工具栏上的绿色三角运行按钮。切回 Excel 窗口,你会发现代码自动又执行了一遍刚才的所有操作。 - 修改与优化:录制的宏通常很“啰嗦”,有很多不必要的
Select(选中)动作。我们可以直接优化它。将代码修改成下面这样,效果完全一样,但更简洁高效:
这里我们直接让 C1:C2 的值等于 A1:A2 的值,省去了复制粘贴的中间步骤。记住这个原则:能直接操作对象(Sub MyFirstMacro_Optimized() Range("C1:C2").Value = Range("A1:A2").Value '直接赋值,无需复制粘贴 Range("C1:C2").Font.Bold = True Range("C1:C2").Font.Color = RGB(255, 0, 0) End SubRange),就尽量避免使用Select和Selection,代码会更快、更稳定。
通过录制宏,你已经跨出了最关键的一步:看到了 VBA 代码和 Excel 操作之间的直接联系。接下来,我们需要系统地认识一下 VBA 世界里几个最重要的“居民”。
4. 掌握核心概念:对象、属性、方法与变量
脱离录制宏,要自己写代码,必须理解 VBA 的底层逻辑。它是一门面向对象的语言,核心就四样东西:对象、属性、方法、变量。理解它们,所有代码都能看懂一大半。
4.1 对象与属性:什么东西,是什么样
- 对象:就是 Excel 里你可以操作的东西。最大的对象是
Application(Excel 程序本身),下面是Workbook(工作簿),再下面是Worksheet(工作表),然后是Range(单元格区域),还有Chart(图表)、Shape(形状)等等。它们像俄罗斯套娃,一层层包含。 - 属性:是对象的特征或状态。比如,一个
Range对象(如Range(“A1”)),它有Value(值)、Formula(公式)、Font(字体)、Interior.Color(填充颜色)等属性。
语法是:对象.属性
- 读取属性:
myValue = Range(“A1”).Value(把A1的值读出来,存到变量myValue里) - 设置属性:
Range(“A1”).Value = “你好”(把A1的值设置为“你好”) - 对象的属性本身可能也是对象:
Range(“A1”).Font是一个字体对象,它还有自己的属性,如.Bold(是否加粗)、.Size(字号)。所以可以连续点下去:Range(“A1”).Font.Bold = True
4.2 方法:让对象做什么事
- 方法:是对象可以执行的动作。比如,
Range对象有.Copy(复制)、.PasteSpecial(选择性粘贴)、.Clear(清除)等方法。
语法是:对象.方法 [参数]
Range(“A1:A10”).Copy:执行复制动作。Range(“B1”).PasteSpecial Paste:=xlPasteValues:执行选择性粘贴,并且只粘贴数值。这里的xlPasteValues就是一个参数,告诉 Excel 怎么贴。
一个综合例子:
Sub ObjectPropertyMethod() Dim ws As Worksheet ‘声明一个代表工作表的变量 Set ws = ThisWorkbook.Worksheets(“Sheet1”) ‘让变量ws指向“Sheet1”这个工作表对象 ‘设置属性 ws.Range(“A1”).Value = “标题” ‘设置A1单元格的值 ws.Range(“A1”).Font.Bold = True ‘设置A1字体加粗 ws.Range(“A1”).Interior.Color = RGB(255, 255, 0) ‘设置A1填充为黄色 ‘调用方法 ws.Range(“A1”).Copy ‘复制A1 ws.Range(“A2”).PasteSpecial Paste:=xlPasteFormats ‘将格式粘贴到A2 Application.CutCopyMode = False ‘清除剪贴板(这是一个Application对象的方法) End Sub4.3 变量:数据的临时储物柜
变量是用来存储数据的容器,比如数字、文本、对象引用等。使用变量可以让代码更灵活、易读。
- 声明变量:使用
Dim语句。最好指明类型,这样 VBA 运行效率更高,也容易排查错误。Dim i As Integer ‘声明一个整数型变量i Dim s As String ‘声明一个字符串型变量s Dim rng As Range ‘声明一个Range对象型变量rng Dim wb As Workbook ‘声明一个Workbook对象型变量wb - 给变量赋值:
i = 10 s = “Hello World” Set rng = Worksheets(“Data”).Range(“A1”) ‘对象变量赋值要用Set关键字 - 使用变量:
rng.Value = s ‘将变量s的值赋给rng代表的单元格 For i = 1 To 5 ‘在循环中使用变量i作为计数器 Cells(i, 1).Value = i * 2 Next i
关于“VBA全局变量”:上面用Dim在过程内部声明的变量是局部变量,只在当前Sub或Function内有效。如果需要在多个模块、多个过程中共享同一个变量,需要在标准模块的顶部(所有过程之外),用Public或Global关键字声明,这就是全局变量。但初学者应谨慎使用全局变量,因为它可能被意外修改,导致难以调试的bug。优先考虑通过参数在过程间传递数据。
掌握了这些核心概念,你就有能力阅读和编写大部分基础的 VBA 代码了。接下来,我们把这些知识组合起来,解决一个真实场景:批量处理多个文件。
5. 实战:批量合并多个Excel工作簿的数据
这是 VBA 最经典的应用场景之一。假设你每天会收到来自不同部门的10个Excel报表(销售部.xlsx、市场部.xlsx…),它们结构相同(比如都有“姓名”、“销售额”两列),你需要把它们全部汇总到一个总表里。
5.1 思路分析与准备工作
- 目标:遍历指定文件夹下的所有
.xlsx文件,打开每个文件,将其第一个工作表中 A 列和 B 列的数据(假设从第2行开始是数据),复制到“总表.xlsm”的指定位置,并按顺序排列。 - 关键对象和方法:
FileSystemObject(FSO):用于操作文件和文件夹(需要引用Microsoft Scripting Runtime库,更简单的方法是使用Dir函数)。Workbooks.Open:打开一个工作簿。ThisWorkbook:代表当前正在运行宏的“总表”工作簿。Range.Copy/Destination:复制数据到目标区域。Workbook.Close:关闭打开的工作簿。
- 准备工作:
- 新建一个 Excel 文件,另存为“Excel 启用宏的工作簿 (*.xlsm)”,命名为“数据汇总.xlsm”。
- 在这个工作簿里,创建一个名为“汇总结果”的工作表。
- 在电脑的某个位置(如桌面)新建一个文件夹,命名为“待汇总报表”,把那10个部门的报表放进去。
5.2 分步代码实现与详解
我们将代码写在一个新的标准模块中。在 VBA 编辑器里,右键“工程资源管理器”中的你的工作簿 -> 插入 -> 模块。
Sub MergeMultipleWorkbooks() ‘声明变量 Dim sFolderPath As String ‘文件夹路径 Dim sFileName As String ‘文件名 Dim wbSource As Workbook ‘源工作簿(部门报表) Dim wsSource As Worksheet ‘源工作表 Dim wsTarget As Worksheet ‘目标工作表(汇总结果) Dim lLastRow As Long ‘目标表最后一行 Dim lSourceLastRow As Long ‘源表数据最后一行 ‘1. 设置文件夹路径(请修改为你的实际路径) sFolderPath = “C:\Users\你的用户名\Desktop\待汇总报表\” ‘注意路径以反斜杠结尾 ‘2. 设置目标工作表 Set wsTarget = ThisWorkbook.Worksheets(“汇总结果”) ‘清除目标表旧数据(可选,从第二行开始清) wsTarget.Range(“A2:B10000”).ClearContents ‘3. 获取目标表当前最后一行(从第2行开始放数据) lLastRow = 1 ‘初始化为标题行 ‘4. 使用Dir函数遍历文件夹下所有.xlsx文件 sFileName = Dir(sFolderPath & “*.xlsx”) ‘获取第一个.xlsx文件 ‘循环,直到Dir返回空字符串(没有更多文件) Do While sFileName <> “” ‘5. 打开源工作簿 Set wbSource = Workbooks.Open(Filename:=sFolderPath & sFileName, ReadOnly:=True) ‘以只读方式打开,安全 ‘假设数据在第一个工作表 Set wsSource = wbSource.Worksheets(1) ‘6. 找到源工作表A列的最后一行数据(假设数据连续无空行) lSourceLastRow = wsSource.Cells(wsSource.Rows.Count, “A”).End(xlUp).Row ‘7. 如果源表有数据(标题行不算) If lSourceLastRow > 1 Then ‘复制A2:B到最后一行 的数据 wsSource.Range(“A2:B” & lSourceLastRow).Copy ‘粘贴到目标表 wsTarget.Cells(lLastRow + 1, “A”).PasteSpecial Paste:=xlPasteValues ‘只粘贴值 ‘更新目标表最后一行位置 lLastRow = wsTarget.Cells(wsTarget.Rows.Count, “A”).End(xlUp).Row End If ‘8. 关闭源工作簿,不保存更改 wbSource.Close SaveChanges:=False ‘9. 获取下一个文件名 sFileName = Dir() Loop ‘10. 清理 Application.CutCopyMode = False ‘清除剪贴板 wsTarget.Range(“A1”).Value = “姓名” ‘写标题 wsTarget.Range(“B1”).Value = “销售额” wsTarget.Columns(“A:B”).AutoFit ‘自动调整列宽 MsgBox “数据合并完成!共处理了 ” & (lLastRow - 1) & “ 行数据。”, vbInformation End Sub5.3 代码关键点解析与避坑指南
- 路径问题:
sFolderPath必须是完整的绝对路径,并以反斜杠\结尾。新手最容易错在这里,导致Dir函数找不到文件。你可以先手动复制文件夹的路径。 Dir函数:这是 VBA 内置的、无需额外引用的文件遍历函数。Dir(sFolderPath & “*.xlsx”)返回第一个匹配的文件名。之后再次调用Dir()(不带参数),会返回下一个匹配的文件名。当没有更多文件时,返回空字符串,循环结束。End(xlUp):这是 VBA 中非常经典的技巧,等同于在 Excel 里按Ctrl + ↑。wsSource.Cells(wsSource.Rows.Count, “A”).End(xlUp).Row意思是:从 A 列最底部的单元格(第1048576行)向上找,遇到第一个有内容的单元格,返回它的行号。这样就动态找到了数据的最后一行,避免了固定行数的限制。- 只读打开与关闭:
Workbooks.Open(…, ReadOnly:=True)以只读模式打开外部文件,防止意外修改原文件。关闭时SaveChanges:=False确保不保存任何更改。 - 只粘贴值:
PasteSpecial Paste:=xlPasteValues非常重要。它只粘贴数据,不粘贴源单元格的格式、公式等。这能保证汇总表格式统一,并避免公式引用错误。 - 变量更新:在循环中,每次粘贴新数据后,都需要重新计算
lLastRow(目标表最后一行),以便下一份数据能接在后面粘贴,不会覆盖。 - 错误处理:上述代码是理想情况。实际中,文件夹可能为空、文件可能损坏、工作表名可能不是第一个。更健壮的代码应该加入错误处理(
On Error GoTo …),但作为入门,我们先保证主流程跑通。
运行这段代码,你会发现几十秒内就完成了原本需要手动打开、复制、切换、粘贴几十次的操作。这就是 VBA 自动化的威力。
6. 进阶与调试:让代码更健壮,解决问题
当你开始写更复杂的脚本时,一定会遇到代码报错或者结果不如预期的情况。别慌,这是学习的一部分。VBA 提供了强大的调试工具。
6.1 常用的调试技巧
- 逐语句执行 (F8):在 VBA 编辑器中,按
F8可以一行一行地执行代码。这是理解代码执行流程、定位错误行最有效的方法。执行时,鼠标悬停在变量上可以看到当前值。 - 设置断点:在代码行左侧灰色区域点击,会出现一个红点,这就是断点。当程序运行到这一行时会自动暂停。你可以在此检查各个变量的状态。再次点击红点可取消断点。
- 立即窗口 (Ctrl + G):在暂停状态下,在立即窗口里输入
?变量名然后回车,可以立刻查看该变量的值。你也可以直接执行命令,比如?Range(“A1”).Value。 - 本地窗口:在调试状态下,本地窗口会自动显示当前过程中所有变量的类型和值,一目了然。
Debug.Print:在代码中插入Debug.Print “变量i的值是:” & i,运行后,这条信息会打印到立即窗口,用于跟踪程序运行到某处时变量的状态,而不弹出窗口打断流程。
6.2 添加基础错误处理
没有错误处理的代码是脆弱的。一个简单的错误处理框架如下:
Sub MyProcedure() On Error GoTo ErrorHandler ‘开启错误捕获,发生错误时跳转到ErrorHandler标签处 ‘这里是你的主要代码 ‘… … Exit Sub ‘正常结束时,跳过错误处理部分 ErrorHandler: MsgBox “程序运行出错!” & vbCrLf & _ “错误号:” & Err.Number & vbCrLf & _ “错误描述:” & Err.Description, vbCritical ‘这里可以添加一些清理代码,比如关闭打开的文件 End Sub这样,当程序出错(如文件不存在、类型不匹配)时,会弹出一个友好的错误提示框,告诉你错误原因,而不是直接崩溃。
6.3 回答一些常见疑问
- “VBA类模块是做什么用的?”:类模块(Class Module)是 VBA 中面向对象编程的高级特性。它允许你自定义一种新的“对象类型”。比如,你可以定义一个“员工”类,它有“姓名”、“工号”、“部门”等属性,还有“计算年薪”等方法。在简单的自动化任务中很少用到,但当你要管理大量具有相同特征的数据和操作时,类模块能让代码结构更清晰、更易维护。对于入门者,可以先掌握标准模块。
- “VBA密码找回方法?”:如果忘记了 VBA 工程密码,没有官方支持的合法找回方法。网上流传的一些破解方法可能涉及修改文件二进制数据,存在风险且可能违法。最好的办法是养成良好的习惯:重要代码定期备份到文本文件或版本控制系统(如Git),并妥善保管密码。
- 关于与其他技术结合:热搜词里提到了
html调用excel数据、python入门、vue入门等。VBA 是 Office 生态内的自动化工具。与外部系统交互,更常见的现代方案是:- Python + openpyxl/pandas:在 Excel 外部,用 Python 脚本进行更复杂的数据处理和自动化,功能更强大,生态更丰富。
- Office JS API:用于开发 Office 插件,可以在网页、Office 桌面版和在线版中运行,跨平台性更好,但学习曲线不同。 VBA 的优势在于深度集成、无需额外环境、对于纯 Office 工作流自动化速度快、学习资源多。如果你的场景完全局限于 Excel/Word/PowerPoint 内部自动化,VBA 仍然是最高效的选择。
7. 从脚本到工具:封装与分发你的成果
当你写好一个有用的宏之后,你肯定希望它能方便地重复使用,或者分享给同事。有几种方式:
7.1 保存在个人宏工作簿
个人宏工作簿 (PERSONAL.XLSB) 是一个隐藏的工作簿,每次启动 Excel 时都会在后台加载。保存在这里的宏,可以在你打开的任何Excel 文件中使用。
- 录制或编写一个宏。
- 在“保存宏”的对话框中,选择“个人宏工作簿”。
- 保存后,你可以在任何工作簿中,通过“查看宏”对话框 (
Alt + F8) 看到并运行它。
7.2 创建自定义按钮
你可以将宏指定给功能区按钮、快速访问工具栏或工作表上的按钮(表单控件或 ActiveX 控件)。
- 快速访问工具栏:文件 -> 选项 -> 快速访问工具栏。从“不在功能区中的命令”里找到“宏”,选择你的宏,点击“添加”。
- 工作表按钮:在“开发工具”选项卡下,插入“按钮(表单控件)”,在工作表上画出来,会自动弹出对话框让你指定一个宏。
7.3 制作成加载项 (.xlam)
这是分发 VBA 工具给其他人的专业方式。加载项是一个特殊的工作簿,其功能可以被其他工作簿调用,但界面是隐藏的。
- 在一个包含完整 VBA 代码的工作簿中,点击“文件”->“另存为”。
- 选择保存类型为“Excel 加载宏 (*.xlam)”。
- 保存后,在需要使用该工具的工作簿中,点击“文件”->“选项”->“加载项”。在底部“管理”处选择“Excel 加载项”,点击“转到…”。在弹出的对话框中点击“浏览”,找到你保存的
.xlam文件并勾选它。 - 加载后,你的自定义功能(如新的菜单、按钮)就会出现在 Excel 中。
7.4 重要提醒:关于文件格式与宏
- .xlsx vs .xlsm:普通 Excel 文件 (.xlsx)不能存储 VBA 宏。必须保存为“Excel 启用宏的工作簿 (*.xlsm)”格式。
- 安全警告:包含宏的文件打开时,都会出现“安全警告”。你需要点击“启用内容”才能运行宏。这是 Excel 的保护机制。确保你的宏来自可信来源。
走到这一步,你已经从一个 Excel 表格操作者,变成了一个能创造工具、提升效率的“自动化工程师”。VBA 的世界还有很多可以探索,比如操作其他 Office 软件、处理数组提升速度、使用字典去重计数、制作用户窗体 (UserForm) 实现交互界面等。但所有这些高级功能,都建立在扎实理解对象、属性、方法、变量和流程控制的基础上。
我个人更建议,在入门阶段,不要追求复杂和炫技。牢牢抓住“解决具体重复工作”这个核心目标,用录制宏学语法,用核心概念写简单脚本,用调试工具解决问题。当你成功用一段代码把自己从半小时的机械劳动中解放出来时,你获得的成就感和动力,会推动你自然而然地走向更深入的学习。