ET疑难千寻千解丛书之EXCEL2010编程与实践 罗刚君 章兰新 黄朝阳 编著
疑难8
防错语句在程序或者函数中应用有哪些优势 运行代码时出现错误绝非程序员喜闻乐见之事。然而在特殊情况下,正如蛇的毒液也有它的良性作用一样,编程时也会有意地利用代码错误来工作。那么如何在编辑过程中体现防错语句的优势呢? è解决方案 本例通过一个SUB过程和一个Function过程展示如何利用错误让程序更完善。有意地制造错误,并根据错误来判断工作表是否存在及单元格是否存在数据有效性设置。 í操作方法 步骤1
以指定日期为基数,创建一个月的工作表,每个工作表按每天的日期命名,代码如下:
- Sub 按月创建新表() '创建一个月的工作表
- Dim Date1 As Date '声明一个日期变量
- Date1 = #1/15/2009# '指定基数
- '从基数日期开始,到下月同日的前一天
- For i = Date1 * 1 To DateAdd("m", 1, Date1) * 1 - 1
- Sheets.Add after:=Sheets(Sheets.Count) '创建一个新表,放到末尾
- ActiveSheet.Name = Format(i, "mm月dd日") '命名为日期
- Next
- End Sub
复制代码
步骤2 以上程序基本可以实现需要的功能,然而程序并不完善,如果工作簿中有某个工作表与该时间段的日期同名,那么程序会出错并中断执行。为了提升程序兼容性,应该判断是否存在同名工作表,如果没有就新建工作表并命名,否则忽略该日期。优化后的代码如下:
- Sub 按月创建新表2() '创建一个月的工作表
- Dim Date1 As Date '声明一个日期变量
- Date1 = #1/15/2009# '指定基数
- On Error Resume Next '错误时继续执行下一句
- '从基数日期开始,到下月同日的前一天
- For i = Date1 * 1 To DateAdd("m", 1, Date1) * 1 - 1
- Debug.Print Sheets(Format(i, "mm月dd日")).Name '输出工作表名
- '如果无错误(表示存在名为Format(i, "mm月dd日")的工作表),则执行line后面的语句
- If Err = 0 Then GoTo line
- Sheets.Add after:=Sheets(Sheets.Count) '创建一个新表,放到末尾
- ActiveSheet.Name = Format(i, "mm月dd日") '命名为日期
- line: '指定一个标签,在指定条件时可以跳转至此处
- Next
- End Sub
复制代码
步骤3 在自定义函数中,错误同样有利用价值。例如判断单元格是否设置了数据有效性,没有直接的函数或者属性来判断,例如,HasFormula可以一步直接判断单元格是否有公式。本例以开发一个判断单元格是否存在有效性设置来演示防错的应用,代码如下:
- '定义一个函数,判断单元格是否有数据有效性设置,结果为True或者False
- Function IsValidation(rng As Range) As Boolean
- On Error Resume Next '错误时继续执行
- Dim Str As String
- '提取单元格的有效性公式,如果参数为区域则取左上角单元格
- Str = rng(1).Validation.Formula1
- IsValidation = (Err.Number = 0) '公式结果由是否产生错误来决定
- End Function
复制代码
步骤4 对单元格A1设置任意数据有效性,并在B1输入公式“=IsValidation(A1)”,那么公式的结果将为“TRUE”,表示有数据有效性设置,如图:
而下图所示的新工作表则是执行过程“按月创建新表”的结果,创建了数量等于一个月天数的新工作表,且以日期命名。
============================= 以上摘自《EXCEL2010编程与实践》 |