Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5445|回复: 13

[VBA] 008-防错语句的优势-疑难千寻千解丛书(VBA)

[复制链接]
发表于 2011-1-13 12:17 | 显示全部楼层 |阅读模式
ET疑难千寻千解丛书之EXCEL2010编程与实践
罗刚君 章兰新 黄朝阳 编著

疑难8
防错语句在程序或者函数中应用有哪些优势
运行代码时出现错误绝非程序员喜闻乐见之事。然而在特殊情况下,正如蛇的毒液也有它的良性作用一样,编程时也会有意地利用代码错误来工作。那么如何在编辑过程中体现防错语句的优势呢?
è解决方案
本例通过一个SUB过程和一个Function过程展示如何利用错误让程序更完善。有意地制造错误,并根据错误来判断工作表是否存在及单元格是否存在数据有效性设置。
í操作方法
步骤1
以指定日期为基数,创建一个月的工作表,每个工作表按每天的日期命名,代码如下:

  1. Sub 按月创建新表()   '创建一个月的工作表
  2.   Dim Date1 As Date   '声明一个日期变量
  3.   Date1 = #1/15/2009# '指定基数
  4. '从基数日期开始,到下月同日的前一天
  5.   For i = Date1 * 1 To DateAdd("m", 1, Date1) * 1 - 1
  6.     Sheets.Add after:=Sheets(Sheets.Count)    '创建一个新表,放到末尾
  7.     ActiveSheet.Name = Format(i, "mm月dd日")  '命名为日期
  8.   Next
  9. End Sub
复制代码

步骤2       以上程序基本可以实现需要的功能,然而程序并不完善,如果工作簿中有某个工作表与该时间段的日期同名,那么程序会出错并中断执行。为了提升程序兼容性,应该判断是否存在同名工作表,如果没有就新建工作表并命名,否则忽略该日期。优化后的代码如下:

  1. Sub 按月创建新表2()    '创建一个月的工作表
  2.   Dim Date1 As Date      '声明一个日期变量
  3.   Date1 = #1/15/2009#   '指定基数
  4.   On Error Resume Next  '错误时继续执行下一句
  5.   '从基数日期开始,到下月同日的前一天
  6.   For i = Date1 * 1 To DateAdd("m", 1, Date1) * 1 - 1
  7.     Debug.Print Sheets(Format(i, "mm月dd日")).Name '输出工作表名
  8.     '如果无错误(表示存在名为Format(i, "mm月dd日")的工作表),则执行line后面的语句
  9.     If Err = 0 Then GoTo line
  10.     Sheets.Add after:=Sheets(Sheets.Count)   '创建一个新表,放到末尾
  11.     ActiveSheet.Name = Format(i, "mm月dd日")     '命名为日期
  12.     line: '指定一个标签,在指定条件时可以跳转至此处
  13.   Next
  14. End Sub
复制代码

步骤3       在自定义函数中,错误同样有利用价值。例如判断单元格是否设置了数据有效性,没有直接的函数或者属性来判断,例如,HasFormula可以一步直接判断单元格是否有公式。本例以开发一个判断单元格是否存在有效性设置来演示防错的应用,代码如下:

  1. '定义一个函数,判断单元格是否有数据有效性设置,结果为True或者False
  2. Function IsValidation(rng As Range) As Boolean
  3.   On Error Resume Next  '错误时继续执行
  4.   Dim Str As String
  5.   '提取单元格的有效性公式,如果参数为区域则取左上角单元格
  6.   Str = rng(1).Validation.Formula1
  7.   IsValidation = (Err.Number = 0)  '公式结果由是否产生错误来决定
  8. End Function
复制代码

步骤4       对单元格A1设置任意数据有效性,并在B1输入公式“=IsValidation(A1)”,那么公式的结果将为“TRUE”,表示有数据有效性设置,如图:

而下图所示的新工作表则是执行过程“按月创建新表”的结果,创建了数量等于一个月天数的新工作表,且以日期命名。


=============================
上摘自《EXCEL2010编程与实践》

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2011-1-13 12:19 | 显示全部楼层
本书的作者真好啊,把自己写代码过程中的思路都一一展现出来了{:06:}
回复

使用道具 举报

发表于 2011-1-13 12:20 | 显示全部楼层
回复

使用道具 举报

发表于 2011-1-13 13:25 | 显示全部楼层
听说小妖就是其中作者                          
回复

使用道具 举报

 楼主| 发表于 2011-1-13 14:29 | 显示全部楼层
小槑 发表于 2011-1-13 13:25
听说小妖就是其中作者

谣言…………
回复

使用道具 举报

发表于 2011-1-13 15:41 | 显示全部楼层
向小妖老师学习
回复

使用道具 举报

发表于 2011-1-13 15:42 | 显示全部楼层
向小妖老师学习{:011:}
回复

使用道具 举报

发表于 2011-1-13 15:43 | 显示全部楼层
学习来的,密密麻麻的
回复

使用道具 举报

发表于 2011-1-13 17:35 | 显示全部楼层
谢谢小妖老师
回复

使用道具 举报

发表于 2011-1-13 17:56 | 显示全部楼层
好强大,呵呵{:091:}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-7 09:35 , Processed in 0.264465 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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