如何加總平行四邊型範圍的數字

加總平行四邊型範圍內的數字

這是一位朋友來問我的問題,我覺得很有挑戰性,就花了一點時間思考一下。
有沒有什麼簡便的方法,來加總平行四邊型範圍內的數字呢?

此圖為要分別加總的範圍示意圖

上圖為改編自真實案例的概念示意圖。
我試了四種方法,但沒有一種是讓我覺得足夠優雅的。不過仍然全數列在下面供大家參考。
也歡迎提供更漂亮的方法。

以下每一個方法都會附上一格公式範例。細節則請參考完整範例檔

若您需要類似的公式教學,歡迎參考 亨利羊 Excel 教學服務 / 檔案外包服務

方法一 簡單粗暴的手動SUM

使用SUM函數,並且手動慢慢把要加總的範圍填入函數的引數中。
這種方法給人帶來一種勤勞的美感。
而且如果要框選的範圍不大,這樣做確實可以比寫複雜的公式要快得多。

=SUM('raw data'!B2:B13,'raw data'!C2:C12,'raw data'!D2:D11,'raw data'!E2:E10,'raw data'!F2:F9,'raw data'!G2:G8,'raw data'!H2:H7,'raw data'!I2:I6,'raw data'!J2:J5,'raw data'!K2:K4,'raw data'!L2:L3,'raw data'!M2)

方法二 線性規劃

類似中學數學的線性規劃,用二元一次方程式的概念把我們要加總的區域表達出來。然後用SUMIFS函數,針對符合條件的儲存格做加總。
因平行四邊型有四個邊,每個邊都可以用一條方程式來表達。每一條方程式就是一個條件,所以每個SUMFIS的公式裡都會用到四個條件。
此方法不需要任何計算輔助區,也不受限於欄/列的名稱格式,純粹以幾何概念對平行四邊型的範圍做加總。

(提醒:此為陣列公式,需按Ctrl + Shift + Enter以完成輸入)

{=SUM(range*
((ROW(range)+COLUMN(range))>IFERROR((RIGHT(A$10,4)-2012),-1)*12+15)*
((ROW(range)+COLUMN(range))<=(RIGHT(B$10,4)-2012)*12+15)*
(COLUMN(range)>IFERROR((LEFT($A10,4)-2012),-1)*12+13)*
(COLUMN(range)<=(LEFT($A11,4)-2012)*12+13))}

方法三 另開計算輔助區,把邏輯藏在數字裡

另闢一區與原始資料範圍1:1的計算輔助區,在輔助區做判斷,在原始資料區做加總。
陣列公式有其侷限性,沒辦法直接把這個概念直接濃縮實作在目標儲存格中,不得已只好多開一個輔助區。
而要用在SUMIFS中的陣列又有其侷限性,諸如ROUND、LEFT、RIGHT等等基本的函數都很難塞得進去。不得已之下,我用了比較迂迴的方式把邏輯藏在簡單的數字裡。
簡單來說,小數點左邊的整數對應的是加入起始月的年份。小數點後四位代表的是該格所代表的當下年份
例如下圖B14儲存格的2012.2013000,即代表此格的加入起始月是2012年,而此格代表的當下年份為2013。

=SUMIFS(range,
ref,">="&LEFT($A19,4),
ref,"<"&LEFT($A19,4)+1,
ref,">="&LEFT($A19,4)&"."&RIGHT(B$18,4),
ref,"<"&LEFT($A19,4)&"."&RIGHT(B$18,4)+1)

輔助區公式示例:

=LEFT(B$1,4)+LEFT(B$1,4)/10000+((RIGHT($A2,2)-1)/12/10000)+((RIGHT(B$1,2)-1)/12/10000)

方法四 另開計算輔助區,把平行四邊型平移調整成矩型

另闢一區輔助區,在輔助區對原始資料的各欄列做平移,把平行四邊型改換成同面積的矩型再做加總。

=SUM(OFFSET(ref_2!$B$2,
(RIGHT(B$26,4)-2012)*12,
(LEFT($A27,4)-2012)*12,12,12))

輔助區公式示例:

=IF(ISNUMBER(OFFSET('raw data'!B2,-(COLUMNS($B:B)-1),0)),OFFSET('raw data'!B2,-(COLUMNS($B:B)-1),0),0)

範例下載

完整範例檔