2015-04-16 61 views
1

我正在嘗試查找列表中可以包含一個或多個值的第一個負數。我正在使用索引/匹配。當範圍(或名稱引用)有兩個或更多個單元格時,它會正確找到該值。但是,當範圍只有一個單元格時,它會失敗。Excel索引+匹配失敗的單個單元格區域

如 列K1和K2 Excel中的數據是-10.00和20.00,分別

當我嘗試以下,但如預期

=INDEX(K1:K2, MATCH(TRUE,K1:K2<0,0),) 

但是返回-10.00,當我搜索只剩一格範圍,它會以「#N/A」失敗。我預計它會返回-10.00。

=INDEX(K1:K1, MATCH(TRUE,K1:K1<0,0),) 

使用包含單個單元格的命名引用時會發生同樣的問題。

非常感謝

+0

請參閱本【答案】(http://stackoverflow.com/questions/18991351/excel-return-the-first-negative-number-of-a-column)。 –

+0

建議的解決方案僅適用於範圍內有多行的情況。我想了解爲什麼這些公式在單行範圍內失敗。'= INDEX(範圍,MATCH(TRUE,範圍<0,0))' – stuon

回答

4

這是一個非常有趣的問題,需要相當技術性的答案。

基本上,MATCH要求lookup_array屬於某個「類型」。這並不是說這個數組不能只包含單個元素(它可以),而是它的形式與MATCH期望傳遞其第二個參數的形式兼容。

而這種可接受的形式可以是一個值的數組,也可以是對工作表單元格(連續)一維範圍的引用。

當您執行:

=INDEX(K1:K2,MATCH(TRUE,K1:K2<0,0),)

被解析爲:

=INDEX(K1:K2,MATCH(TRUE,{TRUE;FALSE},0),)

等等查找數組,即:

{TRUE;FALSE}

是一個數組,即可接受的形式。

然而,當執行:

=INDEX(K1:K2,MATCH(TRUE,K1:K1<0,0),)

然後這個解析爲:

=INDEX(K1:K2,MATCH(TRUE,TRUE,0),)

和此時的查找_數組(TRUE)是單個布爾值,其不符合該參數類型的要求。

我們可以,但是,人爲脅迫該單一值,以便是正確的類型,即:

=INDEX(K1:K2,MATCH(TRUE,IF({1},K1:K1)<0,0),)

此時間解析爲:

=INDEX(K1:K2,MATCH(TRUE,{-10})<0,0),)

這是:

=INDEX(K1:K2,MATCH(TRUE,{TRUE},0),)

現在,單個布爾在技術上是數組的一部分(儘管只包含一個值),上面的解決方案可以根據需要進行解析。

作爲此行爲的另一示例,假設單元格A1包含值1。然後:

=MATCH(1,A1,0)

正確返回1,因爲,即使查找_數組是這裏的單 細胞,它(就像所有的工作表範圍一樣)仍然是技術上的數組類型。

但是,如果我們做一個小的變化,如:

=MATCH(1,N(A1),0)

那麼,即使這解析爲:

=MATCH(1,1,0)

,因此它會出現什麼都沒有事實上,通過將範圍參考A1「取消引用」到它的實際值,我們現在已經改變了它的無效類型lookup_array,以上因此導致錯誤。

MATCH的這種行爲在我看來最多不一致,最壞的情況是設計錯誤。

的結果:

=INDEX(K1:K2,MATCH(TRUE,K1:K1<0,0),)

是:

=INDEX(K1:K2,MATCH(TRUE,{TRUE},0),)

沒有我們具有通過附加的,人工的方法將其轉換。

由於某些原因,如果要傳遞的數組僅包含一個值,那麼該值首先被「解析」爲非數組類型,與那些包含多個值的數組不同,數組類型被保留。

問候

+0

謝謝你的詳細解釋。這是一個有趣的。 – stuon

+0

不客氣! –

相關問題