這里的應(yīng)用場景如下:
“ 在工作表 Sheet1 中存儲著數(shù)據(jù),現(xiàn)在想要在該工作表的第O 列至第T 列中搜索指定的數(shù)據(jù),如果發(fā)現(xiàn),則將數(shù)據(jù)所在行復(fù)制到工作表Sheet2 中。
用戶在一個一級中輸入要搜索的數(shù)據(jù)值,然后自動將滿足前面條件的所有行復(fù)制到工作表Sheet2 中?!?/p>
首先,使用用戶預(yù)先設(shè)計(jì)的輸入第一步,如下圖 1 所示。
圖 1
在該用戶常規(guī)模塊中編寫代碼:
私人Sub cmdOK_Click()
昏暗的工作簿
調(diào)光行
昏暗搜索范圍
昏暗的發(fā)現(xiàn)
Dim rngFoundCells作為范圍
Dim rngFoundCell作為范圍
昏暗的行
Application.ScreenUpdating = False
‘ 賦值工作表Sheet1
設(shè)置wks =工作表(“ Sheet1”)
有星期
‘ 工作表中的最后一個數(shù)據(jù)行
lngRow = .Range(“ A”&Rows.Count).End(xlUp).Row
‘ 被查找的單元格區(qū)域
設(shè)置rngSearch = .Range(“ O2:T”&lngRow)
“ 查找的數(shù)據(jù)文本值
‘ 由用戶在文本目錄輸入
FindWhat =“ *”&Me.txtSearch.Text和“ *”
‘ 調(diào)用FindAll 函數(shù)查找數(shù)據(jù)值
‘ 存儲滿足條件的所有單元格
設(shè)置rngFoundCells = FindAll(SearchRange:= rngSearch,_
FindWhat:= FindWhat,_
LookIn:= xlValues,_
LookAt:= xlWhole,_
SearchOrder:= xlByColumns,_
MatchCase:=假,_
BeginsWith:= vbNullString,_
EndsWith:= vbNullString,_
BeginEndCompare:= vbTextCompare)
‘ 如果沒有找到則稱為消息
如果rngFoundCells什么都沒有,那么
轉(zhuǎn)到SendInfo
萬一
‘ 清空工作表Sheet2
Sheets(“ Sheet2”)。Cells.Clear
‘ 獲取數(shù)據(jù)單元格所在的行并復(fù)制到工作表Sheet2
對于rngFoundCells中的每個rngFoundCell
lngCurRow = Val(Mid(rngFoundCell.Address,4,Len(rngFoundCell.Address)))
范圍(“ A”&lngCurRow和“:Z”&lngCurRow)。
Sheets(“ Sheet2”)。Cells(Rows.Count,1).End(xlUp).Offset(1)
下一個rngFoundCell
結(jié)束于
Application.ScreenUpdating = True
卸載我
退出子
SendInfo:
MsgBox“ 沒有找到數(shù)據(jù) ”,,“ 查找 ”
結(jié)束子
代碼中使用的 FindAll 函數(shù)代碼如下:
‘ 自定義函數(shù)
‘ 獲取滿足條件的所有單元格
函數(shù)FindAll(SearchRange AsRange,_
FindWhat作為變體,_
可選的LookIn為XlFindLookIn = xlValues,_
XlLookAt = xlWhole的可選LookAt,_
可選SearchOrder AsXlSearchOrder = xlByRows,_
可選MatchCase為布爾值= False,_
可選的BeginsWith As String = vbNullString,_
可選的EndsWith As String = vbNullString,_
可選的BeginEndCompare AsVbCompareMethod = vbTextCompare)作為范圍
昏暗FoundCell作為范圍
昏暗的FirstFound作為范圍
DimLastCell作為范圍
昏暗ResultRange作為范圍
昏暗的XLookAt作為XlLookAt
暗含為布爾
Dim CompMode作為VbCompareMethod
昏暗區(qū)域作為范圍
昏暗的MaxRow只要長
昏暗的MaxCol只要
昏暗的BeginB為布爾
將EndB昏暗為布爾值
CompMode = BeginEndCompare
如果BeginsWith <> vbNullString或EndsWith <> vbNullString然后
XLookAt = xlPart
其他
XLookAt = LookAt
萬一
對于SearchRange.Areas中的每個區(qū)域
有面積
如果.Cells(.Cells.Count).Row> MaxRow然后
MaxRow = .Cells(.Cells.Count).Row
萬一
如果.Cells(.Cells.Count).Column> MaxCol然后
MaxCol = .Cells(.Cells.Count).Column
萬一
結(jié)束于
下一個區(qū)域
設(shè)置LastCell = SearchRange.Worksheet.Cells(MaxRow,MaxCol)
出錯時轉(zhuǎn)到0
設(shè)置FoundCell = SearchRange.Find(What:= FindWhat,_
之后:= LastCell,_
LookIn:= LookIn,_
LookAt:= XLookAt,_
SearchOrder:= SearchOrder,_
MatchCase:= MatchCase)
如果Not FoundCell一無所有
設(shè)置FirstFound = FoundCell
做到錯誤
包含=錯誤
如果BeginsWith = vbNullString AndEndsWith = vbNullString然后
包含=正確
其他
如果BeginsWith <> vbNullString然后
IfStrComp(Left(FoundCell.Text,Len(BeginsWith)),BeginsWith,BeginEndCompare)= 0然后
包含=正確
萬一
萬一
如果EndsWith <> vbNullString然后
如果StrComp(Right(FoundCell.Text,Len(EndsWith)),EndsWith,BeginEndCompare)= 0
包含=正確
萬一
萬一
萬一
如果Include = True,則
如果ResultRange無效,則
設(shè)置ResultRange = FoundCell
其他
設(shè)置ResultRange = Application.Union(ResultRange,F(xiàn)oundCell)
萬一
萬一
設(shè)置FoundCell = SearchRange.FindNext(之后:= FoundCell)
如果(FoundCell什么都沒有)然后
退出做
萬一
如果(FoundCell.Address = FirstFound.Address)然后
退出做
萬一
循環(huán)
萬一
設(shè)置FindAll = ResultRange
結(jié)束功能
這是一個通用函數(shù),直接拿來使用就行了,可用于在指定的區(qū)域查找并返回滿足條件的所有單元格。