在用Excel處理實際業務中,我們會碰到如下場景:
1、從一堆人名中找到包含某些關鍵字的名字;
2、從銀行流水檔案中根據【備註】欄位找到包含某些關鍵字的,統一識別為【手續費業務】等。
這本質說的都是一類問題:如何從資料集中,根據業務需求設定的多個關鍵字,匹配得到對應的行專案。這個問題有好的辦法嗎?
如果我們使用Excel自帶的【自定義自動篩選】功能,它只能支援新增最多兩組關鍵字,無法新增更多,如下圖所示:
如果我們有多個關鍵詞供我們作為篩選條件,Excel自帶的【自定義自動篩選】功能自然不夠用。假設我們的工作簿總共有三張表,【基礎資訊】、【姓名關鍵字】、【結果】表,結構如下:
問題是,如何從【基礎資訊】表中找到【姓名】列 符合【姓名關鍵字】表中的行專案,將對應行記錄在【結果】表中?
常規的Excel功能已經無法奏效,我們需要利用VBA手段來實現。具體思路:迴圈遍歷【基礎資訊】表每一個姓名,迴圈取出【姓名關鍵字】表每個關鍵字,看取出的姓名是否包含這些【關鍵字】中的一個,如果是,就將【基礎資訊】表這一行資訊記錄在【結果】表中,這樣就達到了基於多個關鍵字中任意一個來過濾原始資料的效果。
VBA範例程式碼如下:
Sub keyWordFilter() Dim sht1 As Worksheet, sht2 As Worksheet, sht3 As Worksheet, maxRow1 As Integer, maxRow2 As Integer, maxRow3 As Integer, userName As String, i As Integer, j As Integer, keyWord As String, k As Integer Set sht1 = ThisWorkbook.Sheets("基礎資訊") Set sht2 = ThisWorkbook.Sheets("姓名關鍵字") Set sht3 = ThisWorkbook.Sheets("結果") maxRow1 = sht1.Cells(Rows.Count, 1).End(xlUp).Row '基礎資訊表 行數 maxRow2 = sht2.Cells(Rows.Count, 1).End(xlUp).Row '姓名關鍵字表 行數 maxRow3 = sht3.Cells(Rows.Count, 1).End(xlUp).Row '結果表 行數 sht3.Rows("2:" & maxRow3).ClearContents '清空【結果表】上次留存結果,保留擡頭行 k = 2 For i = 2 To maxRow1 userName = sht1.Cells(i, 2).Value For j = 2 To maxRow2 keyWord = sht2.Cells(j, 1).Value If userName Like "*" & keyWord & "*" Then '判斷某個姓名是否包含某個關鍵字 sht3.Cells(k, 1).Value = sht1.Cells(i, 1).Value sht3.Cells(k, 2).Value = sht1.Cells(i, 2).Value sht3.Cells(k, 3).Value = sht1.Cells(i, 3).Value k = k + 1 Exit For End If Next Next End Sub
最後程式碼執行的效果,如下圖所示,非常方便:
歡迎掃碼關注我的公眾號 獲取更多爬蟲、資料分析的知識!