VBA常用命令解析之001——On Error(将错就错)

谁都希望自己的程序能一顺百顺,但是错误却一直是我们心中的痛。总是时不时地跳出来影响我们的情绪。虽然跳出来的错误提示会中断我们程序的运行,但是它 就象我们的痛感觉神经一样,是一种保护。可以避免得到不正确的结果,甚至灾难性的后果发生。我们可以通过进一步的程序设计和改进来避免错误中断我们的程 序。
  在日常生活中,我们知道手术前最重要的一项工作是麻醉止痛,在VBA 程序中也有麻醉止痛剂,它就是On Error Resume Next,使用这条语句后就不会有错误跳出来中断程序的运行了。但是就象生物失去痛觉一样是很危险的,一但程序一直处于麻醉状态后果也是不可预料的。可见On Error Resume Next并不是一剂万能药。滥用会错上加错还可能付出惨重的代价。如果能很好的利用这一语句,不仅可以避免错误,还会达到意想不到效果。
  常见的错误一般有两类:代码书写错误和程序运行时的不期错误。第一类错误在程序的调试期间,就可以发现它们并加以解决。最麻烦的是第二类错误。
在处理第二类错误时,我们除了细心设计程序外,还应该认真考虑可能出现的错误。这就是程序的容错性,使程序更加健壮。
  例1:
  在一个Excel 文件 中,删除工作表时,如不事先判断工作表是否存在时就会出错。用常规判断会浪费很多代码。这里唯一能出现的错误就是目标不存(下标越界),而这也是我们想达到目的。不如将错就错。

代码:

Sub Main()
    Call DelTable("临时表")
End Sub
Sub DelTable(sName As String)
    On Error Resume Next
    Worksheet s(sName).Delete
    On Error GoTo 0
End Sub

On Error GoTo 0是什么?它就是On Error Resume Next的解药。是让你的VBA程序苏醒过来。请大家注意使用On Error Resume Next后一定要  养成用On Error GoTo 0解开它的习惯,不然你的程序有错误,也很难发现了。
  例2:
  在一用户窗体中,根据用户输入的工作表名新建一工作表,如不事先判断是否有同名的工作表存在,就可能发生错误。可以用循环语句来实现判断工作表是否存在,也可以利用On Error Resume Next语句进行将错就错地判断。

代码:

Sub main()
    If OkExcelExist("Sheet1", ThisWorkbook) Then
        MsgBox "工作表已经存在!!"
    End If
End Sub
Function OkExcelExist(sSheetName As String, w As Workbook) As Boolean
    Dim ws As Worksheet
    OkExcelExist = True
    On Error Resume Next
    Set ws = w.Worksheets(sSheetName)
    On Error GoTo 0
    If ws Is Nothing Then OkExcelExist = False
    Set ws = Nothing
End Function

在本例中,只有sSheetName表不存在时,才可能发生错误。因此可以加以利用。
  例3:
  如果说以上两例通过其它方式也能很容易的实现判断,那么本例如果用常规的代码将会很难实现。看一下原贴。

引用:

[求助 ]怎么实现输入的数据 代表excel单元 格 引用的合法性检查?
  我需要在vba的textbox中输入数据,然后用这个数据去指定excel的单元格位置 ,如何使输入的数据合法?
  比如我在textbox中输入数据:“a2”,我用range(textbox.text).value=“ok”给excel的a2单元格填写数据 “ok”,如何保证我输入的“a2”一定表示了单元格的位置,而不是其他比如“kkkk”或者“1234”等不能表示单元格的字符?

如果这个问题用常规方法解决,需要编写大量的代码,需要全面地考虑每一个细节。但是仍不能保证正确。那么看一下如何用

代码:


Private Sub CommandButton1_Click()
    Dim str As String
    str = Trim(TextBox1.Text)           '取值
    If Not OkExcel(str) Then            '非法则显示提示信息
        MsgBox str & "不是合法单元格地址", vbOKOnly + vbCritical, "智能Excel"
        Exit Sub
        '退出子过程
    End If
    '下面加其它语句
End Sub
'------------------------------------
Function OkExcel(str As String) As Boolean
    Dim r As Range
    On Error Resume Next
    '发生错误则执行下一条语句
    Set r = Range(str)
    '将r附值,如果发生错误则说明str中的数据,不是一个合法的单元格地址
    OkExcel = (err.Number = 0)
    '如果err.Number不是0,则说明发生过错误
    On Error GoTo 0
    '好习惯,恢复正常,虽然结束本过程后自动 会恢复
End Function

短短的几行就解决了这一很杂问题!
  学会这招吧!
