ARTICLE · 1342646
Excel VBA常见报错怎么解决
写 VBA 最让人头疼的不是不会写,而是弹出一个看不懂的错误框。其实 Excel VBA 常见报错翻来覆去就那么几种:下标越界、类型不匹配、对象变量未设置、未找到方法或数据成员。看懂错误编号和那句英文提示,八成问题都能自己定位。下面按编号逐条给出原因和改法,这些都是最常见的 VBA 报错场景。
先学会看错误框
点“调试”之后,编辑器会把出错的那一行标成黄色,这就是问题所在行。错误框里的编号和英文提示是两个关键信息:编号是标准错误码,英文提示说明错在哪一类。记住几个高频编号,排查速度会快很多。
错误 9:下标越界
出现这句话,通常是访问了不存在的东西。三种典型情况:
工作表名写错,例如实际叫“1月”,代码却写 Worksheets("一月")。数组下标超出范围,声明了 Dim arr(1 To 5)却去读arr(6)。集合索引越界,例如代码里写了 Worksheets(5),而工作簿里并没有第 5 张表,或引用了已被删除的工作表。
对策:工作表名尽量用变量,或先遍历判断是否存在;数组用 LBound 和 UBound 取边界;循环的末行先用 End(xlUp).Row 算出来再循环。
错误 13:类型不匹配
把文本塞进了数字变量,或者把一整块区域赋给单个值。比如 A1 里写着“合计”,代码却执行 n = Cells(1, 1).Value * 2,就会报 13。改法是先判断 If IsNumeric(Cells(1, 1).Value) Then 再运算,或者把变量声明成 Variant。这类问题最常见的原因是表格里混着手工录入的说明文字。
错误 91:对象变量或 With 块变量未设置
意思是“这个变量还是空的,你却让它干活”。最常见的是忘了 Set:只写 Dim ws As Worksheet 就直接 ws.Range("A1").Value = 1,正确写法必须补一句 Set ws = Worksheets("汇总")。查找函数也可能返回空对象,例如 Set r = Range("A:A").Find("张三"),找不到时 r 就是 Nothing,后面一用就报 91,所以要先写 If Not r Is Nothing Then 判断。
错误 1004 与 438 等其他高频报错
ws.Unprotect,核对区域地址,另存到可写目录 | ||
Option Explicit,但有变量没声明 | ||
If x <> 0 Then 判断 |
通用排查 4 步法
这套流程适用于绝大多数 VBA 报错,第一步点“调试”,看黄色高亮的那一行,先怀疑这一行里的对象和方法。 按 F8 单步执行,鼠标悬停在变量上看它当前是不是空、是不是预期值。 在可疑处加 Debug.Print 变量名,在“视图—立即窗口”里看输出结果。临时加 On Error Resume Next可以跳过非致命错误,但正式版本要删掉,或改成明确的错误处理,否则问题会被藏起来。
常见问题
- 提示“宏已被禁用”怎么办?
这是安全设置问题,不是代码问题。点顶部“启用内容”,或到信任中心把文件所在目录加入受信任位置。 - 为什么别人电脑上不报错?
版本和区域设置差异会让个别方法表现不同,涉及日期、数字格式时写明 Format,不确定的地方以你本机版本为准。 - 怎么从根本上少报错?
模块首行写 Option Explicit、变量统一 Dim 声明、循环前先算末行,这三条能挡掉大半 Excel VBA 常见报错。















































































