【Excel VBA】如何處理數據模糊查詢與匹配?

2021-02-19 Excel之家ExcelHome

如下圖所示,根據A:C列的數據源信息,查詢E列人名相應的考試成績,如果查無結果,則返回空白。

此類問題常用的解決方法有三種。一種是單元格的Find方法,一種是VBA函數instr,還有一種則是搭配通配符的like語句。

1,Find方法:

Sub RngFind()
    Dim Rng As Range, cll As Range
    Dim arr, i&
    Set Rng = Range("b1:c" & Cells(Rows.Count, 2).End(xlUp).Row)
    '數據源賦值Rng
    arr = Range("e1:f" & Cells(Rows.Count, 5).End(xlUp).Row)
    '查詢區域裝入數組arr
    For i = 2 To UBound(arr) '遍歷查詢區域
        Set cll = Rng.Find(arr(i, 1), lookat:=xlPart) 'xlpart模糊匹配模式
        If Not cll Is Nothing Then
        '如果有查找到相應單元格則cll必然非nothing,那麼
            arr(i, 2) = cll.Offset(0, 1)
            '對查找到的單元格通過offset偏移取值
        Else
            arr(i, 2) = "" '否則返回空文本
        End If
    Next
    With Range("e1:f" & Cells(Rows.Count, 5).End(xlUp).Row)

        .NumberFormat = "@"
        '設置單元格文本格式,避免文本數值變形
        .Value = arr
        '將arr放回單元格區域
    End With
    MsgBox "ok"
End Sub

2,Instr和Like方法:

Sub ArrInstrOrLike()
    Dim arr, brr, i&, j&
    arr = Range("a1:c" & Cells(Rows.Count, 2).End(xlUp).Row)
    '數據源裝入數組arr
    brr = Range("e1:f" & Cells(Rows.Count, 5).End(xlUp).Row)
    '查詢區域裝入數組brr
    For i = 2 To UBound(brr)
    '遍歷查詢區域
        brr(i, 2) = ""
        '清空原結果
        For j = 1 To UBound(arr)
            If InStr(1, arr(j, 2), brr(i, 1), vbTextCompare) Then
                'Instr函數,vbTextCompare不區分字母大小寫,上期我們講過了,此外也可以使用like語句(like語句區分字母大小寫):
                'If arr(j, 2) Like "*" & brr(i, 1) & "*" Then
                brr(i, 2) = arr(j, 3)
                Exit For '找到結果後,退出遍歷arr
            End If
        Next
    Next
    With Range("e1:f" & Cells(Rows.Count, 5).End(xlUp).Row)
        .NumberFormat = "@" '文本格式,防止文本數值變形
        .Value = brr '將arr放回單元格區域
    End With
    MsgBox "ok"
End Sub

小貼士:

1,Instr函數的語法和用法,上期我們講過了。連結:VBA常用小代碼101:批量改變單元格部分字符格式。

2,LIKE語句區分字母大小寫,例如:MsgBox "MyToToOFFICE" Like "*Office*",結果為False。

3,Find方法常用於單元格對象,Instr和Like則常用於字符串計算。前者的優勢是可以不指定查詢值在查詢範圍中的具體列數,而是直接使用單元格區域甚至工作表作為查詢區域,例如此例中的Set Rng = Range("b1:c" & Cells(Rows.Count, 2).End(xlUp).Row)。後兩者雖然需要指定查詢條件列……但它們更容易處理多條件模糊匹配查詢的問題。例如將查詢條件修改成班級為Office,姓名為星光的考試成績,使用Instr或Like語句要明顯比Find更為簡單。比如:

If arr(j, 1) & arr(j, 2) Like "*Office*星光*" Then

4,應用於Range對象的Find方法,在區域中查找特定信息,並返回 Range對象,該對象代表用於查找信息的第一個單元格。如果未發現匹配單元格,就返回 Nothing。該方法不影響選定區域或活動單元格。其語法如下:

expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SerchFormat)

該方法參數眾多,但常用的不過是What(找誰?)和LookAt(xlWhole精確查詢或 xlPar模糊查詢),該方法具體可以參考Office幫助文件~

圖文作者:看見星光

