在VBA中使用Find方法_第1頁
在VBA中使用Find方法_第2頁
在VBA中使用Find方法_第3頁
在VBA中使用Find方法_第4頁
在VBA中使用Find方法_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

在VBA中使用Find方法使用VBA在工作表或單元格區(qū)域中查找某項(xiàng)數(shù)據(jù)時(shí),我們通常使用For...Next循環(huán),這在小范圍中使用還可以,但應(yīng)用在大量數(shù)據(jù)中查找時(shí),會(huì)耗費(fèi)較多時(shí)間。而在Excel工作表中,通常使用菜單'編輯>>查找”命令或按Ctrl+F組合鍵,在“查找和替換”對(duì)話框中來迅速查找所需的數(shù)據(jù)。在VBA中,我們也能使用這種方法,這在下面的內(nèi)容中介紹。為什么要使用Find方法呢?最主要的原因是查找的速度如果要使用VBA代碼在包含大量數(shù)據(jù)的單元格區(qū)域中查找某項(xiàng)數(shù)據(jù),應(yīng)該使用Find方法。例如,在工作表Sheet1的單元格IV65536中輸入fanjy,然后運(yùn)行下面的代碼:SubQuickSearch()IfNotSheet1.Cells.Find("fanjy")IsNothingThenMsgBox”已找到fanjy!"EndSub再試試下面的代碼:SubSlowSearch()DimRAsRangeForEachRInSheet1.CellsIfR.Value="fanjy"ThenMsgBox”已找到fanjy!"NextREndSub比較一下兩段代碼的速度,可知第一段代碼運(yùn)行很快,而第二段代碼卻要執(zhí)行相當(dāng)長的一段時(shí)間。關(guān)于Find方法的基本使用方法請(qǐng)見《關(guān)于查找方法(Find方法)的應(yīng)用》。下面介紹一些擴(kuò)展Find方法的技術(shù)。我們能夠使用Find方法查找單元格區(qū)域的數(shù)據(jù),但是沒有一個(gè)方法能夠返回一個(gè)Range對(duì)象,該對(duì)象引用了含有所查找數(shù)據(jù)的所有單元格,下面提供了一個(gè)FindAll函數(shù)來實(shí)現(xiàn)此功能。此外,F(xiàn)ind方法的另一個(gè)不足之處是不支持通配符字符串,下面也提供了一個(gè)WildCardMatchCells函數(shù),返回一個(gè)Range對(duì)象,引用了與所提供的通配符字符串相匹配的單元格。通配符字符串可以是有效使用在Like運(yùn)算符中的任何字符串,關(guān)于Like運(yùn)算符的介紹請(qǐng)見《關(guān)于Like運(yùn)算符的使用》一文。FindAll函數(shù)這個(gè)程序在參數(shù)SearchRange所代表的區(qū)域中查找所有含有參數(shù)FindWhat代表的值的單元格,SearchRange參數(shù)必須是一個(gè)單獨(dú)的單元格區(qū)域?qū)ο?,F(xiàn)indWhat參數(shù)是想要查找的值,其它參數(shù)是可選的且與Find方法的參數(shù)意思相同。FindAll函數(shù)的代碼如下:OptionCompareTextFunctionFindAll(SearchRangeAsRange,FindWhatAsVariant,_OptionalLookInAsXlFindLookIn=xlValues,OptionalLookAtAsXlLookAt=xlWhole,_OptionalSearchOrderAsXlSearchOrder=xlByRows,_OptionalMatchCaseAsBoolean=False)AsRange ,返回SearchRange區(qū)域中含有FindWhat所代表的值的所有單元格組成的Range對(duì)象'其參數(shù)與Find方法的參數(shù)相同'如果沒有找到單元格,將返回Nothing. DimFoundCellAsRangeDimFoundCellsAsRangeDimLastCellAsRangeDimFirstAddrAsStringWithSearchRangeSetLastCell=.Cells(.Cells.Count)EndWithSetFoundCell=SearchRange.Find(what:=FindWhat,after:=LastCell,_LookIn:=LookIn,LookAt:=LookAt,SearchOrder:=SearchOrder,MatchCase:=MatchCase)IfNotFoundCellIsNothingThenSetFoundCells=FoundCellFirstAddr=FoundCell.AddressDoSetFoundCells=Application.Union(FoundCells,FoundCell)SetFoundCell=SearchRange.FindNext(after:=FoundCell)LoopUntil(FoundCellIsNothing)Or(FoundCell.Address=FirstAddr)EndIfIfFoundCellsIsNothingThenElseSetFindAll=FoundCellsEndIfEndFunction使用上面代碼的示例:SubTestFindAll()DimSearchRangeAsRangeDimFoundCellsAsRangeDimFoundCellAsRangeDimFindWhatAsVariantDimMatchCaseAsBooleanDimLookInAsXlFindLookInDimLookAtAsXlLookAtDimSearchOrderAsXlSearchOrderSetSearchRange=ThisWorkbook.Worksheets(1).Range("A1:L20")FindWhat="A"'要查找的文本,可根據(jù)實(shí)際情況自定LookIn=xlValuesLookAt=xlPartSearchOrder=xlByRowsMatchCase=FalseSetFoundCells=FindAll(SearchRange:=SearchRange,FindWhat:=FindWhat,_LookIn:=LookIn,LookAt:=LookAt,SearchOrder:=SearchOrder,MatchCase:=MatchCase)IfFoundCellsIsNothingThenDebug.Print"沒有找到!"ElseForEachFoundCellInFoundCells.CellsNextFoundCellEndIfEndSub上面的代碼中,列出了查找區(qū)域中含有所要查找的數(shù)據(jù)的所有單元格的地址以及相應(yīng)文本。不僅可以找出所有含有所查找數(shù)據(jù)的單元格地址,而且也可以對(duì)這些單元格進(jìn)行一系列操作,如格式化、更改數(shù)據(jù)等。WildCardMatchCells函數(shù)這個(gè)程序查找參數(shù)SearchRange所代表的區(qū)域中所有單元格,使用Like運(yùn)算符將它們的值與參數(shù)CompareLikeString所代表的值比較。參數(shù)SearchRange必須是一個(gè)單獨(dú)的區(qū)域參數(shù)CompareLikeString是想要比較的文本的格式。該函數(shù)使用單元格的Text屬性而不是Value屬性??蛇x參數(shù)SearchOrder和MatchCase與Find方法中的參數(shù)意義相同。該函數(shù)返回一個(gè)Range對(duì)象,該對(duì)象包含對(duì)與參數(shù)CompareLikeString相匹配的所有單元格的引用。如果沒有匹配的單元格,則返回Nothing。因?yàn)镕ind方法不支持通配符,程序?qū)⒀h(huán)所有的單元格,因此對(duì)于包含大量數(shù)據(jù)的區(qū)域,執(zhí)行時(shí)間可能是一個(gè)問題。并且,如果參數(shù)MatchCase為False或忽略該參數(shù),文本在程序中必須被轉(zhuǎn)換成大寫,以便于查找時(shí)不區(qū)分大小寫(即“A”=,a因此,此時(shí)程序運(yùn)行將更慢。WildCardMatchCells函數(shù)的代碼如下:FunctionWildCardMatchCells(SearchRangeAsRange,CompareLikeStringAsString,_OptionalSearchOrderAsXlSearchOrder=xlByRows,_OptionalMatchCaseAsBoolean=False)AsRange '本程序返回文本值與通配符字符串相匹配的單元格引用'返回SearchRange區(qū)域中所有相匹配的單元格'匹配的條件是參數(shù)CompareLikeString'使用了VBA中的LIKE運(yùn)算符'如果沒有相匹配的單元格或指定了一個(gè)無效的參數(shù),則返回Nothing.',參數(shù)SearchOrder指定查找的方向;逐行還是逐列(SearchOrder:=xlByRows或SearchOrder:=xlByColumns,參數(shù)MatchCase指定是否區(qū)分大小寫(MatchCase:=True,"A"<>"a")或(MatchCase:=False,"A"="a").不需要在模塊頂指定”O(jiān)ptionCompareText",如果指定的話,將不會(huì)正確執(zhí)行大小寫比較'執(zhí)行單元格中的Text屬性比較,而不是Value屬性比較'因此,僅比較顯示在屏幕中的文本,而不是隱藏在單元格中具體的值,'如果參數(shù)SearchRange是nothing或多個(gè)區(qū)域,則返回Nothing. DimFoundCellsAsRangeDimFirstCellAsRangeDimLastCellAsRangeDimRowNdxAsLongDimColNdxAsLongDimStartRowAsLongDimEndRowAsLongDimStartColAsLongDimEndColAsLongDimWSAsWorksheetDimRngAsRange,確保參數(shù)SearchRange不是Nothing且是一個(gè)單獨(dú)的區(qū)域IfSearchRangeIsNothingThenExitFunctionEndIfIfSearchRange.Areas.Count>1ThenExitFunctionEndIfWithSearchRangeSetWS=.WorksheetSetFirstCell=.Cells(1)EndWithStartRow=FirstCell.RowStartCol=FirstCell.ColumnEndRow=LastCell.RowEndCol=LastCell.ColumnIfSearchOrder=xlByRowsThenWithWSForRowNdx=StartRowToEndRowForColNdx=StartColToEndColSetRng=.Cells(RowNdx,ColNdx)IfMatchCase=FalseThen '如果參數(shù)MatchCase是False,則將字符串轉(zhuǎn)換成大寫'執(zhí)行忽略大小寫的比較'因此,MatchCase:=False比MatchCase:=True更慢 IfUCase(Rng.Text)LikeUCase(CompareLikeString)ThenIfFoundCellsIsNothingThenSetFoundCells=RngElseSetFoundCells=Application.Union(FoundCells,Rng)EndIfEndIfElse 'MatchCase為真,不需要再進(jìn)行大小寫轉(zhuǎn)換,因此更快些,這也是不需要在模塊中指定"OptionCompareText”的原因 IfRng.TextLikeCompareLikeStringThenSetFoundCells=RngElseSetFoundCells=Application.Union(FoundCells,Rng)EndIfEndIfEndIfNextColNdxINextRowNdxEndWithElseWithWSForColNdx=StartColToEndColForRowNdx=StartRowToEndRowSetRng=.Cells(RowNdx,ColNdx)IfMatchCase=FalseThenIfUCase(Rng.Text)LikeUCase(CompareLikeString)ThenIfFoundCellsIsNothingThenSetFoundCells=RngElseSetFoundCells=Application.Union(FoundCells,Rng)EndIfEndIfElseIfRng.TextLikeCompareLikeStringThenIfFoundCellsIsNothingThenSetFoundCells=RngElseSetFoundCells=Application.Union(FoundCells,Rng)EndIfEndIfEndIfNextRowNdxNextColNdxEndWithEndIfIfFoundCellsIsNothingThenSetWildCardMatchCells=NothingElseSetWildCardMatchCells=FoundCellsEndIfEndFunction使用上面

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論