更新於 2024/10/15閱讀時間約 9 分鐘

AND、OR、NOT(二):實際應用

接續著上次的 AND、OR、NOT(一):多條件判斷,我今天想要實際舉個簡單的例子,帶大家了解怎麼實際使用這些函式。在這之前,我們小小複習一下它們是什麼:

ANDOR 的函式語法是一樣的:

=AND(條件一, [條件二], [條件三]...)
=OR(條件一, [條件二], [條件三]...)

把要判斷的條件放在括號裡面,並用逗號隔開。而 AND 跟 OR 的差異在於:

  • AND:只有全部條件為 TRUE,那結果才會是 TRUE
  • OR:只要任一條件為 TRUE,那結果就會是 TRUE

再來就是 NOT,語法也很單純,只要把會 TRUEFALSE 或會產生布林值的函式放在括號裡面即可:

=NOT(條件)

NOT的作用則是把布林值反轉,TRUE 變 FALSEFALSE 變 TRUE

好,我們開始囉!




AND、OR

歡迎先到這邊複製練習用的試算表,一起練習!

你是在烏石港經營某背包客棧的老闆,你打算用你們客棧現有的會員卡制度,推出一波行銷活動,吸引有卡的客人再回來你這住。

你想訂的規則是:

  • 有「衝浪之友」會員卡的客人,消費金額打 9 折
  • 有「海洋之友」會員卡的客人,消費金額打 9 折
  • 有兩張卡的客人,住宿金額打 8 折
  • 兩張卡都沒有,原價

你收到這樣的訂單資訊,要來結算每個客人折扣後的金額:

怎麼做呢?我們先檢視並統整一下:

  1. 有「衝浪之友」會員卡有「海洋之友」會員卡的客人,消費金額打 9
  2. 有「衝浪之友」會員卡有「海洋之友」會員卡的客人,消費金額打 8
  3. 兩張卡都沒有,也就是不符合以上條件的話,消費金額就是原價

第一個條件就是 AND 很好的應用方式:

AND(衝浪之友 =, 海洋之友 =)

第二個條件就是 OR 了:

OR(衝浪之友 =, 海洋之友 =)

再來可以用 IFS(多條件判斷),條列上面的兩個條件,並加上價格計算:

IFS(
AND(衝浪之友​ =, 海洋之友​ =), 原價 * 0.8,
OR(衝浪之友​ =, 海洋之友​ =), 原價 * 0.9)

最後,考量到這兩個條件如果都沒有符合,就會是第三個條件了。

因為 IFS 在沒達成條件時,會出現 #N/A 的錯誤,這時候就在外面再包一層 IFNA,處理這樣的狀況即可。(延伸閱讀: 處理錯誤的 IFNA 跟 IFERROR

IFNA(..., 原價)

所以結合起來就是:

=IFNA(
IFS(
AND(衝浪之友​ =, 海洋之友​ =), 原價 * 0.8,
OR(衝浪之友​ =, 海洋之友​ =), 原價 * 0.9),
原價)


那我們回到表格,把相對應的儲存格位址填入就好了。我們在 E2 寫上:

=IFNA(
IFS(
AND(C2 = "有", D2 = "有"), B2 * 0.8,
OR(C2 = "有", D2 = "有"), B2 * 0.9),
B2)

按下 Enter 看看:

以許先生的狀況來看,他的消費金額是 2500 元,有衝浪之友的會員卡、沒有海洋之友的會員卡,所以是打 9 折。那麽,他最後折扣後的金額就是:

2500 * 0.9 = 2250

看來試算表有把這個算式處理好了。我們再把它往下複製到最後一列:

這樣就做完了!保險起見,來驗證幾筆資料,看看金額有沒有錯誤:

  • 第三列的張小姐
    消費金額 1300 元,兩張會員卡都沒有,所以是原價,1300 元,正確!
  • 第九列的陳先生
    消費金額 2700 元,兩張會員卡都有,所以打八折(2700 * 0,8),折扣後金額是 2160 元,正確!




NOT

說實在,我個人不常用 NOT,因為通常我在寫條件判斷的時候,通常是用正面的角度想,也就是:

「如果 A 發生了就是 A 狀況、如果B發生了就是 B 狀況」