相關焦點

  • 如何使用VBA處理數據模糊匹配查詢?
    在VBA系列教程前面的章節裡,分別給大家分享了什麼是字典、如何使用字典處理各種情況下的數據查詢、聚合統計等,本節再給大家分享一下如何使用VBA實現數據模糊匹配查詢。VBA處理數據模糊匹配查詢通常有4種方式,一種是單元格對象的Find方法,一種是比較運算符Like,一種是Instr函數,還一種是正則表達式。4種方式各有優勢。
  • 如何使用VLOOKUP實現數據模糊匹配查詢?
    Excel函數社群裡有一道數據模糊匹配的練習題,如下圖所示:A:F列是數據源。需要在I2:K5區域編寫函數公式,查詢H列人名相關科目的考試成績。H列人名可能是簡寫,比如星光,對應A列的人名是看見星光。這樣的問題,我們通常使用VLOOKUP函數。打個響指,還記得嗎?
  • Excel中的數據匹配和查找
    其中使用最廣的就是VLOOKUP,這篇文章就從VLOOKUP開始,介紹幾種常見的匹配和查找數據的方式。文章分成兩部分:第一部分介紹,VLOOKUP的基本使用 和 替代方法;第二部分介紹,VLOOKUP無法實現的一些功能:多列匹配,向左查詢匹配,匹配時區分大小寫,返回最後一個匹配的數據而不是第一個。
  • Excel最強大的符號,一個符號代替所有數據,讓模糊查詢變精確
    Hello,大家好,今天跟大家分享下excel中通配符的使用方法,在excel中通配符非常的簡單,但是他卻能與函數配合使用達到我們想要的結果,操作也比較的簡單,關鍵還是了解通配符的這個概念,下面就讓我們來看下今天的內容吧一、什麼是通配符通配符可以簡單理解為能夠代表excel中所有數據的符號,只要你能在excel中輸入的都可以用它來表示
  • EXCEL數據範圍區間模糊匹配,成績等級評定,教師必備實用技能
    今天跟大家分享一下EXCEL數據範圍區間模糊匹配,成績等級評定,教師必備實用技能。如果覺得幫幫真的幫到了您,分享分享朋友圈呀,親們^^<——非常重要!!!メ下面我們用查詢函數來完成。先在右側製作一新的核定表如右方所示。メ
  • excel查詢刪除重複數據的3個最簡單方法
    表格當中,我們經常會碰到在海量的數據當中,怎麼去查詢和刪除掉類似重複的數據。下面我們來講解3種查詢刪除重複數據的最為簡單的方法。
  • 【Excel書籍推薦】學Excel的VBA,什麼書還不錯?
    入門與提高》Excel疑難千尋千解叢書《Excel 2010 VBA編程與實踐》,進階提升的Excel VBA實戰技巧精粹(修訂版),進階提升的有這3本excel vba方面的書籍,入門提升就不成問題了。
  • 利用excel的INDEX函數和MATCH函數實現多條件匹配查詢
    最近有好友詢問一個關於考勤表的查詢問題,通過姓名和日期兩個條件匹配當日考勤狀況。
  • Excel數據多條件交叉查詢,全部3種方法都在這,vlookup函數已經out了
    毋庸置疑在Excel數據匹配的時候,單條件數據查找vlookup的功能確實是非常的強大。但是在進行數據多條件查詢的時候,單詞使用vlookup函數就會顯得非常的無力。下面我們就來學習如何利用函數嵌套的方式,快速完成數據的多條件匹配查詢。函數公式一:index+match函數嵌套快速完成多條件數據查詢
  • 【Excel函數篇】各種常用條件查詢套路小結
    今天和大家分享的主題是Excel函數常用的各種條件查詢套路總結,內容涵蓋了單條件數據查詢、多條件數據查詢、精確查詢、模糊條件查詢、多結果數據查詢以及動態表格查詢、多表數據查詢等。建議收藏哦~1,單條件單結果查詢醬紫的問題,我們最常用VLOOKUP函數。VLOOKUP函數的語法非常簡單。
  • INDEX+MATCH,輕鬆搞定Excel數據查找匹配
    利用Excel進行數據查找匹配,是我們日常辦公中必不可少的一環。
  • 用VLOOKUP函數從多個工作表查詢數據
    有群友在群裡問如何在多個工作表中查詢數據,當時我太忙,沒仔細考慮,只是建議用
  • 產品經理學SQL—where條件和模糊查詢
    上一次分享我們講到了單表查詢中的group by(產品經理學SQL(一))。這一次我們來說說單表查詢中的where和like(模糊查詢)。where就是起到一個過濾的作用,過濾一些你不想要的數據。比較:=,< , > , =指定範圍:between and(並列,同時滿足條件) or(或,滿足其中一個條件)集合:in , not in空值判斷:not null,null下圖是數據表:
  • excel查找函數-vlookup
    在我們日常表格數據處理中,經常遇到數據查詢等問題,比如根據產品編號查詢單價或根據產品名稱反方向查找產品編碼等。
  • 每天學點Excel|弱水三千,如何只取特定值(Vlookup函數上)?
    是的,在《每天學點excel|如何不用編程提取合併千張表》中,我們曾經使用過等距離跨行提取數據的操作。不過呀,咱們在實際工作中不只需要等距離跨行提取數據,還是經常會遇到根據特定要求提取數值的要求,不是有句老話叫作「弱水三千只取一瓢飲」嘛,如果在N多的數據裡只想找到哪個「對的TA」怎樣操作呢? 說到這,可能很多小夥伴們會說:這個好簡單呀,不是有篩選功能嘛,篩選就可以了啦。
  • 每天學點Excel|弱水三千,如何只取特定值(VLOOKUP函數下)?
    在《每天學點Excel|弱水三千,如何只取特定值(VLOOKUP函數上)》中,我們見識了VLOOKUP的神奇力量——真是想要什麼有什麼呀,怪不得在
  • 輸入快10倍,帶模糊查找的Excel下拉菜單來了!
    在Excel表格中設置下拉菜單很簡單,但帶模糊查詢的你見過嗎?
  • 超級實用的查詢表,快來學!VLOOKUP函數製作員工信息查詢表
    之前我有分享過這類的Excel查詢表的模板下載,不記得大家是否還有記得。
  • 如何用VBA代碼查詢兩列數據差異?
    今天和大家分享的內容是如何用VBA代碼查詢兩列數據差異?如上圖所示,查詢A列和C列的數據,提取出相同值、A列存在C列不存在的值、A列不存在C列存在的值……當然,這事兒並不是一定得用VBA,函數和Power Query都可以的。
  • Excel VBA 實例(22) - 一鍵篩選其他工作表或工作簿的數據
    今天說的這個vba實例還是和學校有關。