數據查詢是Excel數據處理中的一項核心業務,也是日常辦公中使用頻率非常高的一項操作。數據查詢業務需求多,而且具有較強的技巧性,因此它也是職場必學的一門技能。
本篇文章從最基本的數據查詢的概念講起,逐一介紹數據查詢的各種應用場景,及其相應的查詢方法,并深入分析每種查詢方法的特點和注意事項,
本文所說的“查詢”與普通的“查找”不用。“查找”就是簡單的匹配問題,而“查詢”則是根據條件去匹配結果,是間接的、更高級的查找。舉個例子,比如在下表中需要查找“趙月琴”老師有哪幾場監考,可以按CTRL+F鍵,調出【查找與替換】窗口,點擊【查找全部】即可找出所有包含關鍵字“趙月琴”的單元格。
圖1
比如在下表中需要根據考號,查找對應學生的姓名信息,可以使用VLOOKUP函數查詢。這里查找的不是考號,而是與考號相關聯的姓名信息!
圖2
我們可以根據查詢的條件與結果,將查詢操作分為不同的類別。
根據是否精確匹配條件,可將查詢操作分為精確查詢與模糊查詢;根據條件與結果數目,可將查詢操作分為一(條件)對一(結果)查詢、多對一查詢、一對多查詢、多對多查詢;根據數據搜索方向,可將查詢操作分為正向查詢與反向查詢。
以上分類主要針對使用函數與公式進行查詢的操作,除此之外還可以用Excel VBA進行查詢。
圖3
1. 精確查詢與模糊查詢
(1)精確查詢:精確匹配查詢條件,返回一個或多個結果。
圖2所示用VLOOKUP函數根據學生考號,查詢對應姓名,這樣的查詢即為精確查詢。能夠進行精確查詢的函數或公式非常多,最常用的是LOOK系列函和INDEX+MATCH函數組合,甚至是IF+SMALL+INDEX等函數組合也能做到。
(2)模糊查詢:根據條件進行模糊匹配,返回一個或多個結果。
一般采用通配符?和*進行模糊查詢。比如“馬*”可以匹配所有以“馬”開頭的字符串,比如“馬婭婭”、“馬學松”等;“*三*”可以匹配所有包含“三”的字符串,比如“高三7班”、“初三2班”等。
如下表所示,我們可以根據“馬*”查找第一個姓馬的學生對應的班級。
圖4
2. 多(單)條件與多(單)結果查詢
(1)一對一查詢:根據一個條件查詢出唯一的結果。
這種查詢方式是日常工作中所見最多的,但這種查詢要求查詢條件在對應查詢區域是唯一的,比如身份證號、學號等均可作為查詢條件。我們結合實例來看看常見的一對一查詢函數或公式有哪些。
查詢任務:根據下圖所示的考場安排表,查找G2單元格對應考號的學生姓名。
方法1:LOOKUP(查詢值,查詢區域,返回值區域)
LOOKUP函數是最簡單,但同時也是最強大的查詢函數,上式是其最簡單的一種用法。我們在H2單元格輸入如下公式。
公式在A1:A11區域查詢G2單元格對應值,發現在第5行,因此返回D1:D11區域的第5行單元格的值,為“陳衍林”。
圖5
方法2:VLOOKUP(查詢值,查詢區域,返回查詢區域第幾列值,0)
用VLOOKUP函數進行查詢需注意,查詢值必須在對應查詢區域的第1列(即由前到后查詢),而且第3個參數對應的數值表示的不是工作表的第幾列,而是對應查詢區域的第幾列。
如下圖所示,在H2單元格輸入如下公式。
=VLOOKUP(G2,A1:E11,4,0)
公式非常容易理解,在A1:E11區域查找G2單元格對應的值,發現在第5行,因此返回此區域第4列第5行單元格的值,為“陳衍林”,采用的是精確匹配模式。
圖6
方法3:INDEX(返回值區域,MATCH(查詢值,查詢區域,0))
INDEX+MATCH是查詢操作中的“黃金組合”,可完成各種各樣的查詢,功能十分強大!
如下圖所示在H2單元格輸入如下公式。
公式中先用MATCH函數查詢G2單元格對應的考號在A1:A11這一列的第幾行,采用的是精確匹配模式,發現在第5行。然后用INDEX函數返回D1:D11這一列數據第5行對應單元格的值,為“陳衍林”。
圖7
(2)多對一查詢:即查詢同時滿足多個條件的的數據,并返回唯一的結果,俗稱“多條件查詢”。
查詢任務:根據下圖所示的考場安排表,查找考場為“高三6”同時座位號為7的學生姓名。
方法1:LOOKUP(1,0/(條件1*條件2*...*條件n),返回值區域)
這個公式俗稱多條件查詢的萬金油公式,可以滿足任意多個條件的查詢(自然也可用作一對一查詢)。這個公式很多初學者朋友很不理解,下面我們結合實例來具體講一下。
如下圖所示,我們在I2單元格輸入如下公式。
=LOOKUP(1,0/((G2=B1:B11)*(H2=C1:C11)),D1:D11)
圖8
LOOKUP函數有一個特點,就是如果找不到查詢值,則返回查詢區域中小于或等于查詢值的最大值。根據LOOK函數的這個特點,我們用G2=B1:B11返回的是一個數組。
我們可以選中公式中的這一部分,然后按F9顯示結果,如下圖所示。
圖9
同理,H2=C1:C11也返回一個數組,然后兩個數組相乘,TRUE和FALSE在計算式會轉化為1和0,因此(G2=B1:B11)*(H2=C1:C11)最終返回的結果為:
{0;0;0;0;0;1;0;0;0;0;0}
即只有第6個數據為1,其余全部為0。然后用0去除這個數組,因為0除0會得到錯誤,0除1為0,因此0/((G2=B1:B11)*(H2=C1:C11))返回的數組只有第6個數據為0,其余全是錯誤值:
然后在上面這個數組中查詢數值1,顯然查詢不到,因此返回小于等于1的最大值,即0,其所在位置第6行!最后取D1:A11區域的第6行單元格對應的值,為“馬婭婭”!
方法2:“VLOOKUP+輔助列”也可進行多條件查找
“VLOOKUP+輔助列”的方法雖然稍顯麻煩,但也可進行多條件查詢,尤其是對于新手朋友來說,VLOOKUP函數掌握的比較牢,希望借助其解決多條件查詢問題。
如下圖所示,我們在第一列插入一個輔助列,將C列數據和D列數據用&符號連接成為一個新的字符串。然后在J2單元格輸入如下公式。
=VLOOKUP(H2&I2,A1:F11,5,0)
公式其實是在A1:F11區域搜索“高三67”這個字符串(由H2和I2拼接而成的)的位置,發現在第6行,因此返回此區域第5列第6行單元格的值,為“馬婭婭”。
圖10
(3)一對多查詢:查詢滿足一個條件的多個結果,返回多條記錄。
查詢任務:查詢所有座位號為7的學生姓名。
首先得建立一個輔助列,統計座位號7第幾次出現,然后用VLOOKUP或者INDEX+MATCH等都可以查詢出多條記錄。
建立輔助列是一對多查詢的關鍵,我們在第1列建立輔助列,在A2單元格輸入如下公式,并雙擊向下復制至A11單元格。
公式很簡單,D2=$H$2判斷D2是否與H2(座位號7)相等,返回TRUE或FALSE,N(A1)返回A1單元格對應的值(為0)。當公式向下復制的時候,$H$2采用絕對引用,不會發生改變,而D2和A1會逐漸變成D3、D4....D11和A1、A2...A10,因此得到的結果即為座位號7第幾次出現。
圖11
然后,我們就可用VLOOKUP或者INDEX+MATCH等查詢結果。以VLOOKUP函數為例,在I2單元格輸入如下公式,并向下復制至i11單元格。
=IFERROR(VLOOKUP(ROW(A1),$A$1:$F$11,5,0),'')
注意公式中的查詢區域$A$1:$F$11必須采用絕對引用方式,否則在向下復制的過程中就會改變。公式巧妙之處在于不是直接查詢座位號7,而是在輔助列查詢1、2、3等數字(ROW(A1)的返回值),返回匹配的第一個數據,藉此找到查詢區域第5列對應單元格的值。
圖12
這里的IFERROR函數是為了屏蔽查詢不到產生的錯誤值。
如果使用INDEX+MATCH組合查詢的話,對應I2單元格的公式則為:
如下圖所示。注意公式中的兩個絕對引用方式不能變。
圖13
那如果不建立輔助列,能不能進行一對多查詢呢?答案是肯定的!只是需要借助更加復雜的公式組合。如下圖所示在H2單元格輸入如下公式,然后按CTRL+SHIFT+ENTER組合鍵確定輸入,因為這是一個數組公式。
=IFERROR(INDEX($D$1:$D$11,SMALL(IF($C$1:$C$11=$G$2,ROW($A$1:$A$11)),ROW(A1))),'')
然后雙擊向下復制至H11單元格即可。
圖14
這個公式組合相當巧妙,下面簡單做一說明。
首先用IF($C$1:$C$11=$G$2,ROW($A$1:$A$11))逐個判斷C1:C11這一列數據是否和G2相等,如果相等則返回對應行號,我們選擇這部分公式按F9鍵顯示結果為:
發現只有6和8,其余均為FALSE,表示只有在第6行和第8行找到了座位號7。
然后用SMALL函數查找第1、2、3...最小值,因為數值數據都是小于邏輯值FALSE的,因此SMALL(...,ROW(A1))返回的是第一個最小值,為6,SMALL(...,ROW(A2))返回的是第二個最小值,為8。因此最后用INDEX函數就可查詢到對應第6行和第8行數據!
(4)多對多查詢:根據多個條件查詢多個結果。
這種查詢方式是多條件查找和一對多查詢的結合,有了前面的基礎,對于多對對查詢就不難理解了。
查詢任務:根據下圖所示的考場信息表,查詢高三6班考場所有的3班學生。
我們在I2單元格輸入如下數組公式,并用CTRL+SHIFT+ENTER鍵確定輸入,然后向下復制至I11單元格。
=IFERROR(INDEX($D$1:$D$11,SMALL(IF(($B$1:$B$11=$G$2)*($E$1:$E$11=$H$2),ROW($A$1:$A$11)),ROW(A1))),'')
大家發現了嗎?我們只是將上一個公式的IF條件判斷,由單條件變成了多條件而已($B$1:$B$11=$G$2)*($E$1:$E$11=$H$2),其他的部分是一致的。如下圖所示。
圖15
我們當然也可以像上面“多對一查詢”一樣借助輔助列,然后用VLOOKUP函數或者INDEX+MATCH組合進行多對多查詢!
3. 正向查詢與反向查詢
這兩種查詢方式的區別在于數據搜索的方向,比如根據考號查找姓名屬于正向查詢,根據姓名查找考號則屬于反向查詢。截止此處,以上案例均為正向查詢!
VLOOKUP函數就是一個典型的默認情況下,只支持正向查詢的一個函數,它要求查詢值必須在查詢區域的第一列。而其他的查詢函數則沒有這個限制,不管查詢值與查詢區域誰前誰后,比如LOOKUP函數、INDEX+MATCH函數組合。
下面重點舉例說說反向查詢。
查詢任務:根據姓名查詢對應考號信息。
以INDEX+MATCH組合為例,只需要在H2單元格輸入如下公式即可。
有了前文查找的基礎,相信大家對于這個公式應該很容易理解。
圖16
這里強調一點,雖然說VLOOKUP默認不支持反向查詢,但是我們卻可以通過數據重組的方式,間接地實現反向查詢。如下圖所示,我們在H2單元格輸入如下公式。
=VLOOKUP(G2,IF({1,0},D1:D11,A1:A11),2,0)
公式利用一個IF函數將D1:D11和A1:A11調整了前后順序,構建出了一個新數組,這個數組姓名在前、考號在后,然后就可以用VLOOKUP函數進行正向查詢,得到正確的結果!如下圖所示。
圖17
4. 使用Excel VBA進行復雜查詢
一些更加復雜的查詢方式很難通過函數或公式進行查詢,此時可以借助VBA,進行自定義查詢。比如我們現在需要查詢考場為“高三6”,座位號小于6,且班級為7或3的所有學生姓名。
我們按ALT+F11打開VBA代碼編輯窗口,新建一個模塊,并定義一個名為“FINDNAME”的過程。
最后運行此過程即可在G列列舉出所有滿足條件的結果。
圖18
更多關于VBA的查詢方法就不再贅述。
以上列舉了很多日常辦公中經常遇到的查詢問題,并詳細討論了每一種問題的可行方案,不管是用公式還是用VBA代碼,往往查詢方案不止一種,筆者也是盡量按由易到難的順序進行探討各種解決方案。
這里要強調的是,一方面,公式并不是越長就越好,就好比在進行“一對多查詢”時IF+SMALL+INDEX的方法雖然一步到位解決了問題,但是尤其對于初學者而言時很難一下就理解透徹的,因此INDEX+MATCH組合查詢方案是最好的選擇。
另一方面,我們為了敘述方便,在文中將查詢操作分為了好幾類,但實際上查詢操作往往是復雜的、多變的,需要結合多種方法綜合施策。希望大家能在以后的日常辦公中多多實踐,嘗試各種查詢方法,做到熟能生巧、舉一反三。