从本篇开始,让我们进入报错篇!我将会分析各种报错码并提供排查方式,以供各位自查。
本篇要讲的第一个错误,是一个最常见的报错之一——1004错误:应用程序定义或对象定义错误。

排查
这种报错出现后,点击调试,程序会在错误语句处标黄,我们的排查工作就是分析这一句代码。这个报错的原因一般有两个,一个是参数设置错误,另一个则是对象指代不明确。
参数设置错误
表格处理中最常见的是单元格的参数出错,比如Cells(a,b)中的参数,包括但不限于:
参数设置成非数字,比如:
Cells(1,”2”) ‘参数不是数字类型
参数为0,、负数或超过Excel行列数,如
Cells(0,1) ‘参数0
Cells(-2,1) ‘参数负数
Cells(1000000000,0) ‘参数超过行列限制
以上是几个可能出现的错误例子。但是实际代码中的错误往往是隐藏的,比如这一段:

看出问题了吗?
看上去行的参数i的值是1到10,全是正常参数,列的值是1,赋值也都正常,那问题在哪呢?
事实上错误都是很意想不到的。注意Cells的列参数,那不是1,而是l……
这样凭空多出变量并不会让系统报错,但空值带入到了参数中,就引发了错误。所以请认真核对参数名!
对象指代不明
有的代码在模块中运行没有问题,但是在Excel对象里的Sheet的代码框里运行会出现这个错误,这一般是因为代码里有单元格指代不明,没有指明针对哪一个工作表的单元格操作,如:
Dim ws As Worksheet
Set ws = Workbooks.Open("D:\vba\a.xlsx").Sheets(1)
Cells(1, 1).Select
如果这个代码在模块中运行,会先打开工作簿a.xlsx,再选中第一个工作表的A1。但是如果是在Excel对象里的Sheet里写,则会出现此报错,这是因为我们在Excel对象的Sheet里写代码时,如果不指明单元格所属的工作表,则会默认为Sheet自身的单元格。如果我们在Sheet1里写上述代码并执行,那么我们在打开新的工作簿时,ThisWorkbook已经不是激活状态,再调用Cells(1, 1).Select这种操作,系统仍会选中自身的Sheet1的A1,这时就会发生此错误,因为Select方法只适用于目前激活的单元格。
而修改方式就很简单了,那就是把对象引用写明确,比如这里的例子就可以把Cells(1, 1).Select改为ws. Cells(1, 1).Select。