Excel VBA 新手教學:條件式(If / Else / Select Case)完整入門實作

Author:

條件式是讓 Excel VBA 在「判斷成立」時執行一件事、在「不成立」時改執行另一件事的核心語法;學會它,你的巨集就能依資料狀態自動做出正確反應。本篇用最貼近新手的方式,帶你從最基本的 If…ThenIf…Then…Else,再到更強大的 Select Case,並用一個「交通號誌」小任務讓概念落地。

我第一次真正覺得條件式「好用」是在做自動化作業時:同一份表格,資料可能是紅、黃、綠三種狀態;如果我還要手動改顏色或處理流程,效率永遠上不去。當我把狀態用條件式拆成「符合紅色就做紅色該做的事」後,整個流程瞬間變得可控、可擴充。那時我也踩過幾個新手常見的坑(例如少寫 End If、或多行判斷沒正確串起來),花了不少時間才回到正軌。今天我會把這些坑提前替你避開。

📝 目錄

什麼是條件式?為什麼新手一定要學

條件式就是:程式先判斷一個條件是否成立,成立就走一條路,不成立就走另一條路。在 VBA 裡,你可以把「條件」想成一個問題,例如:某個儲存格的值是不是等於某數字?或是某個物件(例如形狀)的名稱是不是某個字串?

你在 Excel 工作時遇到的情境其實非常多:例如根據成績判定是否及格、根據庫存量決定是否提醒補貨、根據狀態決定要顯示哪一種提示。條件式讓你的巨集具備「做決策」的能力,而不是只做固定流程。

我喜歡用一句話總結:條件式把「判斷」變成程式能執行的指令。當你學會它,你後續不管是自動填表、資料清理、報表生成,都會更順。

在開始寫 If 前:先準備物件與命名(讓判斷更直覺)

建議你用「命名物件」的方式來寫條件式。因為當你能清楚地說「這個形狀叫做 red light」,你的判斷就會非常直觀。

在 Excel 中插入形狀(交通號誌的紅、黃、綠燈),接著打開選取窗格(Selection Pane)來管理名稱。你可以用:

  • Windows 上可透過選取窗格查看物件
  • 在選取窗格中把形狀命名為 red lightyellow lightgreen light

命名後,你在 VBA 裡就能用 Selection.Name 來判斷目前選取的是哪個物件。這也是我在教學交通號誌任務時最常用的做法:讓你把「判斷」直接對應到「畫面上的結果」。

另外,若你之後需要調整形狀位置或對齊,也可以在 Excel 的形狀工具中使用對齊與分布選項,讓視覺更整齊。程式寫得再好,最後呈現不清楚也會影響你除錯的速度。

第一個條件式:單行 If…Then(If 條件成立就做一件事)

單行 If…Then 用法就是:如果條件成立就執行後面的指令。最簡單的例子是:當你選取的是紅燈形狀,就跳出訊息框。

在 VBA 編輯器新增模組,並在開頭加入 Option Explicit。這會強迫你明確宣告變數,避免拼字錯誤造成難追的錯誤。

Option Explicit

Sub easyIfStatement()
    If Selection.Name = "red light" Then _
        MsgBox "這是紅燈"
End Sub

你會看到我用了 Then 後面接要執行的動作。因為這行在編輯器中可能不夠長,所以我用 底線(_)把語句換行;若整段能放在同一行,底線可省略。

接著做驗證:先在工作表上點選 red light,再執行巨集,你應該會看到訊息框出現。若你選的是 yellow lightgreen light,訊息框就不會跳出來,因為條件不成立。

多行 If…Then:End If 不可少(新手最常踩的坑)

如果你把 If 的內容拆成多行,就必須搭配 End If這是 VBA 最常見的語法錯誤之一:你少寫 End If,程式就會報「缺少 End If」或類似的語法錯誤。

多行版本通常用在「成立時要做多個指令」。例如紅燈選取時,你可能不只跳訊息,還要改顏色、更新文字、或寫入某個欄位。

Sub multiLineIf()
    If Selection.Name = "red light" Then
        MsgBox "紅燈被選取了"
        ' 這裡可以放更多指令
    End If
End Sub

你也可以把單行 If 改成多行 If;差別不在概念,而在你要執行的指令數量。重點是:成立區塊要用 End If 收尾

我在早期教學時,常看到學員因為「看起來像同一段」就把 End If 忘了,導致整段程式無法跑。現在你只要記住:多行 If 一定要 End If

兩向條件式:If…Then…Else(成立做 A,不成立做 B)

兩向條件式能讓你同時處理成立與不成立的情況。當你需要「選到紅燈就做紅燈的事,否則就做另一件事」,就用 If…Then…Else

例如你可以設定:如果選到紅燈就顯示「紅燈」,否則就顯示「不是紅燈」。這在除錯時也很有用,因為你可以快速確認條件到底判斷成不成立。

Sub ifThenElseExample()
    If Selection.Name = "red light" Then
        MsgBox "紅燈"
    Else
        MsgBox "不是紅燈"
    End If
End Sub

兩向條件式的價值在於:你不必把「不成立」的邏輯另外寫在其他地方,程式結構更集中、可讀性更好。這也是專業巨集常用的寫法之一。

