Range对象应用大全Find方法应用大全.docx
- 文档编号:25169368
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:43
- 大小:151.34KB
Range对象应用大全Find方法应用大全.docx
《Range对象应用大全Find方法应用大全.docx》由会员分享,可在线阅读,更多相关《Range对象应用大全Find方法应用大全.docx(43页珍藏版)》请在冰豆网上搜索。
Range对象应用大全Find方法应用大全
Range对象应用大全(4)—Find方法应用大全
2009年08月16日,8:
21下午
(4 人投票,平均:
5.00 outof5)
本文整理了以前的一些关于Find方法的文章,作为ExcelVBA应用大全的一部分。
1.Find方法的作用
使用VBA在工作表或单元格区域中查找某项数据时,我们通常使用For…Next循环,这在小范围中使用还可以,但应用在大量数据中查找时,会耗费较多时间。
而在Excel工作表中,通常使用菜单“编辑>>查找”命令或按Ctrl+F组合键,在“查找和替换”对话框中来迅速查找所需的数据。
在VBA中,我们也能使用这种方法,即Find方法,这在下面的内容中介绍。
Find方法将在指定的单元格区域中查找包含参数指定数据的单元格,若找到符合条件的数据,则返回包含该数据的单元格;若未发现相匹配的数据,则返回Nothing。
该方法返回一个Range对象,在使用该方法时,不影响选定区域或活动单元格。
为什么要使用Find方法呢?
最主要的原因是查找的速度。
如果要使用VBA代码在包含大量数据的单元格区域中查找某项数据,应该使用Find方法。
例如,在工作表Sheet1的单元格IV65536中输入fanjy,然后运行下面的代码:
SubQuickSearch()
IfNotSheet1.Cells.Find("fanjy")IsNothingThenMsgBox"已找到fanjy!
"
EndSub
再试试下面的代码:
SubSlowSearch()
DimRAsRange
ForEachRInSheet1.Cells
IfR.Value="fanjy"ThenMsgBox"已找到fanjy!
"
NextR
EndSub
比较一下两段代码的速度,可知第一段代码运行很快,而第二段代码却要执行相当长的一段时间。
2.Find方法的语法
[语法]
<单元格区域>.Find(What,[After],[LookIn],[LookAt],[SearchOrder],[SearchDirection],[MatchCase],[MatchByte],[SearchFormat])
[参数说明]
(1)<单元格区域>,必须指定,返回一个Range对象。
(2)参数What,必需指定。
代表所要查找的数据,可以为字符串、整数或者其它任何数据类型的数据。
对应于“查找与替换”对话框中,“查找内容”文本框中的内容。
(3)参数After,可选。
指定开始查找的位置,即从该位置所在的单元格之后向后或之前向前开始查找(也就是说,开始时不查找该位置所在的单元格,直到Find方法绕回到该单元格时,才对其内容进行查找)。
所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之后开始进行查找。
(4)参数LookIn,可选。
指定查找的范围类型,可以为以下常量之一:
xlValues、xlFormulas或者xlComments,默认值为xlFormulas。
对应于“查找与替换”对话框中,“查找范围”下拉框中的选项。
(5)参数LookAt,可选。
可以为以下常量之一:
XlWhole或者xlPart,用来指定所查找的数据是与单元格内容完全匹配还是部分匹配,默认值为xlPart。
对应于“查找与替换”对话框中,“单元格匹配”复选框。
(6)参数SearchOrder,可选。
用来确定如何在单元格区域中进行查找,是以行的方式(xlByRows)查找,还是以列的方式(xlByColumns)查找,默认值为xlByRows。
对应于“查找与替换”对话框中,“搜索”下拉框中的选项。
(7)参数SearchDirection,可选。
用来确定查找的方向,即是向前查找(XlPrevious)还是向后查找(xlNext),默认的是向后查找。
(8)参数MatchCase,可选。
若该参数值为True,则在查找时区分大小写。
默认值为False。
对应于“查找与替换”对话框中,“区分大小写”复选框。
(9)参数MatchByter,可选。
即是否区分全角或半角,在选择或安装了双字节语言时使用。
若该参数为True,则双字节字符仅与双字节字符相匹配;若该参数为False,则双字节字符可匹配与其相同的单字节字符。
对应于“查找与替换”对话框中,“区分全角/半角”复选框。
(10)参数SearchFormat,可选,指定一个确切类型的查找格式。
对应于“查找与替换”对话框中,“格式”按钮。
当设置带有相应格式的查找时,该参数值为True。
(11)在每次使用Find方法后,参数LookIn、LookAt、SearchOrder、MatchByte的设置将保存。
如果下次使用本方法时,不改变或指定这些参数的值,那么该方法将使用保存的值。
在VBA中设置的这些参数将更改“查找与替换”对话框中的设置;同理,更改“查找与替换”对话框中的设置,也将同时更改已保存的值。
也就是说,在编写好一段代码后,若在代码中未指定上述参数,可能在初期运行时能满足要求,但若用户在“查找与替换”对话框中更改了这些参数,它们将同时反映到程序代码中,当再次运行代码时,运行结果可能会产生差异或错误。
若要避免这个问题,在每次使用时建议明确的设置这些参数。
3.Find方法使用示例
3.1 本示例在活动工作表中查找what变量所代表的值的单元格,并删除该单元格所在的列。
SubFind_Error()
DimrngAsRange
DimwhatAsString
what="Error"
Do
Setrng=ActiveSheet.UsedRange.Find(what)
IfrngIsNothingThen
ExitDo
Else
Columns(rng.Column).Delete
EndIf
Loop
EndSub
3.2带格式的查找
本示例在当前工作表单元格中查找字体为”ArialUnicodeMS”且颜色为红色的单元格。
其中,Application.FindFormat对象允许指定所需要查找的格式,此时Find方法的参数SearchFormat应设置为True。
SubFindWithFormat()
WithApplication.FindFormat.Font
.Name="ArialUnicodeMS"
.ColorIndex=3
EndWith
Cells.Find(what:
="",SearchFormat:
=True).Activate
EndSub
[小结]在使用Find方法找到符合条件的数据后,就可以对其进行相应的操作了。
您可以:
∙对该数据所在的单元格进行操作;
∙对该数据所在单元格的行或列进行操作;
∙对该数据所在的单元格区域进行操作。
4.与Find方法相联系的方法
可以使用FindNext方法和FindPrevious方法进行重复查找。
在使用这两个方法之前,必须用Find方法指定所需要查找的数据内容。
4.1FindNext方法
FindNext方法对应于“查找与替换”对话框中的“查找下一个”按钮。
可以使用该方法继续执行查找,查找下一个与Find方法中所指定条件的数据相匹配的单元格,返回代表该单元格的Range对象。
在使用该方法时,不影响选定区域或活动单元格。
4.1.1语法
<单元格区域>.FindNext(After)
4.1.2参数说明
参数After,可选。
代表所指定的单元格,将从该单元格之后开始进行查找。
开始时不查找该位置所在的单元格,直到FindNext方法绕回到该单元格时,才对其内容进行查找。
所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之后开始进行查找。
当查找到指定查找区域的末尾时,本方法将环绕至区域的开始继续查找。
发生环绕后,为停止查找,可保存第一次找到的单元格地址,然后测试下一个查找到的单元格地址是否与其相同,作为判断查找退出的条件,以避免出现死循环。
当然,如果在查找的过程中,将查找到的单元格数据进行了改变,也可不作此判断,如下例所示。
4.2FindPrevious方法
可以使用该方法继续执行Find方法所进行的查找,查找前一个与Find方法中所指定条件的数据相匹配的单元格,返回代表该单元格的Range对象。
在使用该方法时,不影响选定区域或活动单元格。
4.2.1语法
<单元格区域>.FindPrevious(After)
4.2.2参数说明
参数After,可选。
代表所指定的单元格,将从该单元格之前开始进行查找。
开始时不查找该位置所在的单元格,直到FindPrevious方法绕回到该单元格时,才对其内容进行查找。
所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之前开始进行查找。
当查找到指定查找区域的起始位置时,本方法将环绕至区域的末尾继续查找。
发生环绕后,为停止查找,可保存第一次找到的单元格地址,然后测试下一个查找到的单元格地址是否与其相同,作为判断查找退出的条件,以避免出现死循环。
4.2.3示例
在工作表中输入如下图1所示的数据,至少保证在A列中有两个单元格输入了数据“excelhome”。
图1:
测试的数据
在VBE编辑器中输入下面的代码测试Find方法、FindNext方法、FindPrevious方法,体验各个方法所查找到的单元格位置。
SubtestFind()
DimfindValueAsRange
SetfindValue=Worksheets("Sheet1").Columns("A").Find(what:
="excelhome")
MsgBox"第一个数据发现在单元格:
"&findValue.Address
SetfindValue=Worksheets("Sheet1").Columns("A").FindNext(After:
=findValue)
MsgBox"下一个数据发现在单元格:
"&findValue.Address
SetfindValue=Worksheets("Sheet1").Columns("A").FindPrevious(After:
=findValue)
MsgBox"前一个数据发现在单元格"&findValue.Address
EndSub
5.综合示例
[示例1]查找值并选中该值所在的单元格
[示例1-1]
SubFind_First()
DimFindStringAsString
DimrngAsRange
FindString=InputBox("请输入要查找的值:
")
IfTrim(FindString)<>""Then
WithSheets("Sheet1").Range("A:
A")
Setrng=.Find(What:
=FindString,_
After:
=.Cells(.Cells.Count),_
LookIn:
=xlValues,_
LookAt:
=xlWhole,_
SearchOrder:
=xlByRows,_
SearchDirection:
=xlNext,_
MatchCase:
=False)
IfNotrngIsNothingThen
Application.Gotorng,True
Else
MsgBox"没有找到!
"
EndIf
EndWith
EndIf
EndSub
示例说明:
运行程序后,将在工作表Sheet1的A列中查找InputBox函数输入框中所输入的值,并查找该值所在的第一个单元格,如果没有找到该值,则显示消息框“没有找到!
”。
语句Application.Gotorng,True的作用是将窗口滚动至该单元格,即该单元格位于当前窗口的左上方。
[示例1-2]
SubFind_Last()
DimFindStringAsString
DimrngAsRange
FindString=InputBox("请输入要查找的值")
IfTrim(FindString)<>""Then
WithSheets("Sheet1").Range("A:
A")
Setrng=.Find(What:
=FindString,_
After:
=.Cells
(1),_
LookIn:
=xlValues,_
LookAt:
=xlWhole,_
SearchOrder:
=xlByRows,_
SearchDirection:
=xlPrevious,_
MatchCase:
=False)
IfNotrngIsNothingThen
Application.Gotorng,True
Else
MsgBox"Nothingfound"
EndIf
EndWith
EndIf
EndSub
示例说明:
与上面的程序不同的是,运行该程序后,将在工作表Sheet1的A列中查找InputBox函数输入框中所输入的值,并选中该值所在的最后一个单元格。
请比较代码中Find方法的参数。
[示例1-3]
SubFind_Todays_Date()
DimFindStringAsDate
DimrngAsRange
FindString=Date
WithSheets("Sheet1").Range("A:
A")
Setrng=.Find(What:
=FindString,_
After:
=.Cells(.Cells.Count),_
LookIn:
=xlFormulas,_
LookAt:
=xlWhole,_
SearchOrder:
=xlByRows,_
SearchDirection:
=xlNext,_
MatchCase:
=False)
IfNotrngIsNothingThen
Application.Gotorng,True
Else
MsgBox"没有找到!
"
EndIf
EndWith
EndSub
示例说明:
运行程序后,将在工作表Sheet1的A列中查找日期所在的单元格,并选中第一个日期单元格。
[示例2]在B列中标出A列中有相应值的单元格
SubMark_cells_in_column()
DimFirstAddressAsString
DimmyArrAsVariant
DimrngAsRange
DimIAsLong
Application.ScreenUpdating=False
myArr=Array("VBA")
'也能够在数组中使用更多的值,如下所示
'myArr=Array("VBA","VSTO")
WithSheets("Sheet2").Range("A:
A")
.Offset(0,1).ClearContents
'清除右侧单元格中的内容
ForI=LBound(myArr)ToUBound(myArr)
Setrng=.Find(What:
=myArr(I),_
After:
=.Cells(.Cells.Count),_
LookIn:
=xlFormulas,_
LookAt:
=xlWhole,_
SearchOrder:
=xlByRows,_
SearchDirection:
=xlNext,_
MatchCase:
=False)
'如要想查找rng.value中的一部分,可使用参数值xlPart
'如果使用LookIn:
=xlValues,也会处理公式单元格中与条件相同的值
IfNotrngIsNothingThen
FirstAddress=rng.Address
Do
rng.Offset(0,1).Value="X"
'如果值VBA找到,则在该单元格的右侧列中的相应单元格作上标记
Setrng=.FindNext(rng)
LoopWhileNotrngIsNothingAndrng.Address<>FirstAddress
EndIf
NextI
EndWith
Application.ScreenUpdating=True
EndSub
示例说明:
运行程序后,将查找工作表Sheet2上A列中的每个单元格,并在值为“VBA”所在的单元格的右侧单元格中作出标记“X”。
[示例3]为区域中指定值的单元格填充颜色
SubColor_cells_in_Range()
DimFirstAddressAsString
DimMySearchAsVariant
DimmyColorAsVariant
DimrngAsRange
DimIAsLong
MySearch=Array("VBA")
myColor=Array("3")
'也能在数组中使用多个值
'MySearch=Array("VBA","Hello","OK")
'myColor=Array("3","6","10")
WithSheets("Sheet3").Range("A1:
C4")
'将所有单元格中的填充色改为无填充色
.Interior.ColorIndex=xlColorIndexNone
ForI=LBound(MySearch)ToUBound(MySearch)
Setrng=.Find(What:
=MySearch(I),_
After:
=.Cells(.Cells.Count),_
LookIn:
=xlFormulas,_
LookAt:
=xlWhole,_
SearchOrder:
=xlByRows,_
SearchDirection:
=xlNext,_
MatchCase:
=False)
'如果想查找rng.value的一部分,则使用参数值xlPart
'如果使用LookIn:
=xlValues,则也会处理公式单元格
IfNotrngIsNothingThen
FirstAddress=rng.Address
Do
rng.Interior.ColorIndex=myColor(I)
Setrng=.FindNext(rng)
LoopWhileNotrngIsNothingAndrng.Address<>FirstAddress
EndIf
NextI
EndWith
EndSub
示例说明:
运行程序后,将在工作表Sheet3上的单元格区域A1:
C4中查找含有“VBA”的单元格,并将这些单元格填充为红色。
如示例中的注释所提示的,也可以使用数组,将不同的值所在的单元格标记为不同的颜色。
也可以添加下面的语句,改变单元格中文本的颜色:
.Font.ColorIndex=0
.Font.ColorIndex=myColor(I)
[示例4]为工作表中指定值的单元格填充颜色
SubColor_cells_in_Sheet()
DimFirstAddressAsString
DimMySearchAsVariant
DimmyColorAsVariant
DimrngAsRange
DimIAsLong
MySearch=Array("VBA")
myColor=Array("3")
'也能在数组中使用多个值
'MySearch=Array("VBA","Hello","OK")
'myColor=Array("3","6","10")
WithSheets("Sheet4").Cells
'将所有单元格中的填充色改为无填充色
.Interior.ColorIndex=xlColorIndexNone
ForI=LBound(MySearch)ToUBound(MySearch)
Setrng=.Find(What:
=MySearch(I),_
After:
=.Cells(.Cells.Count),_
LookIn:
=xlFormulas,_
LookAt:
=xlWhole,_
SearchOrder:
=xlByRows,_
SearchDirection:
=xlNext,_
MatchCase:
=False)
'如果想查找rng.value的一部分,则使用参数值xlPart
'如果使用LookIn:
=xlValues,则也会处理公式单元格
IfNotrngIsNothingThen
FirstAddress=rng.Address
Do
rng.Interior.ColorIndex=myColor(I)
Setrng=.FindNext(rng)
LoopWhileNotrngIsNothingAndrng.Address<>FirstAddress
EndIf
NextI
EndWith
EndSub
示例说明:
运行程序后,将在工作表Sheet4中查找含有“VBA”的单元格,并将这些单元格填充为红色。
如示例中的注释所提示的,也可以使用数组,将不同的值所在的单元格标记为不同的颜色。
也可以添加下面的语句,改变单元格中文本的颜色:
.Font.ColorIndex=0
.Font.ColorIndex=myColor(I)
[示例5]为工作簿所有工作表中含有指定值的单元格填充颜色
SubColor_cells_in_All_Sheets()
DimFirstAddressAsString
DimMySearchAsVariant
DimmyColorAsVariant
DimshAsWorksheet
DimrngAsRange
DimIAsLong
MySearch=Array("ron")
myColor=Array("3")
'也能在数组中使用多个值
'MySearch=Array("VBA","Hello","OK")
'myColor=Array("3","6","10")
ForEachshInActiveWorkbook.Worksheets
Withsh.Cells
'将所有单元格中的填充色改为无填充色
.Interior.ColorIndex=x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Range 对象 应用 大全 Find 方法