Excel 2010 VBA 入门 036 替换所有的错误值
目录
Range对象的Find方法
参数省略表示法
查找格式
示例:
实现代码
使用Is Nothing判断对象是否初始化
IsError函数
SpeciaICells方法
Find方法的一般形式
CVErr函数
Range对象的Find方法
使用Range对象的Find方法可以实现批量查找符合条件的单元格。Find方法的语法如下:
Rng.Find(What,[After],[Lookln],[lookAt],[SearchOrder],[SearchDirection],MatchCase],[MatchByte],[SearchFormat])
其中,Rng为一个Range对象,表示需要执行查找方法的单元格区域,即指明查找的范围。各参数说明如下。
- 参数What为所要查找的值。
- 参数After为一个Range对象,表示查找的起始单元格。
- 参数Lookln为查找的类型,可以为xIComments(批注)、xIFormulas(公式)或xIValues(值)。
- 参数LookAt为单元格匹配方式,可以为xIWhole(匹配整个单元格)或xIPart(匹配部分)。
- 参数SearchOrder为搜索的顺序,可以为xIByRows(按行查找)或xIByColumns(按列查找)。
- 参数SearchDirection为搜索的方向,可以为xINext(查找下一个)或xIPrevious(查找上一个).
- 参数MatchCase为大/小写匹配方式,True表示区分大小写,False表示不区分。
- 参数MatchByte表示半/全角匹配方式,True表示区分半全角,False表不不区分。
- 参数SearchFormat表示匹配格式,True表示要匹配格式,False表示无须匹配。
Find方法的实质是对应单元格查找的基本操作,使用该方法查找单元格将会更改单元格查找对话框的各种设置。各参数对应的功能如图所示。
参数省略表示法
Range的Find方法有许多参数。在执行该方法时,可以将参数添补完整,只需开启“自动列出成员”选项即可出现参数提示,并可根据粗体的提示逐个输入参数。
当需要省略某些参数时,开发者可以不填写所有的参数,只需在各个参数表达式之间使用逗号分隔,使用以下表达式表示某个参数即可:
参数名称:=参数值
使用该方法则不必遵循各个参数的固定位置。如本例省略了参数After,直接填写Lookln和LookAt,故使用以下表达式:
Find("#N/A",LookIn:=xlValues,LookAt:=xlWhole)
使用此方法需注意以下两点。
- 当直接写入参数值而未标明参数名称时,则参数值为其所在位置的参数的值。
- 必须使用冒号(:)与等号(=)的组合来传递参数值,否则会发生错误。
查找格式
当需要查找格式时,需要将SearchFormat参数设置为True,并且在执行Find方法之前需要对Application. Format对象进行格式的设置。该对象是一个只包含单元格格式设置的特殊对象,除了没有特殊的属性(如Value等)外,其余的格式属性与单元格的格式属性相同。因而,开发者可以通过录制宏的方式轻松获取格式设置代码。
示例:
在Excel中,比较两张表的不同时经常采用Vlookup函数。如图所示,该表为某公司员工的工资单,现需要比较两个月的工资差异,在使用函数的过程中发生了错误值。经查得知,发生错误值的员工1月尚未入职,除了修改公式外,是否可以使用VBA批量替换这些错误值,使其更改为0 ?
姓名 | 部门 | 1月 | 姓名 | 部门 | 2月 | 查找1月工资 | |
程建华 | 财务部 | 2875 | 程建华 | 财务部 | 2875 | 2875 | |
李国敏 | 财务部 | 3050 | 李国敏 | 财务部 | 3050 | 3050 | |
袁志刚 | 财务部 | 3523 | 袁志刚 | 财务部 | 3523 | 3523 | |
周汉林 | 管理部 | 2890 | 周汉林 | 管理部 | 2890 | 2890 | |
孙玉梅 | 管理部 | 2580 | 骈永富 | 管理部 | 2850 | #N/A | |
陈亚菁 | 管理部 | 3460 | 孙玉梅 | 管理部 | 2580 | 2580 | |
康小芸 | 管理部 | 1800 | 陈亚菁 | 管理部 | 3460 | 3460 | |
刘晨 | 管理部 | 5318 | 康小芸 | 管理部 | 1800 | 1800 | |
齐光 | 管理部 | 5425 | 刘晨 | 管理部 | 5318 | 5318 | |
于健惠 | 管理部 | 4320 | 齐光 | 管理部 | 5425 | 5425 | |
王文群 | 管理部 | 1875 | 于健惠 | 管理部 | 4320 | 4320 | |
曾国安 | 管理部 | 4726 | 王文群 | 管理部 | 1875 | 1875 | |
刘志峰 | 管理部 | 1850 | 曾国安 | 管理部 | 4726 | 4726 | |
刘玉录 | 管理部 | 1385 | 刘志峰 | 管理部 | 1850 | 1850 | |
杨建军 | 人事部 | 2700 | 刘玉录 | 管理部 | 1385 | 1385 | |
曲波 | 人事部 | 3215 | 俞卫广 | 管理部 | 6700 | #N/A | |
林革壮 | 市场部 | 1565 | 杨建军 | 人事部 | 2700 | 2700 | |
李卫卿 | 市场部 | 6213 | 曲波 | 人事部 | 3215 | 3215 | |
孙正发 | 市场部 | 1950 | 林革壮 | 市场部 | 1565 | 1565 | |
毛传阳 | 销售部 | 3500 | 李卫卿 | 市场部 | 6213 | 6213 | |
张元端 | 销售部 | 2465 | 申玲 | 市场部 | 1230 | #N/A | |
朱凌波 | 销售部 | 3420 | 孙正发 | 市场部 | 1950 | 1950 | |
张宏 | 销售部 | 2310 | 毛传阳 | 销售部 | 3500 | 3500 | |
郦锡文 | 销售部 | 1912 | 张元端 | 销售部 | 2465 | 2465 | |
张占斌 | 销售部 | 1800 | 朱凌波 | 销售部 | 3420 | 3420 | |
曹阳 | 销售部 | 2632 | 张宏 | 销售部 | 2310 | 2310 | |
周书敬 | 销售部 | 4200 | 郦锡文 | 销售部 | 1912 | 1912 | |
姚胜 | 销售部 | 5300 | 张占斌 | 销售部 | 1800 | 1800 | |
郭建 | 销售部 | 1571 | 曹阳 | 销售部 | 2632 | 2632 | |
高波 | 销售部 | 6200 | 周书敬 | 销售部 | 4200 | 4200 | |
卢卫 | 总经办 | 3200 | 姚胜 | 销售部 | 5300 | 5300 | |
赵秀池 | 总经办 | 2450 | 郭建 | 销售部 | 1571 | 1571 | |
高波 | 销售部 | 6200 | 6200 | ||||
卢卫 | 总经办 | 3200 | 3200 | ||||
赵秀池 | 总经办 | 2450 | 2450 |
实现代码
Sub 替换错误值()Dim rng As RangeSet rng = Range("H2:H36").Find("#N/A", LookIn:=xlValues, lookat:=xlWhole)'当单元格被找到时执行循环Do While Not rng Is Nothingrng.Value = 0Set rng = Range("H2:H26").FindNext(rng)Loop
End Sub
使用Is Nothing判断对象是否初始化
当对象变量未进行初始化(即没有指向任何对象)时,该变量的值是Nothing。当需要判断某个变量的值是否是Nothing时,可以使用以下表达式:
对象 Is Nothing
该表达式将返回一个逻辑值,当对象为Nothing时,返回True,反之返回False。本例使用了该方法来判断Rng对象是否被初始化,即Find方法是否有返回值。通常在涉及单元格查找时,会使用该判断来规避某些错误。
IsError函数
本例使用的是通过单元格遍历的方式,逐个判断单元格的值是否为错误值,若为错误值,则更改为0。当单元格的值错误时,其Value属性是不可直接读取的。但可以通过IsError函数来判断其是否为错误值,其语法如下:
IsError(Expression)
其中,Expression为一个表达式,本例中为单元格的Value属性。该函数的结果返回一个逻辑值,当表达式为错误值时,返回True,反之则返回False。
SpeciaICells方法
单元格对象的SpeciaICells方法用来查找特殊的单元格,其语法为:
Rng.SpecialCells(Type, [Value])
其中,Rng表示Range对象,即查找区域。Type表示定位的单元格类型,可以为表1中的任一常量。当Type参数指定为xICeIITypeConstants或xICeIITypeFormulas时,可使用Value参数以进一步设置所要查找的单元格,见表2。
表1 SpecialCells方法的Type参数
常 量 |
值 |
说 明 |
xlCellTypeComments |
-4144 |
含有注释的单元格 |
xlCelITypeConstants |
2 |
含有常量的单元格 |
xlCellTypeFormulas |
-4123 |
含有公式的单元格 |
xlCellTypeBlanks |
4 |
空单元格 |
xlCellTypeLastCell |
11 |
所用区域中的最后一个单元格 |
xlCellTypeAllFormatConditions |
-4172 |
合有条件格式的单元格 |
xlCellTypeAllVaLidation |
-4174 |
含有验证条件的单元格 |
xlCellTypeSameFormatConditious |
-4173 |
含有相同条件格式的单元格 |
xlCellTypeSameValidation |
-4175 |
验证条件相同的单元格 |
表2 SpecialCells方法的Value参数
常量 |
值 |
说明 |
xlErrors |
16 |
错误值 |
xlLogical |
4 |
逻辑值 |
xlNumbers |
1 |
数字 |
xlTextValues |
2 |
文本 |
实质上,SpeciaICells方法执行的是单元格定位的基本操作中的一部分,其参数的设置 与该基本操作的对应关系见图。
当指定区域内包含有所要查找的特殊单元格时,SpeciaICells方法返回一个Range对象,但当未找到时,则该方法会发生错误。为避免错误,本例使用OnError语句忽略错误并继续执行。
Find方法的一般形式
当使用Find方法进行查找时,当找到符合条件的单元格后,通常需要记录第一次找到单元格的地址,当再次找到该单元格时即可停止循环,以避免进入死循环。
如需要为所有的错误值单元格更改填充色为红色时,而非更改单元格值时,那么错误单元格将始终被所指定的查找条件所找到。因而使用一个变量FirstAdd记录第一个被找到的单元格的地址,并以此地址作为循环的条件。当该单元格再次被找到时,因为其己被找到过,则退出循环。参考代码如下:
Option ExplicitSub 替换错误值的填充色()Dim Rng As RangeDim FirstAdd As String'查找首个满足条件的单元格Set Rng = Range("H2:H36").Find("#N/A", LookIn:=xlValues, lookat:=xlWhole)'当单元格被找到时If Not Rng Is Nothing Then'记录首次找到的单元格地址FirstAdd = Rng.AddressDo'更改颜色Rng.Interior.Color = RGB(255, 0, 0)'查找下一个Set Rng = Range("H2:H36").FindNext(Rng)'当单元格未被找到是'或找到的单元格的地址为首次找到的单元格地址(即该单元格已经被访问过)'退出循环Loop While Not Rng Is Nothing And Rng.Address <> FirstAddEnd If
End Sub
CVErr函数
若使用了IsError函数来判断单元格的值是否为错误值,当需要获取该错误的详细类型时,则必须使用CVErr函数将错误代码转换为错误值,其语法如下:
CVErr(errornumber)
其中,errornumber为错误代码或错误常量,单元格的错误代码如表所示。
表 单元格公式错误代码
错误常量 |
错误代码 |
单元格错误值 |
xlErrDiv0 |
2007 |
#DIV0! |
xlErrNA |
2042 |
#N/A |
xlErrName |
2029 |
#NAME? |
xlErrNull |
2000 |
#NULL! |
xlErrNum |
2036 |
#NUM! |
xlErrRef |
2023 |
#REF! |
xlErrValue |
2015 |
#VALUE! |
若只需要对“#N/A”错误类型的单元格进行替换,则在循环体内判断时需要增加CVErr函数以进一步判断错误类型,代码如下:
'单元格为错误值
If IsError(Rng.Value) Then'指定错误If Rng.Value=CVErr(xlErrNA) Then'更改为0Rng.Value=0 End If
End If
Excel 2010 VBA 入门 036 替换所有的错误值相关推荐
- Excel 2010 VBA 入门 034 创建图片批注
目录 批注(Comment)对象 批注的添加与删除 FiIIFormat对象 OnError语句 示例: 批注(Comment)对象 Comment对象是单元格的一个属性,表示单元格的批注.Comme ...
- Excel 2010 VBA 入门 001显示开发工具选项卡
目录 VBA简介 宏简介 显示"开发工具"选项卡 VBA简介 Visual Basic for Application (VBA)是Visual Basic的一种宏语言,是依附 ...
- Excel 2010 VBA 入门 095 数据处理之用数组实现分列
示例 如图所示,该表为某系统中导出的数据.由于该数据将原本的四列信息合并至一个单元格中,现希望利用数组对该数据进行分列,将其分为四列. 关键词;关注指数;升降幅度;升降位次 小胸钢托聚拢游泳衣;12; ...
- Excel 2010 VBA 入门 006 设置宏安全性
目录 操作方法 步骤1单击"开发工具"选项卡中的"宏安全性"按钮,如图所示. 步骤2在"信任中心"的"宏设置"选项中 ...
- Excel 2010 VBA 入门 117 具备输入功能的对话框
目录 例 码 VBA.InputBox函数 InputBox函数的返回值 例 在Excel VBA中,经常给用户提供输入信息的功能用以获取信息,并执行相应的操作.例如,在一个对话框供用户输入信息,然后 ...
- Excel 2010 VBA 入门 048 批量替换文本中的指定字符(replayce函数和方法)
目录 示例: 实现代码 Replace函数 单元格对象的Replace方法 使用Replace方法实现代码 示例: 如图所示,该表为某公司商品编码.由于商品目录升级,现商品编码中以"GXGY ...
- Excel 2010 VBA 入门 139 创建工作簿级的自定义选项卡
目录 题 码 Excel工作簿的实质 XML简介 customUI.xml 常用的功能区控件及通用属性 tabs控件和tab控件 group控件 命令控件 内置控件的ID customUI.xml中控 ...
- Excel 2010 VBA 入门 098 导入Access数据库的数据
示例 Access是微软Office组件的数据库软件,使用它可以进行简单的数据库软件的开发.但Access的图表功能和数据分析功能不如Excel强大,常用的做法可以将Access中的数据导入 Exce ...
- Excel 2010 VBA 入门 039 按条件隐藏数据行
目录 示例: 实现代码1 行和列的隐藏 实例代码2 单元格对象的AutoFilter(自动筛选)方法 实现代码3 单元格对象的AdvancedFilter(高级筛选)方法 示例: 在E ...
最新文章
- Python中的元编程:一个关于修饰器和元类的简单教程
- 互联网公司「敏捷开发」,打造高效执行能力
- ipad2“新瓶装老酒” 苹果创新乏力?
- poj 1948(搜索+剪枝)
- EntityFramework6.X 之 Fulent
- Rust 中的继承与代码复用
- SQL的连接查询——内连接、左连接、右连接、自连接(重要)
- 简单SNIFFER 应用驱动安装及使用
- 【有利可图网】PS实战教程55:打破次元壁,将照片从三次元跨越到二次元
- AI微信小程序源码下载人脸照片AI转换动漫照片全新源码安装简单无需服务器域名
- 网站实现扫描二维码关注微信公众号,实现自动登陆
- 台币 日元 没有小数位问题_SAP刘梦_新浪博客
- 3D软件中怎么绘制杯子?
- 括号匹配,实现简单计算器(加减乘除,小括号)
- Excel技巧--数据不能按照1-100来排列
- 清理服务器多余的图片(文件、数据)
- 下面哪个python库不能用于提取网页信息_利用python的webscraping库采集抓取爱帮网电话号码...
- 披着微电影外衣的广告 在扼杀微电影产业
- Linux下cp命令
- 大咖说*图书分享-Node布道师狼叔|三卷书详解Node.js