excel学习库

excel表格_excel函数公式大全_execl从入门到精通

「VBA」16.报错篇:应用程序定义或对象定义错误

从本篇开始,让我们进入报错篇!我将会分析各种报错码并提供排查方式,以供各位自查。

本篇要讲的第一个错误,是一个最常见的报错之一——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。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
      友情链接