1. 程式人生 > >EXCEL完成多條件多結果查詢&多行多列變一列

EXCEL完成多條件多結果查詢&多行多列變一列

    其實我本來對EXCEL是一竅不通的,直到我舅舅給了一串大概1500多行的藥品供應目錄讓幫他我查詢。當他告訴他們平時都是花1~2天人工填寫查詢的時候,我當時就驚呆了,心想EXCEL設計者肯定已經哭暈在廁所,大家竟然都不用便捷的公式來完成,於是乎我就開始上手了。  

   首先應該明確需求,擁有一個包含藥品名稱、規格、供應商、價格的資料庫A,表A如下。從表A中我們可以發現,同一藥品,同一規格具有多個供應商,所以這一定是一個多結果查詢。         需要根據醫院需求的藥品清單,補全一下清單表格B,表B如下。從表B中我們可以發現,B列所代表的通用名並不是該行資料的KEY,KEY是序列號,B列、C列、D列只不過是查詢條件之一而已,需要根絕名稱、劑型、規格等多個條件來查詢企業資訊、報價資訊等。所以這是一個多條件查詢過程。

        以上我們明確了本次任務是完成多條件多結果查詢,首先應該建立一新的工作環境(Work Space),簡單的說就是新建一個EXCEL檔案,並把兩張表匯入Sheet1、Sheet2分頁中去,這樣方便引用,是個良好的習慣。匯入方法如下,右擊左下角的Sheet1分頁,選擇移動或複製 查詢     為了解決問題,我們先從簡單的方面入手,多條件多結果查詢首先需要完成查詢的基本功能,查詢所用的函式一般是VLOOKUP,意思是在一列(vertical)中找到(Look up)符合條件的第一個值並返回,語法規格為                         =VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
譬如=VLOOKUP($O4,Sheet3!$H:$I,2,0),其中$O4表示查詢內容是O4單元框的內容,查詢範圍是Sheet3!$H:$I,即表二的H到I列,2表示查詢到相應行之後,返回O列右邊第二列的內容,0是查詢型別。符號$表示固定,因為隨著公式下拉,數字4會依次增加,變為O4,O5,O5,而隨著右拉列號會依次增加,變為O4,P4等,符號$的左右就保證右拉時列號O不會改變。 多條件查詢      當查詢結果為多個時,我們首先的想法可能是按照C語言,使用&符號,當然,可是肯定行不通的。正統方法是利用陣列,這種方法先不理它...     另一種方法更直接一些,建立一個輔助列,將多條件化為單條件,設需要滿足的條件是E3、F3,我們只需要建立輔助列,令他的值為=E3&F3,滿足該輔助列的單一條件就能實現滿足多條件的需求。如下圖所示例如H列,令H2=A2&C2,建立輔助列,對H列查詢就能滿足多條件查詢的需求。


多結果查詢       但是適用VLOOKUP函式只能返回第一個結果,不符合多結果查詢的要求。為了解決多結果查詢,我們需要適用INDEX   SMALL  IF 組合函式。通過IF條件語句,遍歷找到所有符合條件的行,並返回該行的序號                        =IF(Sheet2!$E2:$E1335=Sheet1!$F3,ROW(Sheet2!$E2:$E1335),4^8)  其中Sheet2:$E2:$E1335=Sheet1!$F3是判斷條件,在表二的E列中,找到等於表一中F3單元格內容的行,返回行號ROW(Sheet2!$E2:$E1335),否則返回4^8=65535數值。找到所有符合條件的結果後,將他們排序,並按照行輸出(右拉)  =INDEX(Sheet2!$G:$G,SMALL(IF(Sheet2!$E2:$E1335=Sheet1!$F3,ROW(Sheet2!$E2:$E1335),4^8),COLUMN(A1)))&""      其中SMALL僅僅對所有結果從小到大排序,而INDEX則將結果一一輸出,按列輸出COLUMN,按行輸出則是ROW。先做個小實驗,如下圖。在A列中查詢C1=1的值,D1輸入公式=INDEX($B:$B,SMALL(IF($A$1:$A$1000=$C1,ROW($1:$1000),4^8),COLUMN(A1)))&"",輸入後按下CRTL+ENTER(使結果為陣列),再右拉可以得到結果。
      將這種方法運用到藥品企業價格查詢的例項中去,如下圖所示,這裡只右拉了3格,最多顯示了3家企業,O列為條件查詢輔助列,P~R為相應的企業,S~V為相應的價格。至此我們完成了多條件和多結果的查詢。收尾工作需要把輔助列刪除,並且把得到的結果賦值-選擇性貼上-數值,以防移動後出現沒有reference的情況。

多行多列變一列 開開心心地把這個表格交給我舅舅,準備聽幾句誇獎的話,結果他說不行啊,這不同企業和價格必須在一列顯示啊,這樣才方便比對價格作出選擇。於是我就愁了,要怎麼才能把這種多行多列的資料變為一列呢?解決辦法當然是有的。使用OFFSET函式 =OFFSET(($U$3),INT((ROW(A1)-1)/4),MOD(ROW(A1)-1,4)) 其中4代表了多行多列中的列個數,我最後每種藥品最多列出4家供應商,對於使用者請按自己情況改變該數字,$U$3是多行多列的最左上角數值。運用到我們得例項中去,其中I~L是多行多列矩陣,在F3中輸入公式並下拉,得到一列。

每行增加行        因為一種藥品對應了4家供應商,所以每種藥品必須佔4行,才能和上訴的一列正確對應上,這時我們需要使原有的每行間隔三行。這種苦力活當然不可能一個個增加,必須是批量操作的。        這種方法可以按照下圖的輔助列排序方法,最後一步用的是快捷鍵排序,沒顯示出來,這種方法適合每行空多行。
或者是      我用的方法是如下建立輔助列,定位空值後插入行,當然還是前兩種比較好。



最後應用到例項中,得到結果
      把之前多行多列變一列得到的4個為一組的單列複製到後面一行,就能得到最終的結果 刪除空白行      許多沒有供給公司和藥品序號的行就是完全的空白行,這些影響觀看,需要刪除,建立輔助列,判斷A和F同時為空時,賦值#N/A,CRTL+F替換#N/A為空值,F5定位空值,刪除空值,可以達到要求,最終結果如下