ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4118|回复: 15

求助,on error resume next 有无必要?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-12-16 12:31 | 显示全部楼层 |阅读模式
在本书第191页,即4.7.2中练习中的on error resume next有无存在的必要?
原文:
Sub shttest_2()
    On Error Resume Next
    If Worksheets("一年级") Is Nothing Then
        Worksheets.Add(before:=Worksheets(1)).Name = "一年级"
    Else
        Worksheets("一年级").Move before:=Worksheets(1)
    End If
End Sub

TA的精华主题

TA的得分主题

发表于 2013-12-16 12:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主可以自己注销掉试试啊, 当然有必要了,没必要放那里做什么

TA的精华主题

TA的得分主题

发表于 2013-12-16 12:58 | 显示全部楼层
当新建一个工作薄里没有一年级那张工作表时,没有那句的话会出错,运行不下去。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-16 13:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
dajiahaoxinku12 发表于 2013-12-16 12:57
楼主可以自己注销掉试试啊, 当然有必要了,没必要放那里做什么

我试了把on error resume next这句删了,然后运行就报错,出现运行错误“9”,下标越界,为什么回出现这种错误呢?

TA的精华主题

TA的得分主题

发表于 2013-12-19 22:56 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-20 15:25 | 显示全部楼层
为什么没有工作表“一年级”就会出错?

TA的精华主题

TA的得分主题

发表于 2013-12-21 13:36 | 显示全部楼层
翻滚吧炒鸡蛋 发表于 2013-12-20 15:25
为什么没有工作表“一年级”就会出错?

If Worksheets("一年级") Is Nothing Then
你这句判断完全没有起到任何作用。因为当你写 Worksheets("一年级") 的时候系统就自动去找名称叫"一年级"
的工作表,如果没有直接报错,根本就等不到你判断是否是Nothing 然后处理。这点深入的说是涉及到VBA 的对象引用的深层问题,这里就不进行讨论了。总之记住上面的结论就可以了。

那么如何使用on error resume next 呢?
on error resume next 是忽略你的运行时错误直接执行错误产生的下一条语句
因此你的代码应该修改如下:
  1. Sub shttest_2()
  2.     On Error Resume Next
  3.    
  4.     Worksheets.Add(before:=Worksheets(1)).Name = "一年级"
  5.     Worksheets("一年级").Move before:=Worksheets(1)
  6.    
  7. End Sub
复制代码
不管有没有就直接加一个"一年级"的工作表,如果之前已经有了,很明显就不会执行产生错误的语句并且报错了,但是由于前面有那个on error resume next 因此就忽略了这个错误和错误语句直接执行下一句,将"一年级"工作表移到所有工作表的最前面。这是巧用错误处理语句on error resume next 的一个例子,代码很精简。

那么是否有不使用on error resume next 这种错误捕获语句来常规解决这个问题呢,是有的。需要先把你的所有工作表名读出来进行判断,随手写一段小程序试举一例:
  1. Sub shttest_3()
  2.     Dim hassht As Boolean
  3.     Dim i As Integer
  4.    
  5.     For i = 1 To Worksheets.Count
  6.         If Worksheets(i).Name = "一年级" Then
  7.             hassht = True
  8.             Exit For
  9.         End If
  10.    Next
  11.   
  12.    If hassht Then
  13.       Worksheets.Add(before:=Worksheets(1)).Name = "一年级"
  14.    Else
  15.         Worksheets("一年级").Move before:=Worksheets(1)
  16.    End If
  17.    
  18. End Sub
复制代码
这里用一个布尔值hassht 来判断是否有这个表,在声明之后,该变量自动被赋予“假”就是False,这是VB 的规则。然后对该工作薄所有工作表进行循环读出每个工作表的名称,当发现有叫"一年级"的表的时候,即刻退出循环并且赋给hassht 变量值True。然后就是和在顶楼程序相同的思路了,判断真假分别操作。
这个程序是随手写的,可能不是很优化,但是思路是这样,对比一下上面的巧用错误处理语句的方法,就可以发现在这里使用on error resume next 是非常便捷,使代码的编写量缩减了很多。

但是要注意:个人意见on error resume next 需要你的逻辑非常清楚的情况下使用,误用或乱用可能导致不可收拾的后果。


TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-22 13:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hehex 发表于 2013-12-21 13:36
If Worksheets("一年级") Is Nothing Then
你这句判断完全没有起到任何作用。因为当你写 Worksheets("一 ...

3Q,写得很详细,一看就理解了,但是把最后那个程序代码复制去运行的时候出错了,提示:运行错误‘9’,下标越界,调试停留在Worksheets("一年级").Move before:=Worksheets(1)这行,我看了也不知道原因到底出在哪里?

TA的精华主题

TA的得分主题

发表于 2013-12-22 14:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
翻滚吧炒鸡蛋 发表于 2013-12-22 13:52
3Q,写得很详细,一看就理解了,但是把最后那个程序代码复制去运行的时候出错了,提示:运行错误‘9’,下 ...

随手写的程序没有调试就是容易出错。
问题出在那个逻辑值判断上:
正确的语句是在上面12行用 If Not hassht Then  取代原来的语句

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-22 21:14 | 显示全部楼层
hehex 发表于 2013-12-22 14:15
随手写的程序没有调试就是容易出错。
问题出在那个逻辑值判断上:
正确的语句是在上面12行用 If Not ha ...

If Not hassht Then 这句如何理解,直接就是hassht的反值?NOT也可以套用在其他语句上吗?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 09:42 , Processed in 0.031784 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表