ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论]谈谈关于错误捕捉的用法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-11-16 11:49 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:数据类型和基本语句

VBA调试过程中,如何处理出现的系统错误提示往往是很头痛的事情。但是如果了解到错误产生的根源,错误捕捉反而成了我们编程时一个有力的工具。下面有几个例子可供大家参考,希望大家能把自己所知道的错误捕捉的技巧拿来一起分享。

范例1:判断工作簿内是否存在指定工作表

Public Function SheetExists(ByVal Sheetname As String, Optional ByVal wb As Workbook) As Boolean If IsMissing(wb) then set wb=ThisWorkbook On Error GoTo ErrHandler '出现错误的时候跳到ErrHandler的标签 Dim Result As Boolean, s As String Result = False s = wb.Sheets(Sheetname).Index '如果工作表不存在的话,会发生错误,跳到ErrHandler Result = True ErrHandler: SheetExists = Result End Function

范例2:判断工作簿内Sheet的类别

Public Function SheetType(ByVal wb As Workbook, ByVal wsName As String) As String

Dim intType As Integer, Temp With wb.Sheets(wsName) On Error GoTo D intType = .Type 'DialogSheet无Type属性,错误时跳至标签D If intType = -4167 Then SheetType = "Worksheet": Exit Function 'Worksheet的Type值为-4167 On Error GoTo C If intType = 3 Then Temp = .Cells(1, 1): SheetType = "MacroSheet": Exit Function 'MarcroSheet通ChartSheet的Type值都是3,这里利用能否应用表内单元格[A1]来判断 End With C: SheetType = "ChartSheet": Exit Function D: SheetType = "DialogSheet" End Function

范例3:统计一个数列里非重复元素的个数或返回一个非重复元素的数组,并可对对应项数据进行求和运算

Function UniqueItems(ByVal rngIndex As Range, Optional ByVal rngValue As Range, Optional ByVal Counter As Boolean) As Variant 'rngIndex为要索引的数列,rngValue为需求和的数列,Counter用来判断是否返回非重复项个数还是数组 Dim Coll, T, s Dim arrIndex, arrValue, myArr, Target(), Amt() Dim i%, x%, j% On Error GoTo 0 Set Coll = CreateObject("scripting.dictionary") '生成一个字典 arrIndex = rngIndex arrValue = rngValue ReDim Target(1 To UBound(arrIndex), 1 To UBound(arrValue, 2) + 1) 'Target数组的第一列为非重复元素的集合,之后的列用来储存rngValue里对应项的合计数 i = 1 Err.Clear '清除错误 For x = 1 To UBound(arrIndex, 1) On Error Resume Next '保证错误不影响程序继续执行 Coll.Add arrIndex(x, 1), i '在字典中添加元素 If Err.Number = 457 Then '如果发生编号457的错误时,表明关键元素已添加在字典中了,进行对应数值合计 s = Coll(arrIndex(x, 1)) s = CLng(s) For j = 1 To UBound(arrValue, 2) If Target(s, j + 1) <> "#Error" Then Target(s, j + 1) = IIf(IsNumeric(arrValue(x, j)), arrValue(x, j), "#Error") + Target(s, j + 1) '如果rngValue中存在文本,则返回#Error End If Next j Else '如未发生错误,表明该关键元素未在字典里发现重复项,则对其Value进行赋值 Target(i, 1) = arrIndex(x, 1) For j = 1 To UBound(arrValue, 2) Target(i, j + 1) = IIf(IsNumeric(arrValue(x, j)), arrValue(x, j), "#Error") Next j i = i + 1 End If Err.Clear '清除错误 On Error GoTo 0 '清除on error resume next设置 Next x If Counter Then UniqueItems = i - 1 Else UniqueItems = Target End Function

范例4:Excel帮助提供的用来捕捉错误的程序

Sub ErrPrompt()

Dim Msg ' 如果有错误发生,就构成一个错误信息 On Error Resume Next ' 改变错误处理的方式。 Err.Clear Err.Raise 6 ' 生成一个溢出(Overflow)的错误。 ' 检查错误代号,显示相关错误信息。 If Err.Number <> 0 Then Msg = "Error # " & Str(Err.Number) & " was generated by " _ & Err.Source & Chr(13) & Err.Description MsgBox Msg, , "Error", Err.Helpfile, Err.HelpContext End If End Sub

综合来看,对错误发生时的控制,首先要确定错误发生的可能性,然后利用on error语句来控制发生错误后的处理,只要处理得当,系统错误就能为我所用。

TA的精华主题

TA的得分主题

发表于 2005-11-16 11:59 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2005-11-16 12:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
吆!真是好东西!收下!谢谢!

TA的精华主题

TA的得分主题

发表于 2005-11-16 12:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2005-11-16 13:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2005-11-16 14:17 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-11-16 14:43 | 显示全部楼层
谢谢佛山兄。Button的文章才是经典的概而全.

TA的精华主题

TA的得分主题

发表于 2009-4-10 18:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jingdian之作

TA的精华主题

TA的得分主题

发表于 2012-3-24 21:48 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-3 23:41 , Processed in 0.052726 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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