當你把條件式套進實務(例如根據資料值決定顯示哪種狀態),兩向邏輯幾乎是必備技能。

用 Select Case 寫「多分支判斷」(狀態越多越好用)

Select Case 適合用在「同一個變數/表達式要比對很多不同值」的情況。例如交通號誌的狀態可能是紅、黃、綠,你不想寫一堆巢狀 If 時,Select Case 會讓程式更清楚。

概念上,你先指定要判斷的值,再列出每個可能的狀態各自要執行的指令。這種結構特別適合做「流向控制」,也就是你在不同條件下把程式導向不同結果。

Sub selectCaseExample()
    Select Case Selection.Name
        Case "red light"
            MsgBox "紅燈"
        Case "yellow light"
            MsgBox "黃燈"
        Case "green light"
            MsgBox "綠燈"
        Case Else
            MsgBox "未知狀態"
    End Select
End Sub

你可以先用 MsgBox 測試,確認判斷是否正確;等邏輯確認後,再把動作換成你要的功能(例如改變形狀顏色、改變文字、切換下一步)。

如果你已經理解 If…Then…Else,那 Select Case 的學習成本其實很低;差別只是把多分支判斷寫得更乾淨。

實作任務:把交通號誌「切換顏色」做成條件式練習

用交通號誌是最好的入門練習,因為視覺結果能立刻驗證你的條件是否寫對。我在教學時會讓你先做最小任務:把「紅燈切換到黑色」,再把「黑色切回紅色」。

這裡有一個新手很重要的觀念:你不需要一開始就憑空寫出所有程式。你可以用「程式來源」的方式取得起點,例如:

  • 把你已經寫過能工作的程式片段複製再改
  • 用巨集錄製功能取得基礎指令(再理解它在做什麼)
  • 從你熟悉的範例中找出「改顏色」相關的語句

接著你要做的就是:找到能改形狀顏色的指令,並把它包在條件式裡。條件式負責判斷「現在是什麼狀態」,顏色變更負責執行「要做什麼」。

你可以先寫一個程序,例如:當你呼叫它時,如果紅燈目前是紅色就改成黑色;如果已經是黑色就改回紅色。這樣你就能練到兩個核心能力:判斷狀態依判斷採取動作

任務目標 條件(Condition) 動作(Action)
紅燈→黑色 紅燈目前顏色是紅 把紅燈顏色設為黑
黑色→紅燈 紅燈目前顏色是黑 把紅燈顏色設為紅

當你把這個小任務做完,你就已經把條件式的精神抓到:先判斷,再執行。接下來要做完整交通號誌循環(紅→黃→綠→黃→紅)時,你只要把狀態分支擴充即可;如果狀態多,優先考慮 Select Case 讓程式更好維護。

呼叫巨集:把交通號誌流程拆成可重用的步驟

當你要讓交通號誌持續切換,通常需要把每一步做成獨立巨集,再互相呼叫。這樣你不必把所有邏輯塞在同一個 Sub 裡,程式會更清楚、也更容易除錯。

在實作上,你可以把「切換紅燈」、「切換黃燈」、「切換綠燈」各自寫成一個小巨集,最後再寫一個主流程巨集負責循環呼叫。這種做法也符合我一貫的教學方式:把大任務拆成小任務,逐步累積信心。

若你之後遇到「程式跑起來但畫面沒按預期變化」,先回到條件式:確認判斷用的狀態是否真的正確更新。例如你以為顏色已改,但其實判斷條件仍抓到舊狀態。

你也可以先用 MsgBox 或 Debug.Print 觀察判斷結果,再把訊息移除,讓流程乾淨。

總結:條件式讓你的巨集真正會「做決策」

學完本篇,你應該能把條件式用在實務:單行 If…Then 用於簡單成立就執行、If…Then…Else 用於成立與不成立都要處理、Select Case 用於多分支狀態判斷。搭配交通號誌的視覺練習,你可以快速驗證邏輯是否正確。

  • 判斷(Condition):用 Selection.Name 或其他值來決定狀態
  • 執行(Action):用程式把顏色或內容切換到正確結果
  • 結構(Structure):多行 If 一定要有 End If

常見問題(FAQ)

❓ 我怎麼判斷條件式裡的「條件」寫錯?

最直接的方法是先把動作換成 MsgBox,驗證判斷是否成立。例如你用 If Selection.Name = “red light” Then,就先在成立時顯示訊息框;如果你選了紅燈卻沒有跳出,通常表示物件名稱(Name)與你寫的字串不一致。你可以到選取窗格確認名稱是否完全相同(包含大小寫與空格)。

⚠️ 多行 If…Then 一定要寫 End If 嗎?

是的,只要你的 If 區塊跨多行,就必須配對寫 End If單行 If…Then 可以不寫 End If,但一旦你把指令換到下一行,就要用 End If 收尾,避免 VBA 報語法錯誤。這也是新手最常遇到的錯誤原因之一。

🚦 什麼時候該用 Select Case,而不是一直巢狀 If?

當你要判斷的同一個值有三種以上狀態時,優先考慮 Select Case例如交通號誌的紅、黃、綠就是典型多分支。Select Case 會讓程式更直觀,也更容易維護;你不必把多個 If 巢在一起,讀起來更不容易迷路。

📺 來源影片參考