简介:《EXCEL VBA常用代码实战大全》面向希望系统学习 Excel VBA 编程入门与常用技巧的办公人员和初学者,围绕单元格对象、区域选取、数据定位查找、复制粘贴与自动化处理等高频场景展开,帮助读者把重复操作转化为可复用代码。压缩包共 1 个 docx 文件,约 15.12MB,以文档形式集中收录常用技巧解析,便于按章节检索和边练边查。涵盖 Range、Cells、Offset、Resize、Union、UsedRange、CurrentRegion 等对象用法,也讲解 Select、Activate、Goto、Find、FindNext、Like 运算符、选择性粘贴与禁用拖放,并延伸到循环、条件判断、With 语句、错误处理、数组和用户窗体。已有 2071 人学习,适合入门与日常速查。
1. 从一张每月重做一遍的表格说起:VBA 到底能替你干什么
很多人搜 Excel VBA编程入门范例,起因都很具体:手里有一张每个月都要重做一遍的表,复制、粘贴、调格式、再另存一份,一套下来半小时,做完还总担心漏了几行。你隐约知道这类活儿能交给代码,可打开 Excel 又找不到写代码的地方,于是每次都在「要不要学」和「算了下次吧」之间来回摇摆。
这份资源正是为这个阶段准备的。它把 VBA 里最常用的操作按单元格、工作表、工作簿、图形图表、应用程序几个层次拆成一条条可以直接抄用的代码片段,不要求你先啃完一门语言。它适合每天跟表格打交道、没有编程基础、想先把重复动作交给机器的人,也适合学过一点语法但一动手就报错的人。下面按「先懂是什么、再跑第一个例子、然后按地图扩展、最后避开坑」的顺序带你走一遍。
2. 先搞懂一个概念:VBA 到底是住在表格里的什么
2.1 它不是一门要学完才能用的语言
零基础的人最大的误解,是把 VBA 当成一门要系统学完才能碰的语言。事实相反:VBA 是内置在 Excel 里的一套指令系统,你不需要安装任何东西,也不需要配置环境,新建一个文件就能写。它更像电饭煲上的预约键——你不需要懂电路,只要知道按哪个键、按几下,饭就会在指定时间煮好。
配套的另一个词是「宏」。宏可以理解成录音机:你按下录制,然后手动做一遍操作,Excel 会把这一串动作记下来,下次一键重放。录制出来的东西,本质就是 VBA 代码,只不过写得又长又笨。大多数人入门 VBA 的真实路径,是先录一段宏,打开看看它生成了什么,再动手把那堆啰嗦的代码删减、改条件、加循环。这条路比从语法第一页开始读要快得多,也更容易坚持。
所以入门阶段的目标不是「学会 VBA」,而是「攒下二十个能直接改改就用的片段」。这份资源的价值就在这里:它把常用片段按场景归好了类,你遇到问题时按场景去翻,而不是从第一章顺着读。
2.2 一段代码在 Excel 里跑起来,中间发生了什么
很多新手跑代码时报错,根源不是语法写错,而是没搞清楚「我在操作谁」。Excel 的对象是一层套一层的,像抽屉里套抽屉,你打开哪个抽屉,才能动哪个抽屉里的东西。把这张表记住,后面九成的报错你都能自己定位。
| 层级 | 你平时点的东西 | 代码里通常怎么写 | 常见动作 |
|---|---|---|---|
| Application | 整个 Excel 程序 | Application | 关屏幕刷新、改窗口标题、设状态栏 |
| Workbook | 一个 .xlsm 文件 | ThisWorkbook、Workbooks("名字.xlsm") | 打开、保存、关闭、判断是否已打开 |
| Worksheet | 底下那排标签页 | Worksheets("明细")、ActiveSheet | 添加、删除、隐藏、保护、遍历 |
| Range | 一个个格子 | Range("A1")、Cells(1, 1) | 读写、查找、设格式、加批注 |
代码写好之后放在哪里?放在「模块」里,模块跟着工作簿一起保存。这也是为什么后面会反复强调文件格式:普通表格文件存不下这些代码,只有启用宏的格式才装得下,这件事我们放到避坑那一章细说。
2.3 为什么零基础也值得花这个时间
先算一笔账。一份每月要花三小时手工整理的报表,一年是三十六小时;把它交给代码,第一次写可能要两小时,之后每月省下三小时,第二个月就开始回本。更值钱的其实不是时间,是错漏——手工复制粘贴最容易出的事故是漏行、错列、覆盖了不该覆盖的单元格,而代码每次跑的逻辑是一样的。
第二层收益是跨表汇总。当你手上有十二个月的明细表、结构完全一致,手工合并是体力活,而一段遍历工作表的循环三十秒就能干完。这份资源里「遍历工作表」「删除空行」「删除重复行」「复制自动筛选后的数据区域」这几组技巧,解决的就是这类场景。
第三层收益是防错。很多人以为 VBA 只会加速,其实它还负责「不让别人改坏」。数据有效性、工作表保护、限制滚动区域、禁用单元格拖放、双击被保护单元格时不弹提示,这些设置让表格交给别人填的时候稳得多。你不需要写多复杂的逻辑,几行代码就能把一张表从「随便填」变成「只能按规矩填」。
2.4 上手前的两分钟准备:把写代码的入口调出来
不同版本的 Excel 菜单略有差别,但路径基本一致:打开「文件」→「选项」→「自定义功能区」,在右侧主选项卡列表里勾上「开发工具」,确定。这时功能区顶部会多出一个「开发工具」标签,里面最左侧的「Visual Basic」就是代码编辑器入口,快捷键是 Alt+F11。
进去之后你会看到三个区域:左上角是工程资源管理器,列出当前打开的所有工作簿和它们的模块;中间偏右是代码窗口,写代码的地方;下方是立即窗口,用来临时试探一句代码的效果。第一次进去看到一片空白很正常,先在左侧右键点你的工作簿,选「插入」→「模块」,中间就会出现一块可以写字的白色区域。
那在这之前要不要先学语法?我的建议是不要。入门的话建议先跑通一个最小例子,尝到「我改了一个数字,表格真的变了」的甜头,再回头补概念,效率高得多。下一章直接从能跑的代码开始。
3. 第一个能跑的例子:七行代码把 A 列搬到 B 列
3.1 动手前的三件准备
第一件事,把文件另存为启用宏的格式。点「文件」→「另存为」,保存类型里选带「启用宏的工作簿」的那一项,扩展名是 .xlsm。这一步省不得,普通格式存完,你写的代码会全部消失,这个坑后面还会专门讲一次。
第二件事,按上一章的方法把「开发工具」调出来,Alt+F11 进入编辑器,在左侧工程里右键插入一个模块。
第三件事,准备数据。新建一个工作表,在 A 列从上往下随便填十行内容,数字文字都行,第二行开始填就好,第一行留作表头。不用太讲究,这个例子的目的是让你看到代码真的动了表格。
三件事做完,回到编辑器,把下面这段代码粘贴进去。
Sub 第一段代码() Dim i As Long Dim 末行 As Long ' 从 A 列最下面一行往上找,第一个有内容的行号 末行 = Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To 末行 ' 把 A 列第 i 行的内容写到 B 列第 i 行 Cells(i, 2).Value = Cells(i, 1).Value ' 顺便把刚写进去的格加粗 Cells(i, 2).Font.Bold = True Next i MsgBox "处理完了,一共 " & 末行 & " 行" End Sub粘贴完按 F5 运行。如果一切正常,B 列会出现和 A 列一样的内容并且是粗体,最后弹出一个提示框告诉你处理了多少行。如果中途报错,先别慌,把光标停在黄色的出错行上,对照下一节的解释找问题,多半是工作表里没数据或者当前激活的不是你以为的那张表。
3.2 逐行拆解:这七行里藏着的四个基本概念
Sub 第一段代码()和最后的End Sub是一对括号,中间包住的就是一次可执行的动作集合,起个名字是为了以后能在「宏」列表里找到它。名字用中文没问题,但别加空格和标点。Dim i As Long是声明变量:告诉 Excel 待会儿有个叫 i 的整数要用,Long 是整数类型,比默认的 Variant 快也省内存,写循环时养成习惯就好。
Cells(Rows.Count, 1).End(xlUp).Row这一句是整段代码里最值钱的一行,也是这份资源里反复出现的手法。Cells(行, 列)用坐标定位单元格,Rows.Count表示当前工作表的总行数,Cells(Rows.Count, 1)就是 A 列最后一行那个格子。End(xlUp)相当于你手动按 Ctrl+↑,从最底下往上跳到第一个有内容的格子,再取它的.Row拿到行号。为什么要绕这一圈?因为数据行数每个月都在变,写死一个固定行号,下个月就少处理一截。
For i = 1 To 末行到Next i是循环,i 从 1 数到末行,中间两行代码就执行多少遍。Cells(i, 2).Value里的 2 表示 B 列,.Value是格子里实际装的内容,赋值号左边接收、右边提供。最后的MsgBox是弹窗,调试阶段特别有用,因为它能告诉你「循环到底跑了多少圈」,比盯着屏幕数行靠谱。
3.3 加一个条件:让代码只搬该搬的行
只会全盘复制,用处有限。真正的价值在于「按条件挑」。把上面那段改成下面这样,它只处理 A 列里是数字且不为空的行,并把数字统一上浮 10%。
Sub 带条件的搬运() Dim i As Long, 末行 As Long 末行 = Cells(Rows.Count, 1).End(xlUp).Row ' 从第 2 行开始,跳过表头 For i = 2 To 末行 ' 同时满足两个条件:不是空值,而且是数字 If Cells(i, 1).Value <> "" And IsNumeric(Cells(i, 1).Value) Then Cells(i, 2).Value = Cells(i, 1).Value * 1.1 End If Next i End SubIf ... Then ... End If是条件判断,只有括号里那个条件成立,中间那行才会执行。<>是不等于,And表示两个条件都得满足,IsNumeric判断内容是不是数字——不加这个判断,遇到文字单元格做乘法会直接报类型不匹配。i = 2起始是为了跳过表头,这一改,循环的范围就只在数据行里。
跑完之后你会发现 B 列出现了小数。想保留两位,在赋值那句后面补一句Cells(i, 2).NumberFormat = "0.00"就行,格式相关的设置在资源的第 11 组技巧里有一整块,字体、边框、行高列宽都在那儿。
3.4 换成整块操作:Resize 和 Offset 怎么用
逐格循环写起来直观,但数据上万行的时候会明显变慢。这时候换成整块操作,速度差一个量级。
Sub 整块搬运() Dim 末行 As Long 末行 = Cells(Rows.Count, 1).End(xlUp).Row ' 从 A1 开始,向下扩展 末行 行、向右 1 列,得到 A1:A末行 这块区域 Range("A1").Resize(末行, 1).Copy Destination:=Range("B1") Application.CutCopyMode = False End SubResize(行数, 列数)的作用是以某个格子为起点,重新划定一块矩形区域的大小,两个参数分别是高度和宽度。Copy Destination:=表示复制到指定位置,最后那句Application.CutCopyMode = False是清掉复制状态,不然表格上会一直留着那圈虚线,用户以为程序没跑完。
和 Resize 经常一起出现的是Offset(行偏移, 列偏移),它以某个格子为原点平移,比如Range("A1").Offset(1, 0)拿到的是 A2。这两个属性能拼出绝大多数区域定位的写法,比手写Range("A1:C100")灵活得多,因为区域大小可以随数据变化。
如果只是想把数值搬过去、不要格式,别用 Copy,直接赋值更快:Range("B1").Resize(末行, 1).Value = Range("A1").Resize(末行, 1).Value。这一行相当于资源里说的「仅复制数值到另一区域」的直接赋值法,比选择性粘贴干净。
3.5 跑通之后,怎么确认自己真的懂了
判断自己有没有入门,不看能不能背出语法,看能不能改。给你三个小改动,能做到就说明这章过关了:把结果写到 C 列而不是 B 列;在循环里加一句判断,A 列内容超过某个数值时把字体设成红色;把弹窗里的总行数改成「有效行数」。三个改动都只需要动一两个数字或加一行 If,但你要自己想清楚动哪个。
第一次跑代码报错是常态,我见过太多人卡在第一个例子上就放弃了。其实报错的英文提示大多能猜出来,比如「下标越界」基本是工作表名写错或不存在,「要求对象」多半是引用了一个没被选中的东西。把报错的那一行整句选中,按 F8 单步执行,看着表格一格一格变化,比读十页教程都管用。
4. 按三层对象摸清地图:Range、Worksheet、Workbook 的入门顺序
4.1 为什么按对象学,比按语法学快
语法书一般从变量、判断、循环讲起,学完一章做一道练习题,跟你的表格毫无关系,两周就忘光。而这份资源的组织方式是按对象分类:第 1 章全在讲单元格,第 2 章全在讲工作表,第 3 章全在讲工作簿。这种排法对新手友好,因为它跟你的直觉一致——你平时干活就是先看格子,再看标签页,再看文件。
我建议的顺序是从小往大:先把 Range 层练熟,因为九成需求都在这里;Worksheet 层的用处是批量处理多张结构相同的表;Workbook 层的典型场景是「从一堆文件里汇总数据」。倒过来学也不是不行,但一开始就碰文件打开保存,容易在路径和权限上卡住,挫败感强。
下面三节各挑几个最常用、最容易上手的动作,配上能直接跑的最小代码。这些片段在资源里都有对应的技巧编号,跑通之后再去翻原文的完整版,会顺得多。
4.2 Range 层:引用、定位、查找、写入四个动作
引用单元格至少有四条路:Range("A1")写地址,Cells(1, 1)写坐标,Range("A1:C3")写区域,还有[A1]这种快捷写法。日常写循环优先用 Cells,因为行列可以是变量;写一次性操作优先用 Range,因为直观。资源里第 1 组技巧把这几种方式连同 Offset、Resize、Union、UsedRange、CurrentRegion 一并列了,Union 用来把几块不相邻的区域合并操作,UsedRange 返回真正用到的最大范围,CurrentRegion 返回被空行空列包围的那一整块连续区域——后者在做汇总时特别好用,因为它能自动识别数据块边界。
定位的常见需求是「找到某一列的最后一个非空行」,第 3 组技巧专门讲这个,End(xlUp)是主力写法。查找则是 Find 方法的地盘,写法如下。
Sub 查找并标记() Dim 结果 As Range ' 在 A 列里找内容为 "目标" 的格子,只找值、整格匹配 Set 结果 = Range("A:A").Find(What:="目标", LookIn:=xlValues, LookAt:=xlWhole) If Not 结果 Is Nothing Then 结果.Interior.Color = RGB(255, 255, 0) ' 找到就涂黄 结果.Select ' 并跳过去 Else MsgBox "没找到" End If End SubFind返回的是一个单元格对象,找不到时返回 Nothing,所以必须先判断再使用,不判断直接.Select就会报「对象变量或 With 块变量未设置」。参数LookIn:=xlValues表示只看值不看公式,LookAt:=xlWhole是整格匹配,想模糊匹配就改成xlPart。要做「找到第一个之后继续找下一个」,用循环套FindNext,资源里第 5 组技巧给了完整写法。
写入这一块最容易被忽略的是公式和批注。往格子里写公式用Range("C1").Formula = "=A1+B1",注意等号和引号;写完想检查有没有公式,用HasFormula属性,想判断公式有没有算错,用IsError。批注则是AddComment,加之前先用Comment Is Nothing判断原本有没有,不判断就加会直接报错。这些都属于「不知道就查得到、不知道就写不出」的细节,翻资源目录比背下来靠谱。
4.3 Worksheet 层:遍历、增删、隐藏、保护
工作表层最实用的一个套路是遍历所有表做同一件事,比如统一给每张表加表头、统一清空某个区域。
Sub 遍历所有工作表() Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets ' 跳过名字为「汇总」的表,避免把汇总表也处理了 If ws.Name <> "汇总" Then ws.Range("A1").Value = "月份" ws.Range("A1").Font.Bold = True End If Next ws End SubFor Each ... In是专门用来遍历集合的循环,比按索引号Worksheets(i)安全,因为中途删表不会导致编号错乱。ThisWorkbook指的是代码所在的那个文件,比ActiveWorkbook稳,用户切到别的窗口也不会跑错地方。
增删表要注意两件事:新增时用Worksheets.Add,还能指定放在哪张表前后;删除时一定要先关掉确认弹窗,否则每删一张弹一次,还要手动点。
Sub 安全删除表() Dim ws As Worksheet ' 先确认表存在,不存在时直接删除会报错 On Error Resume Next Set ws = Worksheets("临时数据") On Error GoTo 0 If Not ws Is Nothing Then Application.DisplayAlerts = False ' 关掉「是否删除」的确认框 ws.Delete Application.DisplayAlerts = True ' 干完活记得开回来 End If End SubApplication.DisplayAlerts是一个开关,关掉之后 Excel 不再弹各种确认框,删除、覆盖保存都会直接执行。它是把双刃剑,用完必须开回来,否则后续操作出错你连提示都看不到。资源里第 25 组技巧讲添加与删除,第 26 组讲怎么禁止删除指定工作表,第 28 组讲深度隐藏——普通隐藏右键就能取消,深度隐藏得写代码才能恢复,适合放一些不想被误改的参数表。
保护相关的设置也在这层。ws.Protect加密码锁定整张表,ws.Visible = xlSheetVeryHidden藏起来,限制滚动区域则改ScrollArea属性。这几样加在一起,一张交给别人填的表就不容易被改坏。
4.4 Workbook 层:打开、判断、保存
工作簿层的第一个高频需求是判断某个文件是不是已经打开了。直接去 Open 一个已经打开的文件不会报错,但会拿到已经打开的那个实例;而如果只是要读它的数据,用 GetObject 更省事。
Sub 判断工作簿是否已打开() Dim wb As Workbook Dim 已打开 As Boolean For Each wb In Workbooks ' 只比文件名,忽略大小写 If StrComp(wb.Name, "数据源.xlsx", vbTextCompare) = 0 Then 已打开 = True Exit For End If Next wb If 已打开 Then MsgBox "文件已经开着了" Else ' 没打开就按完整路径打开 Set wb = Workbooks.Open(ThisWorkbook.Path & "\数据源.xlsx") End If End SubWorkbooks是一个集合,装着当前所有打开的文件,遍历它比用错误处理去试探更直观。StrComp带vbTextCompare是忽略大小写比较,Windows 上文件名本来就不区分大小写,这样写更稳。ThisWorkbook.Path拿到当前文件所在目录,用它拼路径,文件挪了位置也不会断。
保存这块有个新手常问的问题:怎么关掉「是否保存」的弹窗直接保存?答案是先设ThisWorkbook.Saved = True再 Close,或者用Close SaveChanges:=False明确表示不保存。反过来,想直接另存为一个新文件名,用SaveAs指定路径和格式。资源里第 45 到 48 组技巧把保存、另存副本、把某张工作表单独存成新文件都写全了,做报表分发时很省事。
还有一个挺有意思的技巧:不打开工作簿也能取到里面的数据。资源里给了几种做法,从公式引用、GetObject,到 SQL 连接。新手先掌握 GetObject 就够了,它能在后台读一个文件里的某个区域,不用把文件显示出来。
Sub 后台读取数据() Dim wb As Workbook Dim 值 As Variant ' 打开但不显示窗口 Set wb = GetObject(ThisWorkbook.Path & "\数据源.xlsx") 值 = wb.Worksheets("明细").Range("B2").Value wb.Close False ' 读完就关,不保存 MsgBox "取到的值是:" & 值 End SubGetObject的第一个参数是文件完整路径,返回的是一个工作簿对象,之后就能像操作已打开的文件一样读它的单元格。Close False里的 False 表示不保存,读完不留痕迹。这条路适合做跨文件汇总,注意文件路径要写全,只写文件名它会找不到。
4.5 把这份代码大全当字典用:我的翻法
这份资源有七十多个技巧,按顺序读一遍会累死,也没必要。我的用法是三步:先在目录里按关键词找,比如「删除空行」「合并单元格」「导出图片」;找到后跳到对应技巧,只抄那段能跑的最小代码;抄完立刻在自己的表上跑一遍,跑通了再回看它上面的解释,那时候解释才看得进去。
入门阶段最值得先啃的是第 1 到第 6 组(单元格引用与查找)、第 21 到 23 组(工作表引用与遍历)、第 40 到 42 组(工作簿引用与打开)。这十几组覆盖了日常八成需求,剩下的图形、图表、对话框那几章,等你确实要往表里插图片或做交互界面时再看,不着急。
5. 新手最容易翻车的五个地方:报错、闪屏、代码消失
5.1 代码跑不通的四个坑
坑一:没写工作表名,代码跑在了别的表上。现象是数据被写到了莫名其妙的位置,或者弹出一句「下标越界」。原因是你用了Cells(1,1)这种不带主语的写法,它默认作用于当前激活的那张表,而你在运行前手滑点到了别的标签页。解决办法是养成写全称的习惯:Worksheets("明细").Cells(1,1),或者全程用With Worksheets("明细")包起来,块内的 Cells 就都指这张表。
坑二:大量使用 Select 和 Activate,屏幕乱闪还慢。现象是代码运行时屏幕疯狂跳动,原本几秒的事拖成半分钟,偶尔还报「要求对象」。原因是先选中再操作这种写法,把「对象」和「选中状态」绑在了一起,中间任何一步被打断就全乱。解决办法是直接操作对象,别选中:把Range("A1").Select换成Range("A1").Value = 1,需要复制的用Copy Destination:=指定目标,全程不碰选区。资源里第 2 组技巧讲选定单元格,那是给需要和用户交互的场景准备的,不是让你每句都加 Select。
坑三:循环里直接改单元格,数据一多就卡。现象是几百行还行,上万行时 Excel 直接假死,风扇狂转。原因是每写一个格子,Excel 都要重算一次格式和公式,顺带刷新一次屏幕。解决办法是开头关掉刷新和重算,结尾再开回来。
Sub 提速三件套() Application.ScreenUpdating = False ' 不刷新屏幕 Application.Calculation = xlCalculationManual ' 不自动重算 On Error GoTo 收尾 ' 中途出错也要恢复设置 Dim i As Long For i = 1 To 20000 Cells(i, 2).Value = Cells(i, 1).Value Next i 收尾: Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub这段代码里有个容易被忽略的细节:On Error GoTo 收尾。如果没有它,中途一旦报错,程序就停在半路,屏幕刷新和自动重算都还关着,用户会觉得 Excel 坏了。加了这句,出错也会跳到收尾段把开关恢复。再往上一个层次是把数据先读进数组、算完再一次性写回,那个写法等熟练了再学。
坑四:用 End(xlUp) 找末行,中途遇到空行就断。现象是明明有五百行,代码只处理了一百多行。原因是End(xlUp)学的是 Ctrl+↑,碰到第一个空行就停,它找的是「连续区域的末尾」,不是「整列的最后一个非空」。解决办法看数据形态:如果空行只是零星几处,可以用Cells(Rows.Count, 1).End(xlUp).Row配合UsedRange比较取大值;如果空行很多是常态,就改成从下往上扫一遍,或者干脆用SpecialCells(xlCellTypeLastCell)。这一条属于血泪经验,不知道的话能排查半天。
5.2 环境和习惯上的两个坑
坑五:存成普通格式,代码全没了。现象是第二天打开文件,一切正常,但宏列表里空空如也,功能全消失。原因是存成了 .xlsx 而不是 .xlsm,前者不支持任何代码。解决办法只有一个:从现在开始,凡是带代码的文件,一律另存为启用宏的工作簿。另外从别处发来的带代码文件,Windows 会默认给它加个「来自网络」的锁,打开时顶部出现「宏已被禁用」的黄条,这时候要点「启用内容」,否则代码在,但跑不起来。
坑六:改了表名,代码报「下标越界」。现象是昨天还能跑,今天一动就报错。原因是你手动把工作表标签从「明细」改成了「1月明细」,而代码里还写着旧名字。解决办法是尽量用代码名引用,或者把表名集中写在一处常量里,改的时候只改一个地方。资源里第 29 组技巧讲怎么防止别人改工作表名,第 21 组讲四种引用方式各自的适用场景,翻一翻能省下不少这类返工。
6. 接下来的学习路线:从抄代码走到改代码
6.1 三个阶段,别跳级
入门之后最容易犯的错是贪多,看什么都想学,结果一个月后还在原地。把学习分成三段,每段给自己定一个能验收的小目标,往前走会踏实很多。
| 阶段 | 你要做到的事 | 大概花多久 | 对应的资源内容 |
|---|---|---|---|
| 抄 | 原样复制别人的片段,跑通,知道它改了哪一格 | 一到两周 | 第 1 到 6 组:单元格引用、查找、复制 |
| 改 | 把片段里的列号、条件、表名换成自己的,跑出不一样的结果 | 两周到一个月 | 第 7 到 20 组:格式、有效性、公式、批注、合并 |
| 拼 | 把两三个片段串起来,解决一个完整的小任务 | 一个月以后 | 第 21 到 42 组:工作表与工作簿的批量处理 |
「拼」这一步的典型练习是自己写一个「一键整理月报」的小宏:打开指定的数据文件,复制明细到汇总表,删掉空行和重复行,按某列排序,加边框,另存一份带日期的副本。这个任务会同时用到工作簿、工作表、单元格三层,写完你对整个对象模型的感觉就出来了,比看十篇教程都实在。
6.2 一个具体的小技巧:先写注释,再写代码
给一个我一直在用的习惯。动手前先在模块里把步骤用中文一行行敲成注释,比如「打开数据源」「复制到汇总表」「删空行」「保存副本」,然后再往每条注释下面填代码。这样写出来的东西结构清楚,卡住的时候也知道自己卡在第几步,而不是对着一屏代码发呆。
调试阶段多用两样东西:F8 单步执行,看每一行执行后表格的变化;MsgBox或Debug.Print打印中间变量的值,确认循环圈数和判断结果符合预期。这两样土办法比任何调试工具都直给,尤其是刚开始,你能亲眼看到代码是怎么一格一格动表格的。
还有一个建议:每次跑通一段代码,立刻把它的作用、适用范围和改哪个参数记在一个小本子上,三五行就行。三个月后你会攒下几十条,那才是真正属于你的东西,比任何一份大全都好用——因为它全是按你的活儿写的。
我第一次带一个完全没写过代码的同事做这份练习,他照着抄能跑,改参数就懵,后来才发现问题出在他从没单步执行过,代码在他眼里一直是个黑匣子。从那以后我每次教新人,都强制走一遍 F8 单步,看着表格一格一格变,第二天他自己就能改条件了。希望帮到你。
本文还有配套的精品资源,点击获取