___________________________________________________________________
全文完,
原文URL: http://www.okexcel.com.cn/bbs/viewthread.php?tid=168

[转]VBA常用命令解析之001——On Error(将错就错)相关推荐

  1. 运维之道 | Git分布式版本控制常用命令解析

    Git分布式版本控制常用命令解析 一.创建版本库 版本库(repository)也叫仓库,可以看做一个目录,这个目录里的所以文件都由Git进行管理,每个文件的修改.删除,Git都能跟踪 1.选择一个合 ...

  2. linux常用rm命令详解,Linux常用命令解析- rm命令

    今天小编要跟大家分享的文章是关于Linux常用命令解析- rm命令.rm 是一个命令行工具,用于删除文件和目录.这是每个Linux用户都应该熟悉的基本命令之一. 在本指南中,我们将通过最常见的rm选项 ...

  3. strongswan常用命令解析(二)

    strongswan常用命令解析 0 > ipsec reload //重新加载 ipsec.conf文件 1 > ipsec rereadsecrets //重新加载ipsec.secr ...

  4. 【Windows批处理】常用命令解析

    0.[背景]常用参数: /* Win XP实测,测试方法:echo %userprofile% */%systemdrive% -- C: %windir% -- C:\WINDOWS %userpr ...

  5. Docker从入门到放弃-----Dockerfile常用命令解析与实战(使用docker制作一个开箱即用的consul镜像)

    前言 在上一篇文章docker常用命令的实践与解析中,我们提到了可以使用commit命令来在本地创建镜像,但是commit创建的镜像其实是不够正规的,第三方无法了解镜像创建的过程,所以只能作为我们在本 ...

  6. JVM成神之路(十一) -- JVM常用命令解析

    3.2 常用命令 3.2.1 jps 查看java进程 The jps command lists the instrumented Java HotSpot VMs on the target sy ...

  7. 中兴PTN常用命令解析

    常用命令说明:1.清空原有配置::使用showrunning-config命令检查:清空配置的步骤如下:2.查看各个vlan与端口之:命令:showvlan:用途:查看我们建立的网管vlan通道是否已 ...

  8. Windows 和 Linux 查看和关闭端口常用命令解析

    1. Windows 常用命令 查看系统当前所有的端口使用情况 netstat -ano 查看端口被哪个应用占用 netstat -ano|findstr "端口号" 查看端口信息 ...

  9. Redis 数据库的安装与常用命令解析

    目录 一.安装部署 1. 环境配置 2. 编译安装 3. 设置 Redis 相关配置文件 4. 启动服务 二.Redis 常用工具 1. redis-cli 命令行工具(远程登陆) 2. redis- ...

最新文章

  1. JS 表单和表单元素
  2. 跨还是不跨?这是一个问题
  3. 画出该lti系统的幅频特性响应曲线_模拟电路-放大电路的频率响应
  4. 坚持是一件很难的事情
  5. librtmp协议分析---RTMP_SendPacket函数
  6. 谈计算机知识对学生的作用,浅谈计算机在教学中的作用
  7. psql error: psql: symbol lookup error: psql: undefined symbol: PQconnectdbParams
  8. 将字符串String str= “abc god 中国 java“ 反转每个单词 结果: “cba dog 国中
  9. 使用datax同步cassandra数据
  10. mock如何为空_如何 mock 数据
  11. 离职一个月了,也面了很多公司,但都没有offer,软件测试工作怎么就这么难找?
  12. 190109每日一句
  13. 360浏览器下载|360安全浏览器下载
  14. 《国富论》阅读笔记03
  15. 使Android Home键,Power键等按钮失效
  16. Loadrunner11在Win10上使用踩过的坑
  17. (亲测可用)修改VisualSVN Server地址为ip地址,修改svn服务端地址为ip或者域名地址的方法
  18. 【搬运】电源管理芯片引脚定义
  19. linux 触控板 不识别,linux – 未检测到触控板
  20. Delphi System 提供的编译期函数(Dec,Inc,Odd,Pred,Succ,Ord,Chr,Low,High,Sizeof)

热门文章

  1. 影响全马破三的因素分析
  2. ipad哪个款性价比最高2021 更值得入手
  3. 三维有限元编程教学 从入门到开门 (FORTRAN)
  4. Windows 10上快速尝鲜bash on Ubuntu
  5. Python-赋值语句后面加逗号
  6. 【玩转yolov5】使用TensorRT C++ API搭建yolov5s-v4.0网络结构(1)
  7. C#使用WebService调用海康SDK实现抓图与录像实时下载
  8. 外贸站要做外链工作吗?外贸站外推广工作内容
  9. Python利用OCR提取图片中的文字
  10. vscode使用合集——python