简介:这份资源是面向VBA初学者与Office自动化开发者的编程练习题与近年真题合集,聚焦循环结构、分支选择、变量作用域、字符串处理、图形输出及DAO/ADO数据访问等核心考点,适合备考计算机二级、Access应用开发或希望系统巩固VBA基础的读者。包内共1个doc文件,压缩包约780KB,内容以题目与解析为主,涵盖Do Until、Select Case、ByVal传参、Do...Loop While、多层嵌套循环、Len函数、双精度类型标识等典型题型,并附有逐题知识点说明,便于对照理解易错点。目前已有1810人学习下载,可作为日常刷题与考前查漏补缺的练习材料,帮助读者在短时间内熟悉常见命题形式与解题思路。
1. 从一份“vba编程练习题+近年真题.doc”说起:为什么刷题总在循环里打转
很多人拿到一份名为“vba编程练习题+近年真题.doc”的资料,第一反应是打开、翻页、从第一题开始做。做了三十道题,循环、判断、数组都见过,可一旦要自己写个批量处理表格的宏,还是卡在“怎么把这段逻辑落到模块里”。问题不在题量,在于刷题方式把 VBA 当成了语法考试,而不是一门“操作 Excel 对象模型”的手艺。
这份资料真正的价值,是它同时提供了两类素材:练习题负责把语法点拆碎,近年真题负责把多个语法点拼回一个完整任务。前者练手感,后者练拆解。适合谁?适合已经会录制宏、但写出来的代码一改需求就崩的人;也适合备考计算机二级 VBA、或者要在日常报表里做自动化却总靠复制粘贴的人。下面按“先立住对象模型、再动手复现、最后避坑”的顺序,把这份资料用出复利。
2. 把练习题拆成可复现的最小单元:对象、属性、方法三件套
2.1 为什么先练对象模型,而不是先背语法
VBA 的语法本身很薄,For、If、Do 这些结构一天就能看完。真正让人翻车的是不知道“当前操作的是哪个对象”。Excel 里一切皆对象:Application、Workbook、Worksheet、Range、Cells、ListObject。练习题里常见的“把 A 列大于 60 的单元格标红”,本质是 Range 对象的遍历加 Interior.Color 属性赋值。如果只记语法,换到“把每个工作表的 A 列都标红”就懵了,因为多了一层 Worksheets 集合的遍历。
我一般建议按这个顺序练:先认对象层级,再认属性读写,最后认方法调用。对象层级可以用一句口诀记:Application 下面挂 Workbooks,Workbook 下面挂 Worksheets,Worksheet 下面挂 Range。写代码时永远先问自己“我现在站在哪一层”,再决定要不要用点号继续往下钻。
2.2 用一段最小代码跑通“读数据—判断—写回”
拿练习题里最常见的“成绩判定”举例,不要一上来就写完整宏,先写一个只处理单个单元格的过程,跑通后再套循环。下面这段代码可以直接贴进标准模块运行:
Sub JudgeOneCell() Dim ws As Worksheet Dim score As Double ' 显式指定工作表,避免依赖当前激活表 Set ws = ThisWorkbook.Worksheets("Sheet1") ' 从 B2 读取分数,做类型转换保护 If IsNumeric(ws.Range("B2").Value) Then score = CDbl(ws.Range("B2").Value) Else MsgBox "B2 不是数字,请检查数据" Exit Sub End If ' 判断并写回 C2 If score >= 60 Then ws.Range("C2").Value = "及格" Else ws.Range("C2").Value = "不及格" End If End Sub逻辑说明:Set ws 这一步是整段代码的地基,很多新手直接写 Range("B2"),在宏被按钮触发、当前激活表不是目标表时就会读错数据。IsNumeric 判断是后悔药,防止空单元格或文本把 CDbl 炸掉。参数说明:B2、C2 是硬编码地址,练手可以,真实场景建议改成变量或命名区域。
2.3 把单点过程升级成循环:三个必须调对的参数
单点跑通后,练习题会要求处理整列。这时候循环的边界就是第一个坑。下面这段是升级版:
Sub JudgeColumn() Dim ws As Worksheet Dim lastRow As Long Dim i As Long Set ws = ThisWorkbook.Worksheets("Sheet1") ' 用 End(xlUp) 动态取最后一行,避免写死 1000 lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row For i = 2 To lastRow If IsNumeric(ws.Cells(i, "B").Value) Then If CDbl(ws.Cells(i, "B").Value) >= 60 Then ws.Cells(i, "C").Value = "及格" Else ws.Cells(i, "C").Value = "不及格" End If End If Next i End Sub三个参数必须调对:起始行 i = 2,因为第 1 行通常是表头;lastRow 用 End(xlUp) 从底部往上找,比 UsedRange.Rows.Count 更稳,后者在有格式残留时会虚高;步长默认 1,不要手痒写 Step 2。逻辑说明:Cells(i, "B") 里行号是变量、列号是字母,这种混用在 VBA 里合法,但列号建议统一用数字,方便后面改成循环列。
2.4 真题里的多表汇总:先拆任务再写代码
近年真题常考“多工作表汇总到一张总表”。不要直接开写,先在纸上拆成四步:遍历所有工作表、跳过总表本身、找每张表的数据区、追加到总表下一空行。拆完再落代码,结构会清晰很多。这一步练的是任务分解,不是语法。
3. 近年真题的三种典型题型与对应解法
3.1 条件统计类:用 WorksheetFunction 还是自己循环
真题里“统计某列大于 80 的个数”有两种写法。一种是调用工作表函数:
Sub CountByFunction() Dim ws As Worksheet Dim cnt As Long Set ws = ThisWorkbook.Worksheets("Sheet1") ' 调用工作表函数,写法短但错误处理弱 cnt = Application.WorksheetFunction.CountIf(ws.Range("B2:B100"), ">80") MsgBox "大于80的个数:" & cnt End Sub另一种是自己循环累加。选型理由:WorksheetFunction 写得快,但一旦区域里全是文本或函数本身报错,会直接抛运行时错误,且无法在中途加自定义逻辑。自己循环虽然长,但每一步可控,适合真题里“统计并同时标记”的复合要求。我一般统计类先用 WorksheetFunction 快速验证结果,再用循环实现最终版,两者结果对不上就说明数据里有脏值。
3.2 数据清洗类:去重、去空、格式统一
真题里的清洗题通常三件事:删空行、去重复、统一日期格式。删空行不要用 For Each 加 Delete,因为删除时集合在变,会漏删。正确做法是从下往上循环:
Sub DeleteEmptyRows() Dim ws As Worksheet Dim i As Long Set ws = ThisWorkbook.Worksheets("Sheet1") ' 从下往上删,避免行号错位 For i = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row To 2 Step -1 If Trim(ws.Cells(i, "A").Value) = "" Then ws.Rows(i).Delete End If Next i End Sub参数说明:Step -1 是关键,正序删除会让后面的行上移,循环变量却继续加,导致漏删。Trim 是为了把只含空格的“假空行”也识别出来。去重用 Range.RemoveDuplicates 更快,但它会改动原表,建议先复制到新表再操作,保留后悔药。
3.3 报表生成类:把结果写到新工作簿
真题最后一类常要求“生成独立报表”。核心是 Workbooks.Add 新建工作簿,再用 SaveAs 保存。注意两点:新建后 ActiveWorkbook 就是新簿,但如果你中间切换了窗口,Active 会变,所以要用变量接住。保存路径建议用 ThisWorkbook.Path 拼接,避免写死盘符。
4. 避坑与排查:刷题和写宏时最容易翻车的五件事
4.1 现象:宏运行一半报“下标越界”
原因:Worksheets("Sheet1") 里的表名不存在,或者被重命名过。解决:改用 Worksheets(1) 按索引取,或者先遍历判断表名是否存在再取。
4.2 现象:循环处理几千行,越跑越慢
原因:每写一个单元格就触发一次屏幕刷新和计算。解决:过程开头加 Application.ScreenUpdating = False 和 Application.Calculation = xlCalculationManual,结尾再恢复。这是血泪经验,不加的话一万行能跑几分钟。
4.3 现象:数字被当成文本,统计结果总是 0
原因:单元格里是从系统导出的文本型数字,IsNumeric 返回 False 或比较时按字符串比。解决:用 Val 或 CDbl 转换,或者先对整列做“分列”操作把格式刷成常规。
4.4 现象:改了代码没生效,跑的还是旧逻辑
原因:模块里有同名过程,或者代码写在了 ThisWorkbook 而不是标准模块。解决:在工程资源管理器里逐个模块搜过程名,确保唯一;事件类代码才放 ThisWorkbook。
4.5 现象:真题答案跑出来对,换份数据就错
原因:答案里写死了行数、列号或表名。解决:把可变部分全部提成变量,用 End(xlUp)、Find、UsedRange 动态获取。刷题时要刻意问自己“这行代码换份数据还成立吗”。
5. 把练习题用出复利:一个自检清单和一条私藏技巧
刷完一份“vba编程练习题+近年真题.doc”,怎么判断自己真的会了?我一般用三个自检动作。第一,关掉资料,凭记忆把“多表汇总”从头写一遍,写不出来的地方就是没掌握的节点。第二,把写好的宏故意喂一份脏数据,看它是报错还是给出可读提示,报错说明错误处理没做。第三,把代码里的硬编码地址全部改成动态获取,改完还能跑通,才算脱离“抄答案”阶段。
下面这张表是我自己整理的高频对象与对应操作,刷题时对着查比翻资料快:
| 对象 | 常用属性 | 常用方法 | 典型场景 |
|---|---|---|---|
| Range | Value、Interior.Color | Clear、Copy | 读写单元格、标色 |
| Cells | Value、Row | Delete、Insert | 循环遍历 |
| Worksheet | Name、Visible | Delete、Copy | 多表操作 |
| Workbook | Path、Name | SaveAs、Close | 报表生成 |
| ListObject | ListRows、Range | Sort、AutoFilter | 结构化数据 |
最后分享一个私藏技巧:真题里凡是出现“根据条件筛选后处理”,先别急着写 AutoFilter,用循环加 If 把逻辑跑通,确认结果正确后,再把循环替换成 AutoFilter 提速。这样调试时看得见每一步,优化时又有明确对照。我早年直接上 AutoFilter,条件写错时连错在哪都找不到,后来改成先循环后筛选,翻车次数少了一大半。希望帮到你。
本文还有配套的精品资源,点击获取