而很少以反面的角度想,像是:

「如果 A 沒發生就是 A 狀況、如果 B 沒發生了就是 B 狀況」

而我會用到 NOT 的少數狀況之一,大概是「想把一大串條件反轉」的時候。舉例來說,我在今年 7 月寫了一篇 條件式格式(二):自訂公式 的教學,在文章的最後,我試著用 Google 試算表來判斷身份證字號是否正確,寫了這串東西:

=AND(
IF(LEN(A1) = 10, TRUE, FALSE),
REGEXMATCH(LEFT(A1, 1), "[A-Z]"),
IFERROR(OR(VALUE(MID(A1, 2, 1)) = 1,
VALUE(MID(A1, 2, 1)) = 2,
VALUE(MID(A1, 2, 1)) = 8,
VALUE(MID(A1, 2, 1)) = 9), FALSE),
IFERROR(IF(MOD(SUM(
SWITCH(LEFT(A1, 1),
"A", 1, "B", 10, "C", 19, "D", 28, "E", 37, "F", 46, "G", 55,
"H", 64, "I", 39, "J", 73, "K", 82, "L", 2, "M", 11, "N", 20,
"O", 48, "P", 29, "Q", 38, "R", 47, "S", 56, "T", 65, "U", 74,
"V", 83, "W", 21, "X", 3, "Y", 12, "Z", 30),
VALUE(MID(A1, 2, 1)) * 8, VALUE(MID(A1, 3, 1)) * 7,
VALUE(MID(A1, 4, 1)) * 6, VALUE(MID(A1, 5, 1)) * 5,
VALUE(MID(A1, 6, 1)) * 4, VALUE(MID(A1, 7, 1)) * 3,
VALUE(MID(A1, 8, 1)) * 2, VALUE(MID(A1, 9, 1)) * 1,
VALUE(MID(A1, 10, 1)) * 1), 10) = 0, TRUE, FALSE), FALSE)
)

簡單來說,上面這串就是以 AND 判斷身份證字號是否正確的四個條件,簡化如下:

=AND(
條件一,
條件二,
條件三,
條件四
)

如果各個條件都有符合,那麼最終結果是 TRUE,身份證字號就是正確的了。當時的狀況是如果自訂公式是 TRUE,那麼就會套用條件式格式(讓儲存格變綠、字體變粗等等)。

可是,如果我要做的是「如果身份證驗證沒通過,也就是四個條件其中有一個不符合條件,則顯示條件式格式」呢?

我們先回想一下剛剛的 AND

=AND(條件一, 條件二, 條件三, 條件四)

假設全部條件都是 TRUE,只有條件一是 FALSE,那 AND 也會回傳 FALSE

=AND(FALSE, TRUE, TRUE, TRUE)
=AND(FALSE)

因為 AND 的結果是 FALSE,這樣反而就不會出現條件式格式了。

那,只要我把這個邏輯反轉過來,給個 NOT 看看呢?像是這樣:

=NOT(AND(條件一, 條件二, 條件三, 條件四))

舉例來說,如果符合身份證字號的驗證條件都有符合:

=NOT(AND(TRUE, TRUE, TRUE, TRUE)
=NOT(AND(TRUE))
=NOT(TRUE)
=FALSE

最後就是 FALSE,那麼條件式格式不會啟動。

那如果驗證條件有一個不符合(數個不符甚至全部不符也是):

=NOT(AND(TRUE, TRUE, TRUE, FALSE)
=NOT(AND(FALSE))
=NOT(FALSE)
=TRUE

結果顯示 TRUE,條件式格式就會啟動了!這就是我其中一個 NOT 的應用例子。




如果你喜歡這次的文章,歡迎你透過這些方法支持我:

  • 按下愛心、按下儲存
  • 留言告訴我你的想法
  • 加入喜特先生的官方沙龍,即時看到我發布的教學
  • 付費訂閱喜特先生的官方沙龍,加入每月小額訂閱方案
  • 追蹤喜特先生的 Facebook
  • 這邊小額贊助我的創作!

想要看更多文章,歡迎來到我的 Notion 頁面找找有沒有你需要的資源喔!

我是喜特先生,Mr. Sheet,我們下個教學見!



分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.