1. 程式人生 > >sumproduct多條件求和經典問題(乘號和逗號)剖析

sumproduct多條件求和經典問題(乘號和逗號)剖析

iamlaosong文

SUMPRODUCT函式的含義為在給定的幾組陣列中,將陣列間對應的元素相乘,並返回乘積之和。按我的理解就是兩個以上的陣列乘積之和。例如,公式為:=SUMPRODUCT(A2:A4, B2:B4)就相當於=A2*B2+A3*B3+A4*B4,兩個區域用逗號隔開,不過用乘號也是沒有問題的。似乎也只有這個函式才有這種對應元素之間先行捉對計算的功能。

1、條件求和時條件區域與求和區域之間可以用逗號,也可以用乘號,因為無論是逗號還是乘號,都是將陣列中對應元素相乘,再取乘積之和。但是,條件之間是必須用乘號的,如果用逗號則得到錯誤結果。例如,公式為:=SUMPRODUCT((A2:A9=A3)*(B2:B9=B3)*C2:C9)也可以寫成:=SUMPRODUCT((A2:A9=A3)*(B2:B9=B3), C2:C9),如果寫成:=SUMPRODUCT((A2:A9=A3), (B2:B9=B3), C2:C9),則結果錯誤

,為什麼呢?

首先我們把上面的問題簡化,假定每個陣列只有一個值,我們看看計算結果,即:

SUMPRODUCT({TRUE}*{TRUE}*{8})=8

SUMPRODUCT({TRUE}*{TRUE}, {8})=8

SUMPRODUCT({TRUE}, {TRUE}, {8})=0

注意,上面的公式中大括號表示一個數組,SUMPRODUCT函式處理每一個引數陣列的的元素時,其中的非數值型值(文字、邏輯)是作為0來處理的,所以用逗號分隔時結果為0,如果用乘號,{TRUE}*{TRUE}作為一個表示式先行計算,其計算結果是1(按true=1,false=0計算)。

2、條件求和時,如果求和區域出現文字型值,則必須用逗號,用乘號則報錯,我們看一下計算結果,即:

SUMPRODUCT({TRUE;FALSE}*{TRUE;TRUE}, {8;”song"})=8 

SUMPRODUCT({TRUE;FALSE}*{TRUE;TRUE}*{8;”song"})=#VALUE! 

同上,因為陣列區域中的文字資訊是作為0來處理的,所以第一個公式得到正確的結果。第二個公式因為要先計算表示式的值,所以碰到了文字作為乘數的情況,所以結果會報錯。

對於以上不同的公式寫法,可以用“公式求值”來看看公式的運算情況,從而探知為什麼會出現這樣的結果。

綜上所述,SUMPRODUCT函式各陣列間儘量用逗號隔離,條件求和的標準寫法應該是:

SUMPRODUCT((條件1)*(條件2)*(條件3)*…*(條件n), 

求和區域)