書接上回,開啟進階!
還是用昨天同一組示例數據,稍微變一下表現形式:
只不過,今天不用輔助列了,直接用一個公式,剔除指定姓名,寫出保留姓名與成績。
公式實現
在F2單元格輸入公式:
=IFERROR(INDEX(A$2:A$10,SMALL(IF(COUNTIF($D$2:$D$6,$A$2:$A$10),””,ROW($1:$9)),ROW(A1))),””),Ctrl+Shift+Enter結束公式輸入。
公式向下、向右填充,會得到剔除指定姓名以后,保留的姓名及對應成績。
如圖:
公式解析
COUNTIF($D$2:$D$6,$A$2:$A$10)
從D2:D5指定的要剔除的姓名區域,依次查找A1:A9所有姓名,查得到的返回1,查不到的返回0。所以此部分公式返回由1與0組成的數組:
{0;1;1;0;1;1;0;1;0 }
ROW($1:$9)
返回由1—9組成的數組:
{1;2;3;4;5;6;7;8;9}
IF(COUNTIF($D$2:$D$6,$A$2:$A$10),””,ROW($1:$9))
此部分公式原理用下圖解釋:
所以,本部分IF函數的返回值是數組:
{1;””;””;4;””;””;7;””;9}
SMALL(IF(COUNTIF($D$2:$D$6,$A$2:$A$10),””,ROW($1:$9)),ROW(A1))
ROW(A1)的返回值是1,所以,此部分是返回數組{1;””;””;4;””;””;7;””;9}的最小值,即1;公式每往下填充一行,ROW(A1)變為ROW(A2),ROW(A3),ROW(A4)……,此部分SMALL公式就會返回數組{1;””;””;4;””;””;7;””;9}的第2、3、4……小的數值,即4,7,9……;
INDEX(A$2:A$10,SMALL(IF(COUNTIF($D$2:$D$6,$A$2:$A$10),””,ROW($1:$9)),ROW(A1)))
公式在F2中,即是返回A2:A10區域中第1位的數據A1;公式往下填充,即返回A2:A10區域中第4、7、9位的數據A4、A7、A9,即得到了剔除指定姓名以后保留的姓名;
IFERROR(INDEX(A$2:A$10,SMALL(IF(COUNTIF($D$2:$D$6,$A$2:$A$10),””,ROW($1:$9)),ROW(A1))),””)
用IFERROR,如果查找到結果就返回值,如果查不到,出現錯誤,則返回空值。
保留成績的計算:
因為公式中的A$2:A$10,使用的混合引用,A列沒有鎖定,所以,向右填充,會自從變為B$2:B$10,也就是保留的B列的成績。