從零開始學 VBA:第一個 Hello World,以及 Module / Option Explicit 的基本概念
Copyright Notice: This article is an original work licensed under the CC 4.0 BY-NC-ND license.
If you wish to repost this article, please include the original source link and this copyright notice.
Source link: https://v2know.com/article/1302
我之前有一些 VB 的基礎,但對 VBA 本身並不熟悉。所以這次先從最基礎的地方開始:在 Access / Excel 的 VBA 編輯器中寫一個最簡單的 Hello World。
這篇文章主要記錄以下幾個點:
-
VBA 裡怎麼寫第一個
Hello World -
應該插入標準模組還是 Class Module
-
Module1是不是整個程式的入口 -
Option Explicit是什麼,為什麼建議一定要加
1. 打開 VBA 編輯器
在 Office 程式中,例如 Access 或 Excel,可以使用快捷鍵打開 VBA 編輯器:
Alt + F11
打開後會進入 Microsoft Visual Basic for Applications 編輯器,也就是 VBA 的開發環境。
2. 插入標準 Module
要寫最普通的 VBA 程式,例如 Hello World,應該插入的是:
Insert / 挿入 → Module / 標準モジュール
而不是:
Class Module / クラスモジュール
標準 Module 適合放普通的 Sub 或 Function,例如:
Sub HelloWorld()
MsgBox "Hello World"
End Sub
Class Module 則是用來自定義類和物件的,例如自己做一個 Person、ExcelImporter 之類的物件。剛開始學 VBA 的時候,暫時不需要碰它。
所以第一步就是插入一個標準 Module。
【截圖位置 1:插入標準 Module 後的 VBA 編輯器畫面】

3. 第一個 Hello World
在標準 Module 裡輸入以下程式碼:
Sub HelloWorld()
MsgBox "Hello World"
End Sub
然後把游標放在這段 Sub 裡面,按:
F5
或者點擊上方的綠色執行按鈕。
執行後,畫面上會出現一個訊息框:
Hello World
【截圖位置 2:Hello World 執行結果】

