從零開始學 VBA:第一個 Hello World,以及 Module / Option Explicit 的基本概念

| Visual Basic | 2 Reads

我之前有一些 VB 的基礎,但對 VBA 本身並不熟悉。所以這次先從最基礎的地方開始:在 Access / Excel 的 VBA 編輯器中寫一個最簡單的 Hello World

這篇文章主要記錄以下幾個點:

  1. VBA 裡怎麼寫第一個 Hello World

  2. 應該插入標準模組還是 Class Module

  3. Module1 是不是整個程式的入口

  4. 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 適合放普通的 SubFunction,例如:

Sub HelloWorld()
    MsgBox "Hello World"
End Sub

Class Module 則是用來自定義類和物件的,例如自己做一個 PersonExcelImporter 之類的物件。剛開始學 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