首頁>Club>
11
回覆列表
  • 1 # E圖表述

    學會Index+Small+Row的“萬金油”函式

    1、提取不重複的值

    還記得我們第二次陣列教學篇中的Small+Row函式的返回值嗎?如果忘記了,建議還是先點下面的連結看看。如果你還記得,可以忽略下方的連結繼續讀。

    千呼萬喚,“萬金油”函式終於登場了。這是一份模擬資料,

    如果我們現在需要統計各銷售員的銷售數量,常規來說,如果有了銷售員的明細,我們用Sumif函式就可以很方便地彙總出來銷售數量,但是我們可以看出,銷售員的姓名是無序而且重複的,如果不借助輔助列,我們就需要用到陣列函式來提取銷售員姓名的唯一值了。

    函式:單元格A12

    {=IFERROR(INDEX($B$2:$B$8,SMALL(IF(MATCH($B$2:$B$8,$B$2:$B$8,0)=ROW($B$2:$B$8)-1,ROW($B$2:$B$8)-1),ROW(A1))),"")}

    函式說明:

    利用Match函式找到第一次出現的值的行號,形成一個數組資料,再利用Small函式順序的找到出現的行號,用Index函式引用姓名,最後用Iferror函式遮蔽錯誤值。

    函式執行過程:

    2、提取重複值

    上面我們提取了不同姓名的銷售員,那麼我們如果要提取相同姓名的銷售員的銷售記錄又該如何呢?

    函式:單元格A12

    {=IFERROR(INDEX(A$2:A$8,SMALL(IF(COUNTIF($B$2:$B$8,$B$2:$B$8)=2,ROW($A$2:$A$8)-1),ROW(A1))),"")}

    函式說明:

    我們將第一例中的Match部分,替換上Countif函式,如果出現兩次就是我們需要的記錄了,其餘函式部分同上例。

    函式執行過程:

    3、提取滿足條件的明細

    還是上面的資料,這次我們來提取銷售員“趙”,賣的“中”碼貨物的明細。

    函式:單元格A13

    {=IFERROR(INDEX(A$2:A$8,SMALL(IF(($B$2:$B$8=$B$11)*($C$2:$C$8=$C$11),ROW($A$2:$A$8)-1,99^9),ROW(A1))),"")}

    函式說明:

    和上例不同的地方是,我們唯一改動的就是條件部分,用兩個條件相乘,我們要知道邏輯值是可以參與計算的,True=1、False=0,所以函式中的兩個條件相乘就形成了由0.1組成的陣列資料。剩下的運算道理和第一例完全一樣。

    函式執行過程:

    作者雲:

    強大的“萬金油”函式,其實也就是這些主要的功能了。本來還想舉幾個例子,但是除了條件變換了,其他的內容都是一樣的,而且有的例子沒有必要非使用“萬金油”函式,巧妙的使用其它函式結合陣列資料一樣可以達到效果。

  • 2 # 逸琛

    Excel裡有個號稱“萬能”的函式組合,這個函式組合就是INDEX+SMALL+IF,很多應用場合都能看到它們的身影。

    這個函式的特點是:能提取出滿足某條件或某些條件的所有資料,可以一次性返回單行單列或多行多列的結果。

    讓我們透過一個例項來認識一下它們到底有多“萬能”吧!

    1

    公式應用情景介紹

    如下圖,A1:F9單元格為某次考試結果,每個人一行資料。現在需要在B11單元格(棕色底色填充)輸入班級名稱,在A14:F21區域返回該班級所有學生考試成績資訊。

    本例假設需要查詢【1班】所有學生的成績。

    2

    解決問題思路分析

    我們的目的是要提取出A列班級名稱與B11單元格內容一致的所有資料,如果:1)能提取出符合條件的所有行數;

    2)這些行數能從小到大一個一個的輸出;

    3)可以從原始資料中按第2步輸出的行數把資料引用過來,那麼問題就解決了。

    恰好,在Excel中存在這麼幾個函式能達到目的,下面我們來逐個介紹。

    3

    如何提取出符合條件的所有行數?

    我們可以使用IF函式判斷來生成所有符合條件的行號陣列,如下:

    =IF($A$2:$A$9=$B$11,ROW($A$2:$A$9))

    $A$2:$A$9=B11判斷A列資料是否和B11單元格內容一致,會返回TRUE和FALSE的陣列。

    如果$A$2:$A$9=B11則返回A2:A9的行號,否則返回FALSE。

    本例生成的陣列為棕色部分(A2=1班,所以返回A2的行號2,以此類推),按F9可以看到如下陣列:

    {2;FALSE;FALSE;5;6;FALSE;FALSE;9}

    如果要滿足多個條件,可以用

    =IF((條件區域1=條件)*(條件區域2=條件2),ROW(區域))

    這種方式來實現,例如要返回【班級】為“1班”且【總分】>200的查詢結果,此部分可以改成:

    =IF(($A$2:$A$9="一班")*($F$2:$F$9>200),ROW($A$2:$A$9))

    4

    如何順序輸出上一步獲得的行號?

    由於上一步獲得的符合條件的行號陣列是數字和FALSE的組合,我們利用SMALL函式就可以逐步輸出符合條件的行號。

    舉例來說,SMALL({11,22,33},1)=11,也就是SMALL返回第一引數中第1(第二引數)小的數字。

    同理,SMALL({11,22,33},2)=22。

    為了下拉公式方便,我們一般用ROW()函式做SMALL的第二引數,保證下拉公式時自動提取第2小,第3小……

    也就是用:

    =SMALL(IF($A$2:$A$9=$B$11,ROW($A$2:$A$9)),ROW(A1))

    將第一步產生的陣列中符合條件的行號從最小的開始連續輸出。從下圖可以看到,符合條件的行號已經可以連續輸出了。

    錯誤值可以先不用關心,後面我們用其他函式遮蔽。

    5

    接下來,用函式提取資料

    最後一步提取資料可以選用的函式比較多,本例介紹INDEX函式方法。

    簡單說,INDEX函式可以實現從第一引數中提取出第二引數個數據的目的。

    例如:=INDEX({11,21,31},1)返回11,也就是從{11,21,31}提取第1個數字;=INDEX({11,21,31},2)返回21,也就是從{11,21,31}提取第2個數字。

    那麼,我們用(紅色部分是上一步SMALL函式,第一個返回值為2):

    =INDEX(A$1:A$9,SMALL(IF($A$2:$A$9=$B$11,ROW($A$2:$A$9)),ROW(A1)))

    就可以返回A1:A9中的第2個值,也就是第1個“1班”;下拉公式就返回了第2個“1班”……

    6

    完成階段

    我們把上一步的函式組合放在查詢結果區域的第一列,Ctrl+Shift+enter執行公式,並下拉,結果如下:

    這樣就獲得了班級的返回結果。

    後面要獲取姓名和各科成績等資訊怎麼辦呢?

    透過分析,我們知道了SMALL函式輸出的結果已經固定不變了,現在只需要改變INDEX函式引用的列即可。

    因此我們將INDEX函式的第一引數設定成了A$1:A$9【行絕對引用,列相對引用】,這樣,我們向右拉動公式就會自動變成B$1:B$9。

    完成效果圖如下:

    7

    遮蔽錯誤值

    可以看到上步產生的結果還有錯誤值存在,我們用IFERROR函式去遮蔽錯誤值,如果INDEX函式返回的是錯誤值,則在單元格返回空。

    =IFERROR(INDEX(A$1:A$9,SMALL(IF($A$2:$A$9=$B$11,ROW($A$2:$A$9)),ROW(A1))),"")

    這樣就最終完成了查詢功能的設定。

    補充說明

    一般還有用INDEX(大區域,SMALL(IF(條件區域=條件,ROW(條件區域),4^8),ROW(A1)))&""這種方式去遮蔽錯誤值,這種遮蔽錯誤值的思路是,如果條件區域=條件就返回條件區域行號,否則返回一個比較大的用不到的行號,比如說4^8行或資料區域下面的一個空行行號。這樣,INDEX在輸出完所有符合條件的行後開始呼叫4^8行的值(空單元格),為了避免返回0所以再加上一個&""。

    本例未使用此種方法,主要是由於後面要查詢的其他列有數字,用上述&""的方法數字會變成文字。

    如果有日期的時候,日期格式儲存的資料會變成一個數字。

  • 3 # EXCEL乾貨君

    萬金油函式?我最先想到的就是SUBTOTAL函式,這個函式基本包括了我們平常資料彙總中經常用到的計算方法,包括求和,求積,求平均,求最大最小值等等,可以說一個函式就頂替了sum、average、product、max、min等函式。並且並且他還可以選擇是否計算隱藏值,功能上又多了一個,所以我建議平常EXCEL用的多的人可以多多使用下這個函式,非常實用!

  • 中秋節和大豐收的關聯?
  • 有哪位大神評測一下新發布的中興天機Axon10pro,詳細介紹一下?