VBA下拉式選單:基本觀念以及1個完整實務案例

VBA下拉式選單建立於UserForm表單上面,自動帶出資料,限定輸入內容的資料,避免錯誤。本文首先介紹基本概念和主要應用場景,再以實際案例介紹如何設置。

一、基本觀念

VBA(Visual Basic for Applications)是專門為Excel開發及搭配用的的程式語言,它可以用程式碼的方式定義操作流程,達到自動化的效果,甚至可以新增原本Excel所沒有的工具,豐富Excel的功能,例如這些篇文章所介紹的下拉選單。

下拉選單是VBA中一個常見且實用的元素,能夠優化使用者體驗並提升資料輸入的效率,它通常可以使用在下列應用場景:

使用場景說明
資料驗證限制使用者輸入的資料內容,避免錯誤輸入。
快速輸入便於使用者用選取方式快速選擇所需內容。
分析報告下拉選擇的內容便是分類設置,有助於統計分析。

二、實務案例

在具備基本概念之後,接下來以實際案例介紹設置流程:

所謂內部控制,是在制度設計中防堵可能的錯誤發生,主要方式之一,是阻止該項操作或者交易繼續進行下去。在ERP系統中,使用者在輸入表單時,常常會遇到沒辦法輸入成功(無法確認)的情況,這是系統內置的控制制度。上一節介紹了如何以VBA表單輸入控制測試資料,既然是表單,也可以仿照ERP系統設計防呆,以下具體分享:

(本案例是假設讀者有VBA自訂表單的經驗,建議可以一併閱讀贊贊小屋關於如何建立UserForm自訂表單的文章。)

1. 表單物件刪除

在VBA編輯器裡,設計表單如同繪圖板一般簡單直覺,例如要刪除某個按文字框物件,只要滑鼠右鍵,「刪除」即可。

設計表單如同繪圖板一般簡單直覺

2. VBA下拉式選單

「刪除」之後,在原來的地方,新增一個控制項,改為比較合適的「下拉式方塊(選單)」,於「屬性」視窗切換到「性質分類」頁籤。這裡除了將「(Name)」改為「單價」,還將「MatchRequired」設定為「True」,表示只能輸入預先定義的選項。

建立VBA下拉式選單

3. 新增命令按鈕

比照上一步驟,將「核准」也改為下拉式,另外再添一個命令按扭:「結束」。

另外再添一個命令按扭:「結束」

4. 表單物件程式碼

輸入如圖所示的程式碼,可以直接寫程式,也可以先在上面的下拉選項,左邊選好按紐,右邊選好事件,VBA會自動跳出該按紐事件的Sub供書寫代碼,可以試看看不同的按紐事件,反正不行再將程式刪掉即可。關於程式代碼,下面再作說明。

VBA會自動跳出該按紐事件的Sub供書寫代碼

5. 提示無效屬性值

後台VBA編輯好了,回到前台Excel,執行巨集,在表單視窗中,單價方塊輸入「2.5」,按「確定」後會出現錯誤提示:「無效的屬性值」。

按「確定」後會出現錯誤提示:「無效的屬性值」

6. 請全部都輸入

即使兩個下拉選單都填好了,中間有一欄「客戶」是空白,一樣會跳出錯誤提示:「請全部都輸入!」。

一樣會跳出錯誤提示:「請全部都輸入!」

7. 程式碼完整說明

以下說明程式碼:

Private Sub UserForm_Initialize()

單價.List = Array(“一致”, “不一致”): 核准.List = Array(“經簽核”, “未簽核”)

End Sub

註1:建立此表單的初始值,分別賦予「單價」和「核准」的下拉內容,中間「:」是將兩行程式串連在

一行,方便檢閱。

Private Sub 確定_Click()

If 日期.Value = “” Or 訂單.Value = “” Or 客戶.Value = “” Or 單價.Value = “” _

Or 核准.Value = “” Then

MsgBox “請全部都輸入!”, vbExclamation, “錯誤提示”

Exit Sub: End If

註2:以一個If判斷式控制輸入,如果有任何一個欄位沒有填寫,則錯誤提示:「請全部都輸入!」,跳出

「Private Sub 確定_Click()」這個程序。

Dim r As Integer

r = Range(“G9”).CurrentRegion.Rows.Count + 8

Cells(r, “G”) = 日期.Value: Cells(r, “H”) = 訂單.Value: Cells(r, “I”) = 客戶.Value

Cells(r, “J”) = 單價.Value: Cells(r, “K”) = 核准.Value

日期.Value = “”: 訂單.Value = “”: 客戶.Value = “”

單價.Value = “”: 核准.Value = “”

End Sub

註3:定義「r」為整數變量,「r = Range(“G9”).CurrentRegion.Rows.Count + 8」將所要輸入的列數賦給

「r」,其中「Range(“G9”).CurrentRegion.Rows.Count」意思是「R9」所在非空白資料表格的列數,也就

是下圖中被黃色包圍的表格,共有4列,注意到顏色填滿和儲存格框線,並不影響內容是空白的判斷,另外資料是從第八列開始的,所以要再加個8,結果便是將資料輸入在第12列,正是我們想要的。這裡特別設計了圖案說明,讀者應能理解。

r = Range("G9").CurrentRegion.Rows.Count + 8

Private Sub 結束_Click()

Unload 銷貨收入控制測試

End Sub

註4:設定命令按紐「結束」的執行程序,也就是退出目前的輸入表單。

三、結語:VBA不是很難但很神奇

以上,是關於這篇文章範例的程式碼說明。和Excel的函數參數一樣,VBA有很嚴謹的語法結構,一定要照規距來,不然Excel無法讀懂程式,也就無法執行。不過以這篇文章來說,有事先定義好的物件(「下拉式方塊」)、有關於此物件的屬性編輯表(「MatchRequired」)、有如同繪圖板般的指令製作(表單)、可以分開獨立編寫的事件(Sub),凡此種種,都讓VBA更加容易親近學習,不是很難,但卻是很神奇,有興趣讀者因應需要,建議嘗試照樣造句,編寫自己的VBA程式。另外,也可以參考微軟關於下拉式方塊的說明頁面。

本文章講解影片:

YouTube video

想學習更多相關技巧嗎?歡迎前往贊贊小屋VBA自訂表單教學中心::

VBA UserForm:自訂表單設計,1個使用者操作介面

最新文章: