在函式清單裡會看到一批長得很奇怪的函式:ADD、MINUS、MULTIPLY、DIVIDE,意思跟你天天在打的 +、-、*、/ 一模一樣。
坦白說,我自己在一般的公式裡幾乎不會寫 ,直接寫 短得多。它們存在的理由是:有些地方只吃「函式」,不吃符號。這篇把八個對應的函式整理一遍,也講清楚什麼時候才值得寫成函式。
後面的例子都用這張小表,A 欄是品項,B 欄是實際賣出的杯數,C 欄是目標杯數,D 欄是單價:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 品項 | 實際 | 目標 | 單價 |
| 2 | 蘋果紅茶 | 37 | 40 | 45 |
| 3 | 青茶 | 112 | 100 | 35 |
| 4 | 烏龍茶 | 8 | 10 | 40 |
| 5 | 蘋果綠茶 | 53 | 50 | 50 |
| 6 | 檸檬紅茶 | 26 | 30 | 55 |
| 7 | 桂花烏龍 | 91 | 80 | 60 |
| 8 | 熟成紅茶 | 14 | 15 | 48 |
怎麼選
| 函式 | 等同的寫法 | 參數 |
|---|---|---|
ADD | + | 2 個 |
MINUS | -(相減) | 2 個 |
MULTIPLY | * | 2 個 |
DIVIDE | / | 2 個 |
POW | ^ | 2 個 |
UMINUS | 前面的負號 | 1 個 |
UPLUS | 前面的正號 | 1 個 |
UNARY_PERCENT | 後面的 % | 1 個 |
兩件事先記著,後面每個函式都適用:
- 它們全部都只吃固定個數的參數。
ADD只能加兩個數,想加一排請用SUM,不要寫成ADD(A1, A2, A3)。 - 什麼時候用函式、什麼時候用符號:平常算式用符號。需要把「加法」本身交給別的函式,例如
REDUCE、MAP的LAMBDA裡,或是想讓一長串巢狀公式的每一步都有名字時,才改寫成函式。
四則運算
ADD
傳回兩個數字的和,等於 +。
語法:
我想把 B2 的實際杯數加上 C2 的目標杯數,只是為了示範:
蘋果紅茶實際加目標
=ADD(B2, C2)手算 37 + 40 = 77,你應該會得到 77!
ADD 只收兩個參數。要加總 B2:B8 請用 SUM,或是在 REDUCE 裡把 ADD 當成累加的動作,這個用法在後面「要傳函式的地方」會講。
MINUS
傳回第一個數減第二個數,等於 -。
語法:
蘋果紅茶實際減目標
=MINUS(B2, C2)37 - 40 = -3,結果是 -3,代表差目標 3 杯。順序有差,MINUS(C2, B2) 就是 3 了。
MULTIPLY
傳回兩個數的乘積,等於 *。
語法:
蘋果紅茶賣了 37 杯、單價 45:
蘋果紅茶營業額
=MULTIPLY(B2, D2)37 × 45 = 1665,結果是 1665。
跟 PRODUCT 的差別是 PRODUCT 吃一整排數字,MULTIPLY 只吃兩個。
DIVIDE
傳回第一個數除以第二個數,等於 /。
語法:
達成率就是實際除以目標:
蘋果紅茶達成率
=DIVIDE(B2, C2)37 ÷ 40 = 0.925,結果是 0.925,把儲存格格式設成百分比就是 92.5%。
除數是 0 的話會得到 #DIV/0!,跟 / 一樣:
除以 0
=DIVIDE(B2, 0)這邊要記得,DIVIDE 不會幫你處理 0。要避開的話,外面包 IFERROR,或先用 IF 判斷除數。
次方
POW
傳回底數的次方,等於 ^。
語法:
2 的 10 次方
=POW(2, 10)結果是 1024。
POW 的作用跟 POWER 一樣,我個人會直接用 POWER,因為名字比較不容易被問「這是什麼」。POWER、^ 與開根號的 SQRT 在 數學基礎函式整理 有講過,這邊不重複。
正負號與百分比
UMINUS
把數字的正負號互換,等於在前面加上負號。
語法:
差距反號
=UMINUS(MINUS(B2, C2))MINUS(B2, C2) 是 -3,反號之後得到 3。直接對儲存格也可以, 會得到 -37。
UPLUS
傳回原本的數字,什麼也不做,等於在前面加上正號。
語法:
正號
=UPLUS(B2)結果是 37。這個函式我完全想不到實際用途,應該只是為了讓運算子都有對應的函式。放在這裡當作補齊的小知識。
UNARY_PERCENT
把數字當成百分比,傳回除以 100 之後的值,等於在數字後面加上 %。
語法:
把 37 當成 37%
=UNARY_PERCENT(B2)結果是 0.37。官方範例是 UNARY_PERCENT(100) 等於 1,同一個意思。
公式裡直接寫 37% 的效果就是這個。要注意它傳回的是 0.37 這個數字,儲存格看起來是不是「37%」是格式的事,這個差別在 儲存格的值與顯示格式 有詳細講。
要傳函式的地方
回到一開始的問題:為什麼需要這些函式?
MAP、REDUCE 這類函式要你交給它「每一筆資料要做什麼事」,而這件事寫在 LAMBDA 裡。裡面當然可以直接寫 a-b,但寫成 MINUS(a, b) 也完全一樣,有人覺得這樣讀起來比較像一個動作。來看一個例子,每個品項的實際減目標:
用 MAP 算每個品項的差距
=MAP(B2:B8, C2:C8, LAMBDA(a, b, MINUS(a, b)))會得到 -3、12、-2、3、-4、11、-1 這七個數字,往下溢出。
累加則是 REDUCE 的主場,把 ADD 放進累加動作:
用 REDUCE 加總實際杯數
=REDUCE(0, B2:B8, LAMBDA(acc, x, ADD(acc, x)))37 + 112 + 8 + 53 + 26 + 91 + 14 = 341,結果是 341。
不要因為 ADD 剛好吃兩個參數,就直接把內建函式名放進 REDUCE 的最後一個引數。直接傳 ADD 會回 #N/A,明確包成 LAMBDA(acc,x,ADD(acc,x)) 才會得到 341。
若要把具名函式傳進去,先真的建立,不能只抄一個尚未定義的名字:
- 開「資料」>「已命名函式」>「新增」,函式名稱填
MRSHEET_ADD。 - 依序新增引數預留位置
sum、value,公式定義填 。這裡的 SUM 與 VALUE 是引數,不是帶括號的內建函式呼叫。 - 按「繼續」到預覽,再按「建立」。
建立後, 得到 3;把這個已建立的名稱交給 REDUCE,七筆同樣得到 341。這是具名函式符合引數規則的例子,不代表內建 ADD 名稱可以直接代入。
REDUCE 官方說明允許 LAMBDA 或符合引數規則的具名函式;這不等於任意內建函式名都可直接代入。本篇保留明確的 LAMBDA(acc,x,ADD(acc,x)) 寫法。
再來一個混合的例子,七個品項的總營業額,也就是每一個品項的杯數乘上單價之後再加起來:
用 MAP 與 MULTIPLY 算總營業額
=SUM(MAP(B2:B8, D2:D8, LAMBDA(q, p, MULTIPLY(q, p))))1665 + 3920 + 320 + 2650 + 1430 + 5460 + 672 = 16117,結果是 16117。
說實話,這題直接寫 更短。這邊只是示範函式版寫法怎麼接。需要 MAP 的時候,通常是每一筆要先經過很多步驟,才用得到這種寫法。
看到別人用的時候
這八個函式我幾乎都直接寫符號,要算次方才用 POWER。看到它們出現在別人的公式裡,你知道它等於符號就夠了。需要查的時候回來看一眼,就這樣!
接下來可以
相關文章
查看所有文章數學基礎函式:MOD、ABS、POWER、SQRT、SIGN、PRODUCT、ISEVEN 與 ISODD
整理 MOD 餘數(含負數與除以 0)、ABS 絕對值、POWER 與 ^ 次方、SQRT 開根號、SIGN 正負號、PRODUCT 連乘、ISEVEN 與 ISODD 奇偶判斷的語法與例子,並附隔列標記、時間換算、誤差總和、兩點距離與連續成長率的實例。
LAMBDA 與 LET 基礎:自訂函式、MAP 與 REDUCE
用 LET 幫重複出現的算式取名字,用 LAMBDA 自己定義函式並存成具名函式,再搭配 MAP 一格一格套用、用 REDUCE 一路累計成一個值,附 BYROW、BYCOL、SCAN、MAKEARRAY 的最短介紹。
數字捨入函式參考:ROUND、INT、TRUNC、CEILING、FLOOR 與負數的方向
ROUND、ROUNDUP、ROUNDDOWN、INT、TRUNC、CEILING、FLOOR、MROUND、CEILING.MATH、FLOOR.MATH、CEILING.PRECISE、FLOOR.PRECISE、ISO.CEILING、ODD、EVEN 共 15 個捨入函式的語法與例子,並整理負數時各函式往哪個方向走,以及用 ROUND 收掉浮點誤差。
留言討論
共 0 則留言
