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