4. Sub 是什麼?
VBA 裡最基本的一段可執行程式,就是 Sub。
基本結構如下:
Sub 名稱()
要執行的處理
End Sub
例如:
Sub HelloWorld()
MsgBox "Hello World"
End Sub
這裡的意思是:
Sub HelloWorld()
代表定義一個名叫 HelloWorld 的過程。
MsgBox "Hello World"
代表顯示一個訊息框。
End Sub
代表這個過程結束。
5. Module1 是不是整個程式的入口?
一開始很容易以為 Module1 就是整個 VBA 程式的入口,但其實不是。
更準確地說:
Module1只是放程式碼的容器。
真正被執行的入口,是你執行的那個Sub。
例如現在這段:
Sub HelloWorld()
MsgBox "Hello World"
End Sub
真正的入口是:
Sub HelloWorld()
當游標放在這個 Sub 裡面並按下 F5 時,VBA 就會從 HelloWorld() 開始執行。
也就是說,VBA 沒有一個固定的、全域唯一的 Main 入口。它通常是:
誰觸發,誰就是入口。
6. VBA 常見的入口形式
6.1 手動執行 Sub
例如直接在標準 Module 裡寫:
Sub HelloWorld()
MsgBox "Hello World"
End Sub
然後按 F5 執行。
這時候入口就是:
HelloWorld()
6.2 按鈕點擊事件
如果是在 Access 表單上放一個按鈕,點擊按鈕時可能會執行:
Private Sub btnTest_Click()
MsgBox "Button clicked"
End Sub
這時候入口就是:
btnTest_Click()
也就是按鈕的 Click 事件。
6.3 表單打開事件
例如 Access Form 被打開時執行:
Private Sub Form_Load()
MsgBox "Form loaded"
End Sub
這時候入口就是:
Form_Load()
也就是表單載入事件。
7. 標準 Module 的用途
標準 Module 通常用來放一些可以共用的處理。
例如:
Public Sub ExportExcel()
MsgBox "Export"
End Sub
或者:
Public Function Add(a As Integer, b As Integer) As Integer
Add = a + b
End Function
在 Access 系統裡,標準 Module 裡常見的內容包括:
Public Function 檢查輸入() As Boolean
End Function
Public Sub 匯出Excel()
End Sub
Public Function 共用計算處理() As Long
End Function
簡單來說,標準 Module 很適合放「很多地方都會用到的共用程式」。
8. Option Compare Database 是什麼?
在 Access VBA 的標準 Module 裡,最上面常常會自動出現:
Option Compare Database
這是 Access VBA 常見的設定,意思是字串比較時,按照目前資料庫的排序和比較規則來處理。
例如字串大小寫、排序方式等,可能會受資料庫設定影響。
剛開始學 VBA 的時候,這一行可以先不用太深入理解。它不影響最基本的 Hello World。
9. Option Explicit 是什麼?
更重要的是這一行:
Option Explicit
它的意思是:
使用變數之前,必須先宣告。
例如,如果加了 Option Explicit,下面這段程式會報錯:
Option Explicit
Sub Test()
name = "Tom"
MsgBox name
End Sub
原因是 name 沒有先宣告。
正確寫法應該是:
Option Explicit
Sub Test()
Dim name As String
name = "Tom"
MsgBox name
End Sub
也就是先用 Dim 宣告變數:
Dim name As String
10. 為什麼建議一定要加 Option Explicit?
因為如果不加 Option Explicit,VBA 會允許你使用沒有宣告過的變數。
這會導致一種非常麻煩的錯誤:變數拼錯了,但程式不一定報錯。
例如:
Sub Test()
Dim total As Long
total = 100
totla = total + 50
MsgBox total
End Sub
本來想寫的是:
total = total + 50
但不小心打成了:
totla = total + 50
如果沒有 Option Explicit,VBA 可能會把 totla 當成一個新的變數。
結果程式還能跑,但是最後:
MsgBox total
顯示的仍然是:
100
而不是預期的:
150
這種錯誤非常隱蔽,Debug 起來很痛苦。
所以建議所有 VBA Module 最上面都寫:
Option Explicit
11. Access VBA 裡推薦的基本寫法
在 Access VBA 裡,最上面可以這樣寫:
Option Compare Database
Option Explicit
Sub HelloWorld()
MsgBox "Hello World"
End Sub
其中:
Option Compare Database
是 Access 自動產生的字串比較設定。
Option Explicit
是強制變數宣告,建議手動加上。
12. VBA 和 VB 的一個重要差異
如果有 VB 或 VB.NET 基礎,會覺得變數本來就應該先宣告,例如:
Dim name As String
name = "Tom"
但 VBA 如果不加 Option Explicit,它會比較寬鬆,允許你直接寫:
name = "Tom"
這一點和一般 VB / VB.NET 的習慣不太一樣。
所以,如果想讓 VBA 更接近正常 VB 的寫法,最好一開始就加上:
Option Explicit
這樣就能強制所有變數都必須先 Dim。
13. 讓 VBA 自動加入 Option Explicit
可以在 VBA 編輯器裡打開設定:
Tools / ツール
→ Options / オプション
→ Require Variable Declaration / 変数の宣言を強制する
勾選後,以後新建 Module 時,VBA 會自動加入:
Option Explicit
這個設定非常建議打開。
【截圖位置 3:VBA Options 中勾選 Require Variable Declaration】
請在這裡貼上設定畫面截圖。
14. 本次最終程式碼
最後,最基本、比較推薦的 Hello World 寫法如下:
Option Compare Database
Option Explicit
Sub HelloWorld()
MsgBox "Hello World"
End Sub
如果是在 Excel VBA 裡,可能不會有:
Option Compare Database
那麼可以寫成:
Option Explicit
Sub HelloWorld()
MsgBox "Hello World"
End Sub
總結
這次學到的內容其實很少,但都是 VBA 入門時很重要的基礎。
第一,寫普通 VBA 程式時,插入的是標準 Module,不是 Class Module。
第二,Module1 不是整個程式的固定入口,它只是程式碼容器。真正的入口是被執行的 Sub,例如:
Sub HelloWorld()
第三,VBA 裡沒有固定唯一的 Main。手動執行、按鈕事件、表單事件,都可以成為程式的入口。
第四,Option Explicit 強烈建議一定要加。它可以要求所有變數必須先宣告,避免因為拼字錯誤產生很難發現的 bug。
從這個角度看,VBA 並不是完全陌生的東西。它的語法和 VB 很接近,但它的特點是和 Office / Access / Excel 的物件模型綁得很深。
所以入門 VBA 的第一步,可以先從這個最簡單的結構開始:
Option Explicit
Sub HelloWorld()
MsgBox "Hello World"
End Sub
然後再慢慢學表單、按鈕事件、資料表操作和 Excel / Access 物件模型。
This article was last edited at