這里的應用場景如下:
“ 在工作表 Sheet1 中存儲著數據,現在想要在該工作表的第O 列至第T 列中搜索指定的數據,如果發現,則將數據所在行復制到工作表Sheet2 中。
用戶在一個一級中輸入要搜索的數據值,然后自動將滿足前面條件的所有行復制到工作表Sheet2 中。”
首先,使用用戶預先設計的輸入第一步,如下圖 1 所示。
圖 1
在該用戶常規模塊中編寫代碼:
私人Sub cmdOK_Click()
昏暗的工作簿
調光行
昏暗搜索范圍
昏暗的發現
Dim rngFoundCells作為范圍
Dim rngFoundCell作為范圍
昏暗的行
Application.ScreenUpdating = False
‘ 賦值工作表Sheet1
設置wks =工作表(“ Sheet1”)
有星期
‘ 工作表中的最后一個數據行
lngRow = .Range(“ A”&Rows.Count).End(xlUp).Row
‘ 被查找的單元格區域
設置rngSearch = .Range(“ O2:T”&lngRow)
“ 查找的數據文本值
‘ 由用戶在文本目錄輸入
FindWhat =“ *”&Me.txtSearch.Text和“ *”
‘ 調用FindAll 函數查找數據值
‘ 存儲滿足條件的所有單元格
設置rngFoundCells = FindAll(SearchRange:= rngSearch,_
FindWhat:= FindWhat,_
LookIn:= xlValues,_
LookAt:= xlWhole,_
SearchOrder:= xlByColumns,_
MatchCase:=假,_
BeginsWith:= vbNullString,_
EndsWith:= vbNullString,_
BeginEndCompare:= vbTextCompare)
‘ 如果沒有找到則稱為消息
如果rngFoundCells什么都沒有,那么
轉到SendInfo
萬一
‘ 清空工作表Sheet2
Sheets(“ Sheet2”)。Cells.Clear
‘ 獲取數據單元格所在的行并復制到工作表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
結束于
Application.ScreenUpdating = True
卸載我
退出子
SendInfo:
MsgBox“ 沒有找到數據 ”,,“ 查找 ”
結束子
代碼中使用的 FindAll 函數代碼如下:
‘ 自定義函數
‘ 獲取滿足條件的所有單元格
函數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
昏暗區域作為范圍
昏暗的MaxRow只要長
昏暗的MaxCol只要
昏暗的BeginB為布爾
將EndB昏暗為布爾值
CompMode = BeginEndCompare
如果BeginsWith <> vbNullString或EndsWith <> vbNullString然后
XLookAt = xlPart
其他
XLookAt = LookAt
萬一
對于SearchRange.Areas中的每個區域
有面積
如果.Cells(.Cells.Count).Row> MaxRow然后
MaxRow = .Cells(.Cells.Count).Row
萬一
如果.Cells(.Cells.Count).Column> MaxCol然后
MaxCol = .Cells(.Cells.Count).Column
萬一
結束于
下一個區域
設置LastCell = SearchRange.Worksheet.Cells(MaxRow,MaxCol)
出錯時轉到0
設置FoundCell = SearchRange.Find(What:= FindWhat,_
之后:= LastCell,_
LookIn:= LookIn,_
LookAt:= XLookAt,_
SearchOrder:= SearchOrder,_
MatchCase:= MatchCase)
如果Not FoundCell一無所有
設置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無效,則
設置ResultRange = FoundCell
其他
設置ResultRange = Application.Union(ResultRange,FoundCell)
萬一
萬一
設置FoundCell = SearchRange.FindNext(之后:= FoundCell)
如果(FoundCell什么都沒有)然后
退出做
萬一
如果(FoundCell.Address = FirstFound.Address)然后
退出做
萬一
循環
萬一
設置FindAll = ResultRange
結束功能
這是一個通用函數,直接拿來使用就行了,可用于在指定的區域查找并返回滿足條件的所有單元格。