Find方法应用大全.doc_第1页
Find方法应用大全.doc_第2页
Find方法应用大全.doc_第3页
Find方法应用大全.doc_第4页
Find方法应用大全.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Find方法应用大全本文整理了以前的一些关于Find方法的文章,作为Excel VBA应用大全的一部分。1. Find方法的作用使用VBA在工作表或单元格区域中查找某项数据时,我们通常使用ForNext循环,这在小范围中使用还可以,但应用在大量数据中查找时,会耗费较多时间。而在Excel工作表中,通常使用菜单“编辑查找”命令或按Ctrl+F组合键,在“查找和替换”对话框中来迅速查找所需的数据。在VBA中,我们也能使用这种方法,即Find方法,这在下面的内容中介绍。Find方法将在指定的单元格区域中查找包含参数指定数据的单元格,若找到符合条件的数据,则返回包含该数据的单元格;若未发现相匹配的数据,则返回Nothing。该方法返回一个Range对象,在使用该方法时,不影响选定区域或活动单元格。为什么要使用Find方法呢?最主要的原因是查找的速度。如果要使用VBA代码在包含大量数据的单元格区域中查找某项数据,应该使用Find方法。例如,在工作表Sheet1的单元格IV65536中输入fanjy,然后运行下面的代码:Sub QuickSearch() If Not Sheet1.Cells.Find(fanjy) Is Nothing Then MsgBox 已找到fanjy!End Sub再试试下面的代码:Sub SlowSearch() Dim R As Range For Each R In Sheet1.Cells If R.Value = fanjy Then MsgBox 已找到fanjy! Next REnd Sub比较一下两段代码的速度,可知第一段代码运行很快,而第二段代码却要执行相当长的一段时间。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变量所代表的值的单元格,并删除该单元格所在的列。Sub Find_Error() Dim rng As Range Dim what As String what = Error Do Set rng = ActiveSheet.UsedRange.Find(what) If rng Is Nothing Then Exit Do Else Columns(rng.Column).Delete End If LoopEnd Sub3.2 带格式的查找本示例在当前工作表单元格中查找字体为”Arial Unicode MS”且颜色为红色的单元格。其中,Application.FindFormat对象允许指定所需要查找的格式,此时Find方法的参数SearchFormat应设置为True。Sub FindWithFormat() With Application.FindFormat.Font .Name = Arial Unicode MS .ColorIndex = 3 End With Cells.Find(what:=, SearchFormat:=True).ActivateEnd Sub小结 在使用Find方法找到符合条件的数据后,就可以对其进行相应的操作了。您可以: 对该数据所在的单元格进行操作; 对该数据所在单元格的行或列进行操作; 对该数据所在的单元格区域进行操作。 4. 与Find方法相联系的方法可以使用FindNext方法和FindPrevious方法进行重复查找。在使用这两个方法之前,必须用Find方法指定所需要查找的数据内容。4.1 FindNext方法FindNext方法对应于“查找与替换”对话框中的“查找下一个”按钮。可以使用该方法继续执行查找,查找下一个与Find方法中所指定条件的数据相匹配的单元格,返回代表该单元格的Range对象。在使用该方法时,不影响选定区域或活动单元格。4.1.1 语法.FindNext(After)4.1.2 参数说明参数After,可选。代表所指定的单元格,将从该单元格之后开始进行查找。开始时不查找该位置所在的单元格,直到FindNext方法绕回到该单元格时,才对其内容进行查找。所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之后开始进行查找。当查找到指定查找区域的末尾时,本方法将环绕至区域的开始继续查找。发生环绕后,为停止查找,可保存第一次找到的单元格地址,然后测试下一个查找到的单元格地址是否与其相同,作为判断查找退出的条件,以避免出现死循环。当然,如果在查找的过程中,将查找到的单元格数据进行了改变,也可不作此判断,如下例所示。4.2 FindPrevious方法可以使用该方法继续执行Find方法所进行的查找,查找前一个与Find方法中所指定条件的数据相匹配的单元格,返回代表该单元格的Range对象。在使用该方法时,不影响选定区域或活动单元格。4.2.1 语法.FindPrevious(After)4.2.2 参数说明参数After,可选。代表所指定的单元格,将从该单元格之前开始进行查找。开始时不查找该位置所在的单元格,直到FindPrevious方法绕回到该单元格时,才对其内容进行查找。所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之前开始进行查找。当查找到指定查找区域的起始位置时,本方法将环绕至区域的末尾继续查找。发生环绕后,为停止查找,可保存第一次找到的单元格地址,然后测试下一个查找到的单元格地址是否与其相同,作为判断查找退出的条件,以避免出现死循环。4.2.3 示例在工作表中输入如下图1所示的数据,至少保证在A列中有两个单元格输入了数据“excelhome”。图1:测试的数据在VBE编辑器中输入下面的代码测试Find方法、FindNext方法、FindPrevious方法,体验各个方法所查找到的单元格位置。Sub testFind() Dim findValue As Range Set findValue = Worksheets(Sheet1).Columns(A).Find(what:=excelhome) MsgBox 第一个数据发现在单元格: & findValue.Address Set findValue = Worksheets(Sheet1).Columns(A).FindNext(After:=findValue) MsgBox 下一个数据发现在单元格: & findValue.Address Set findValue = Worksheets(Sheet1).Columns(A).FindPrevious(After:=findValue) MsgBox 前一个数据发现在单元格 & findValue.AddressEnd Sub5. 综合示例示例1查找值并选中该值所在的单元格示例1-1Sub Find_First() Dim FindString As String Dim rng As Range FindString = InputBox(请输入要查找的值:) If Trim(FindString) Then With Sheets(Sheet1).Range(A:A) Set rng = .Find(What:=FindString, _ After:=.Cells(.Cells.Count), _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) If Not rng Is Nothing Then Application.Goto rng, True Else MsgBox 没有找到! End If End With End IfEnd Sub示例说明:运行程序后,将在工作表Sheet1的A列中查找InputBox函数输入框中所输入的值,并查找该值所在的第一个单元格,如果没有找到该值,则显示消息框“没有找到!”。语句Application.Goto rng, True的作用是将窗口滚动至该单元格,即该单元格位于当前窗口的左上方。示例1-2Sub Find_Last() Dim FindString As String Dim rng As Range FindString = InputBox(请输入要查找的值) If Trim(FindString) Then With Sheets(Sheet1).Range(A:A) Set rng = .Find(What:=FindString, _ After:=.Cells(1), _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False) If Not rng Is Nothing Then Application.Goto rng, True Else MsgBox Nothing found End If End With End IfEnd Sub示例说明:与上面的程序不同的是,运行该程序后,将在工作表Sheet1的A列中查找InputBox函数输入框中所输入的值,并选中该值所在的最后一个单元格。请比较代码中Find方法的参数。示例1-3Sub Find_Todays_Date() Dim FindString As Date Dim rng As Range FindString = Date With Sheets(Sheet1).Range(A:A) Set rng = .Find(What:=FindString, _ After:=.Cells(.Cells.Count), _ LookIn:=xlFormulas, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) If Not rng Is Nothing Then Application.Goto rng, True Else MsgBox 没有找到! End If End WithEnd Sub示例说明:运行程序后,将在工作表Sheet1的A列中查找日期所在的单元格,并选中第一个日期单元格。示例2在B列中标出A列中有相应值的单元格Sub Mark_cells_in_column() Dim FirstAddress As String Dim myArr As Variant Dim rng As Range Dim I As Long Application.ScreenUpdating = False myArr = Array(VBA) 也能够在数组中使用更多的值,如下所示 myArr = Array(VBA, VSTO) With Sheets(Sheet2).Range(A:A) .Offset(0, 1).ClearContents 清除右侧单元格中的内容 For I = LBound(myArr) To UBound(myArr) Set rng = .Find(What:=myArr(I), _ After:=.Cells(.Cells.Count), _ LookIn:=xlFormulas, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) 如要想查找rng.value中的一部分,可使用参数值xlPart 如果使用LookIn:=xlValues,也会处理公式单元格中与条件相同的值 If Not rng Is Nothing Then FirstAddress = rng.Address Do rng.Offset(0, 1).Value = X 如果值VBA找到,则在该单元格的右侧列中的相应单元格作上标记 Set rng = .FindNext(rng) Loop While Not rng Is Nothing And rng.Address FirstAddress End If Next I End With Application.ScreenUpdating = TrueEnd Sub示例说明:运行程序后,将查找工作表Sheet2上A列中的每个单元格,并在值为“VBA”所在的单元格的右侧单元格中作出标记“X”。示例3为区域中指定值的单元格填充颜色Sub Color_cells_in_Range() Dim FirstAddress As String Dim MySearch As Variant Dim myColor As Variant Dim rng As Range Dim I As Long MySearch = Array(VBA) myColor = Array(3) 也能在数组中使用多个值 MySearch = Array(VBA, Hello, OK) myColor = Array(3, 6, 10) With Sheets(Sheet3).Range(A1:C4) 将所有单元格中的填充色改为无填充色 .Interior.ColorIndex = xlColorIndexNone For I = LBound(MySearch) To UBound(MySearch) Set rng = .Find(What:=MySearch(I), _ After:=.Cells(.Cells.Count), _ LookIn:=xlFormulas, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) 如果想查找rng.value的一部分,则使用参数值xlPart 如果使用LookIn:=xlValues,则也会处理公式单元格 If Not rng Is Nothing Then FirstAddress = rng.Address Do rng.Interior.ColorIndex = myColor(I) Set rng = .FindNext(rng) Loop While Not rng Is Nothing And rng.Address FirstAddress End If Next I End WithEnd Sub示例说明:运行程序后,将在工作表Sheet3上的单元格区域A1:C4中查找含有“VBA”的单元格,并将这些单元格填充为红色。如示例中的注释所提示的,也可以使用数组,将不同的值所在的单元格标记为不同的颜色。也可以添加下面的语句,改变单元格中文本的颜色:.Font.ColorIndex=0.Font.ColorIndex=myColor(I)示例4为工作表中指定值的单元格填充颜色Sub Color_cells_in_Sheet() Dim FirstAddress As String Dim MySearch As Variant Dim myColor As Variant Dim rng As Range Dim I As Long MySearch = Array(VBA) myColor = Array(3) 也能在数组中使用多个值 MySearch = Array(VBA, Hello, OK) myColor = Array(3, 6, 10) With Sheets(Sheet4).Cells 将所有单元格中的填充色改为无填充色 .Interior.ColorIndex = xlColorIndexNone For I = LBound(MySearch) To UBound(MySearch) Set rng = .Find(What:=MySearch(I), _ After:=.Cells(.Cells.Count), _ LookIn:=xlFormulas, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) 如果想查找rng.value的一部分,则使用参数值xlPart 如果使用LookIn:=xlValues,则也会处理公式单元格 If Not rng Is Nothing Then FirstAddress = rng.Address Do rng.Interior.ColorIndex = myColor(I) Set rng = .FindNext(rng) Loop While Not rng Is Nothing And rng.Address FirstAddress End If Next I End WithEnd Sub示例说明:运行程序后,将在工作表Sheet4中查找含有“VBA”的单元格,并将这些单元格填充为红色。如示例中的注释所提示的,也可以使用数组,将不同的值所在的单元格标记为不同的颜色。也可以添加下面的语句,改变单元格中文本的颜色:.Font.ColorIndex=0.Font.ColorIndex=myColor(I)示例5为工作簿所有工作表中含有指定值的单元格填充颜色Sub Color_cells_in_All_Sheets() Dim FirstAddress As String Dim MySearch As Variant Dim myColor As Variant Dim sh As Worksheet Dim rng As Range Dim I As Long MySearch = Array(ron) myColor = Array(3) 也能在数组中使用多个值 MySearch = Array(VBA, Hello, OK) myColor = Array(3, 6, 10) For Each sh In ActiveWorkbook.Worksheets With sh.Cells 将所有单元格中的填充色改为无填充色 .Interior.ColorIndex = xlColorIndexNone For I = LBound(MySearch) To UBound(MySearch) Set rng = .Find(What:=MySearch(I), _ After:=.Cells(.Cells.Count), _ LookIn:=xlFormulas, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) 如果想查找rng.value的一部分,则使用参数值xlPart 如果使用LookIn:=xlValues,则也会处理公式单元格 If Not rng Is Nothing Then FirstAddress = rng.Address Do rng.Interior.ColorIndex = myColor(I) Set rng = .FindNext(rng) Loop While Not rng Is Nothing And rng.Address FirstAddress End If Next I End With Next shEnd Sub示例说明:运行程序后,将在工作簿所有工作表中查找含有“VBA”的单元格,并将这些单元格填充为红色。如示例中的注释所提示的,也可以使用数组,将不同的值所在的单元格标记为不同的颜色。也可以添加下面的语句,改变单元格中文本的颜色:.Font.ColorIndex=0.Font.ColorIndex=myColor(I)示例6复制相应的值到另一个工作表中Sub Copy_To_Another_Sheet() Dim FirstAddress As String Dim MyArr As Variant Dim Rng As Range Dim Rcount As Long Dim I As Long Application.ScreenUpdating = False 也能够使用含有更多值的数组 myArr = Array(, www) MyArr = Array() Rcount = 0 With Sheets(Sheet5).Range(A1:E10) For I = LBound(MyArr) To UBound(MyArr) 如果使用LookIn:=xlValues,也会处理含有的公式单元格 注意:本示例使用xlPart而不是xlWhole Set Rng = .Find(What:=MyArr(I), _ After:=.Cells(.Cells.Count), _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) If Not Rng Is Nothing Then FirstAddress = Rng.Address Do Rcount = Rcount + 1 仅复制值 Sheets(Sheet6).Range(A & Rcount).Value = Rng.Value Set Rng = .FindNext(Rng) Loop While Not Rng Is Nothing And Rng.Address FirstAddress End If Next I End WithEnd Sub示例说明:运行程序后,将在工作表Sheet5的单元格区域A1:E10中查找带有“”的单元格,即e-mail地址,然后将这些单元格值依次复制到工作表Sheet6的A列中。注意,本例中使用参数值为xlPart,并且仅复制单元格值,即不带格式。示例7在当前工作表的单元格区域A1:A50中输入数据5和其它的一些数据,然后在VBE编辑器中输入下面的代码。运行后,程序将在单元格A1:A50区域中查找数值5所在的单元格,并在所找到的单元格中画一个蓝色的椭圆。Sub FindSample1() Dim Cell As Range, FirstAddress As String With Worksheets(1).Range(A1:A50) Set Cell = .Find(5) If Not Cell Is Nothing Then FirstAddress = Cell.Address Do With Worksheets(1).Ovals.Add(Cell.Left, _ Cell.Top, Cell.Width, _ Cell.Height) .Interior.Pattern = xlNone .Border.ColorIndex = 5 End With Set Cell = .FindNext(Cell) Loop Until Cell Is Nothing Or Cell.Address = FirstAddress End If End WithEnd Sub示例8在一个列表中复制相关数据到另一个列表本程序的功能是,根据单元格I1中的值,在单元格区域A1:D11中的B列进行查找,每次找到相应的值,就将该单元格所在区域的行数据复制到以单元格G3(该单元格命名为found)开始的区域中。原数据如下图2所示。图2:原始数据点击工作表中的“查找”按钮,运行后的结果如下图3所示。图3:运行后的结果源程序代码清单及相关说明如下:Option ExplicitSub FindSample2() Dim ws As Worksheet Dim rgSearchIn As Range Dim rgFound As Range Dim sFirstFound As String Dim bContinue As Boolean ReSetFoundList 初始化要复制的列表区域 Set ws = ThisWorkbook.Worksheets(sheet1) bContinue = True Set rgSearchIn = GetSearchRange(ws) 获取查找区域 设置查找参数 Set rgFound = rgSearchIn.Find(what:=ws.Range(I1).Value, _ LookIn:=xlValues, LookAt:=xlWhole) 获取第一个满足条件的单元格地址,作为结束循环的条件 If Not rgFound Is Nothing Then sFirstFound = rgFound.Address Do Until rgFound Is Nothing Or Not bContinue CopyItem rgFound Set rgFound = rgSearchIn.FindNext(rgFound) 判断循环是否中止 If rgFound.Address = sFirstFound Then bContinue = False Loop Set rgSearchIn = Nothing Set rgFound = Nothing Set ws = NothingEnd Sub获取查找区域,即B列中的部位单元格区域Private Function GetSearchRange(ws As Worksheet) As Range Dim lLastRow As Long lLastRow = ws.Cells(65536, 1).End(xlUp).Row Set GetSearchRange = ws.Range(ws.Cells(1, 2), ws.Cells(lLastRow, 2)End Function复制查找到的数据到found区域Private Sub CopyItem(rgItem As Range) Dim rgDestination As Range Dim rgEntireItem As Range 获取在查找区域中的整行数据 Set rgEntireItem = rgItem.Offset(0, -1) Set rgEntireItem = rgEntireItem.Resize(1, 4) Set rgDestination = rgItem.Parent.Range(found) 定位要复制到的found区域的第一行 If IsEmpty(rgDestination.Offset(1, 0) Then Set rgDestination = rgDestination.Offset(1, 0) Else Set rgDestination = rgDestination.End(xlDown).Offset(1, 0) End If 复制找到的数据到found区域 rgEntireItem.Copy rgDestination Set rgDestination = Nothing Set rgEntireItem = NothingEnd Sub初始化要复制到的区域(found区域)Private Sub ReSetFoundList() Dim ws As Worksheet Dim lLastRow As Long Dim rgTopLeft As Range Dim rgBottomRight As Range Set ws = ThisWorkbook.Worksheets(sheet1) Set rgTopLeft = ws.Range(found).Offset(1, 0) lLastRow = ws.Range(found).End(xlDown).Row Set rgBottomRight = ws.Cells(lLastRow, rgTopLeft.Offset(0, 3).Column) ws.Range(rgTopLeft, rgBottomRight).ClearContents Set rgTopLeft = Nothing Set rgBottomRight = Nothing Set ws = NothingEnd Sub在上述程序代码中,程序FindSample2( )为主程序,首先调用子程序ReSetFoundList( )对所要复制到的数据区域初始化,即清空除标题行以外的内容;然后调用自定义函数GetSearchRange(ws As Worksheet)获取所在查找的单元格区域;在主程序中使用Find方法和FIndNext方法进行查找,调用带参数的子程序CopyItem(rgItem As Range)将查找到的单元格所在的数据行复制到相应的区域。示例9实现带连续单元格区域条件的查找下面的代码提供了一种实现以连续单元格区域中的数据为查找条件进行查找的方法和思路。在本例中,所查找条件区域为D2:D4,在单元格区域A1:A21中进行查找,将结果输入到以单元格F2开始的区域中。示例程序所对应的工作表数据及结果如下图4所示。Sub Fin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论