You are on page 1of 20

Excel VBA 作資訊系統開發

程式設計相較於使用套裝軟體而言,是操作資訊時代工具(電腦),最直接、最有彈性、
最有潛力(可以設計出所有軟體)的方式。如前所述,程式是指令的集合,但這些指令必須以
特定的語法組合起來,其過程包括:

1. 解析希望電腦幫我們完成的程序工作,將之標準化、合理化,並分析是否適合電腦來作,
若是,則可以準備將之程式化。
2. 分解該程序工作至逐步程序,此即演算法(Algorithm)。
3. 以程式指令與語法將演算程序轉為程式語法。
4. 反覆「執行、偵錯」,直到系統執行正確無誤。
5. 由簡入繁逐步改進程式(系統)功能(此即所謂漸進開發策略)。

靈活運用三種最簡單的程式結構(順序、判斷與重複結構),即可形成所有軟體。以下以一
簡單功能,分別以 BASIC、VB(A)與 C 語言編碼比較,如表 3.2.1 所示(對於 VB 與 C 的語法,
後述,讀者在此僅需比較其相似性即可):

表 3.2.1
行 BASIC VB(VB; VBA; ASP; C(C++; Java; C#)
號 VBScript)
順序結構(以下說明為 BASIC 語法之逐行解釋)
1. 由鍵盤取得數值輸入,並存入變數 A 中
2. 將變數 A 值取出,加上 1(+1),存入變數 A(=A)中
3. 由螢幕印出變數 A 的值
1 Input A A = InputBox(“Input No#:”) #include <iostream.h>
2 A=A+ 1 A=A+ 1 void main()
3 Print A MsgBox(A) {float A;
cin>>A;
A = A + 1;
cout<<A;}
判斷結構(以下說明為 BASIC 語法之逐行解釋)
1. 由鍵盤取得數值輸入,並存入變數 A 中
2. 判斷變數 A 的內含值是否大於獲等於 0(>=0),若「是」則執行 Then 後的指令(即 Print A),
否則執行 Else 之後的指令(即 Print -1*A)
3. 不管第 2 行程式之執行結果如何,皆執行第 3 行的程式(即 Print A+1)
1 Input A A = InputBox(“Input No#:”) #include <iostream.h>
2 If A>=0 Then Print A Else Print If A>=0 Then void main()
-1*A MsgBox(A) {float A;
3 Print A+1 Else cin>>A;

1
MsgBox(-1*A) if (A >= 0) {cout<<A}
End If else { cout<<-1*A }
MsgBox(A+1) cout<<A+1;}
重複(+判斷)結構(以下說明為 BASIC 語法之逐行解釋)
1. 以 For … Next 指令重複執行第 2 行至第 3 行間的指令,共 5 次,第 1 次執行時變數 I 為
1(即下限值),第 2 次執行時變數 I 為 2,…,第 5 次執行時變數 I 為 5,即每重複執行 1
次,計數變數 I 加 1。當計算變數值增加到上限值(5)時,即結束,並接續至 Next I 後的
指令執行
2. 由鍵盤取得數值輸入,並存入變數 A 中
3. 判斷變數 A 的內含值是否大於獲等於 0(>=0),若「是」則執行 Then 後的指令(即 Print A)
4. 為重複結構的終點
1 For I = 1 To 5 For I = 1 To 5 #include <iostream.h>
2 Input A A = InputBox(“Input No#:”) void main()
3 If A>=0 Then Print A If A>=0 Then MsgBox(A) {float A; int I
4 Next I Next I cout<<”Input No#:”;
cin>>A;
for (I = 1; I <= 5; I++)
{if (A >= 0)
{cout<<A}}
}

經過以上的學習,讀者大概已經了解程式語言的基本結構與原理,但為了能確實完成「編
碼」
、「執行」與「輸出」的程序(而非紙上談兵),我們選擇 VBA 說明,VBA 屬於視窗環境的
程式語言,輸入與輸出分別必須代以 InputBox 指令取得鍵盤輸入,MsgBox 指令產生螢幕輸
出。
上表中「A = InputBox(“Input No#:”)」之指令係以”Input No#:”為提示文字,由輸入框取
得輸入(輸入後按「確定」鍵),並存入變數 A 中,「A=A+1」則與 Basic 語言相同,第 3 行
「MsgBox(A)」則將變數 A 的內含值以訊息視窗產生輸出。實作步驟如下:

1. 進入 Excel。
2. 以功能表之「工具¾巨集¾Visual BASIC 編輯器」或快速鍵「Alt+F11」 ,進入 VBA 編輯環
境。(如圖 3.2.1)
3. 以功能表之「插入¾模組」開啟程式編輯視窗,開啟後如圖 3.2.2 所示。
4. 在圖 3.2.2「Book1 – Module(程式碼)」視窗中編輯程式碼,程式碼必須包含在「Sub … End
Sub」間,且給予該程序名稱(例如圖 3.2.3 之 Test),編輯完後如圖 3.2.3 所示。

2
圖 3.2.1

圖 3.2.2

圖 3.2.3

5. 編輯完程式碼後,以功能表之「執行¾執行 Sub 或 UserForm」或快速鍵「F5」(記得滑鼠


指標要停留在「Sub…End Sub」間),執行該程序。
6. 執行後出現如圖 3.2.4 之輸入視窗(此為執行「A = InputBox(“Input No#:”)」出現之畫面),
在輸入框中輸入一值(例如 5),按圖 3.2.4 之「確定」鍵,即可將該值輸入至變數 A 中(即
A=5)。

圖 3.2.4
7. 隨即,可出現如圖 3.2.5 之結果,即經 A=A+1 後,變數 A 為 6 之結果。按「確定」鍵即
可結束程式執行。
3
圖 3.2.5

接下來,於 Test 程式中,輸入表 3.2.1 中 VBA 程式之判斷結構程式碼。如圖 3.2.6 所示。

圖 3.2.6

執行後,若輸入為正數(如 5),則輸出為 5,若輸入為-5,輸出亦為 5,因為當輸入為「-5」


時,變數 A 變為「-5」,判斷條件「A>=0」不成立(成立為 True,不成立為 False),因此執行
「MsgBox (-1 * A)」之程式,因此輸出亦為 5。
接下來,於 Test 程式中,輸入表 3.2.1 中 VBA 程式之重複(+判斷)結構程式碼。如圖 3.2.7
所示。執行圖 3.2.7 之程式,將會重複執行 5 次「A = InputBox("Input No#:")」與「If A >= 0 Then
MsgBox (A)」之程式碼。

圖 3.2.7

建構程式交易環境必須學習的 VBA 重要指令


經過以上的學習後,讀者應已經知道如何在 VBA 中寫程式並成功執行。接下來,將介紹
4
其它重要的指令與語法。

1. 變數宣告指令—「Dim」
首先,變數使用前最好能事先宣告,以便電腦可以適當的幫該變數保留合適的記憶體空
間,雖然 VBA 並不強制要求變數使用前必須事先宣告(因此之前我們寫的程式都可以執行),
但在 VB 7.0 版本以後,以及 C 語言中,就強制要求變數使用前必須先行宣告,因此最好能現
在就維持好習慣。VBA 中的變數型態有多種,但常用的包括表 3.2.2 中的幾種。

表 3.2.2 VBA 中常用的變數型態


變數種類 記憶體空間 範例
數值 整數 一般整數(Integer) 2 Bytes Dim Age As Integer
長整數(Long) 4 Bytes Dim Salary As Long
實數 單倍精密度(Single) 4 Bytes Dim Score As Single
雙倍精密度(Double) 8 Bytes Dim Rate As Double
字串(String) 1 Byte/字元 Dim Name1 As String

表 3.2.2 中的一般整數僅能存「-32768~32768」之整數,長整數能儲存的數值範圍就更廣;
同理,雙倍精密度能儲存之實數(不管是極大或極小的數),較之單倍精密度為廣。其實,以
現有記憶體之巨大與便宜,在財務計算上,不妨整數就宣告成 Long,包含小數的數則宣告為
Double。 由表 3.2.2 中亦可知,變數名稱要盡量「有意義」,以便望文生義,知道該變數儲存
何種資料,例如以 Age 當作存年齡的變數。

2. 陣列變數
變數也可以代表一群同類型的資料,例如要存整班 50 個同學 5 個科目的成績,不需宣告
成 250(=50*5)個變數,僅需如下宣告即可。

Dim Score(50, 5) As Integer

如此即可保留 51*6 個數(因為指標由 0 開始),6 號同學之第 3 科成績,可以存放至 Score(6,


3)中,例如:

Score(6, 3) = 75

3. 指定敘述的用法—「=」
之前,我們已經介紹過指定敘述「=」之用法,在前述之重複程式中,每一次變數 A 以
「InputBox」函數讀入資料並「指定」入變數後,就會將上一次反覆之值蓋掉,在學完前述
陣列變數宣告後,我們可將每次讀入之數值,放在不同的陣列指定位置上。也可以置入 Excel
之格位中。以下為更改後的程式碼。

5
Sub Test()
Dim A(5) As Integer
For I = 1 To 5
A(I) = InputBox("Input No#:")
Cells(I, 1) = A(I)
Next I
End Sub

上列程式中,「Dim A(5) As Integer」宣告 A 陣列變數;利用「A(I) = InputBox("Input No#:")」


程式將每次輸入值存入 A 陣列的不同位置(以迴圈變數 I 改變每次儲存的位置);以「Cells(I, 1)
= A(I)」指令將陣列中的值,存放在「第 I 列、第 1 欄」內;執行後如圖 3.2.8 所示。

圖 3.2.8

4. 運算子
在前述程式中,我們已經使用了算術運算子(即「+」)以及關係運算子(即「>=」),此外
程式中還有作邏輯判斷的邏輯運算子。整理如表 3.2.3 所示。

表 3.2.3 VBA 中的不同運算子


運算子 功能 範例
算術運算子
+ 加法運算(數值或字串運算)
- 減法運算
* 乘法運算
/ 除法運算
^ 指數運算
\ 整數除法運算 5 \ 3 得到之計算結果為 1
MOD 餘數運算 5 MOD 3 得到之計算結果為 2
關係運算子,運算結果為「True」(真)或「False」(假)
= 等於
> 大於

6
< 小於
>= 大於或等於
<= 小於或等於
<> 不等於
邏輯運算子,運算結果為「True」(真)或「False」(假)
AND 「且」運算 「5 > 3 AND 2>=4」傳回「False」
OR 「或」運算 「5 > 3 OR 2>=4」傳回「True」
NOT 「非」運算 「NOT 2>=4」傳回「True」

5. 外部文字檔案讀入
為了示範如何以 VBA 讀入外部文字檔案,我們以 Windows 的「記事本」編輯一簡單的
文字檔案(如圖 3.2.9 所示),並以「InFile」為檔案名,存於「C:」磁碟機根目錄中。

圖 3.2.9

接下來於 Test 程序(Sub)中,編輯如下程式碼:

Dim A, B, C As Integer
Open "C:\InFile.txt" For Input As 1
Input #1, A, B, C
Cells(1, 1) = A
Cells(2, 1) = B
Cells(3, 1) = C
Close 1

其中,「Open "C:\InFile.txt" For Input As 1」程式可打開名為「C:\InFile.txt」之檔案(必須


包含「路徑+檔名+”.”+副檔名」),作輸入(Input)之用,且將該檔案編號為「1」(因為可同時
打開多個檔案,因此必須編號)。
「Input #1, A, B, C」程式,從檔案標號 1 的檔案讀入 3 個變數值,分別存入 A、B、C 中。
「Cells(1, 1) = A」將讀入的變數 A 值,存入工作表 A1 位置,其它 2 行以此類推。
「Close 1」程式可將打開的指定檔案關閉。
上述程式行後可將圖 3.2.10 左側的「InFile.txt」檔案,讀入、處理後,輸出到右側試算
表格位中。

7
圖 3.2.10

上述程式僅能讀入一列資料,如果希望讀入多列資料,就必須使用「重複(迴圈)命令」,
但之前「For … Next」的重複命令,無法依據判斷條件決定迴圈是否繼續被執行。以下介紹
條件式迴圈命令—「While … Wend」。
試編碼以下程式:

Dim A, B, C As Integer
Dim Count As Integer
Open "C:\InFile.txt" For Input As 1
Count = 0
While Not EOF(1)
Count = Count + 1
Input #1, A, B, C
Cells(Count, 1) = A
Cells(Count, 2) = B
Cells(Count, 3) = C
Wend
Close 1

上述程式中,宣告 Count 變數用以儲存資料筆數。並以「Count = 0」設定初始值為 0,


其後於迴圈結構中以「Count = Count + 1」程式在每一次進入迴圈時將 Count 變數內含值加 1。
「While … Wend」迴圈指令,會依據 While 後的判斷條件成立與否決定 While 到 Wend
間的程式碼是否被執行(若 While 後的條件判斷結果為「True」則執行,否則不執行)。
「EOF(1)」為一函數,可判斷參數值(在此為 1)指定之檔案是否已經到檔案尾端(EOF 即
End of File 之意),若是,則傳回「True」,若否,則傳回「False」 。Not 邏輯運算子可將邏輯
值反向(即 True 轉為 False,False 轉為 True)。因此「While Not EOF(1)」即為「當未到檔尾,
則執行 While 到 Wend 間的程式段」之意。
8
上述程式行後可將圖 3.2.11 左側的「InFile.txt」檔案,讀入、處理後,輸出到右側試算表
格位中。

圖 3.2.11

6. 輸出到外部文字檔案
上述程式完成讀入資料檔的功能,若要經過處理後輸出,則可用以下程式:

Dim A(10), B(10), C(10), I As Integer


Dim Count As Integer
Open "C:\InFile.txt" For Input As 1
Count = 0
While Not EOF(1)
Count = Count + 1
Input #1, A(Count), B(Count), C(Count)
Wend
Close 1
Open "C:\OutFile.txt" For Output As 1
For I = 1 To Count
Print #1, A(I); B(I); C(I); (A(I) + B(I) + C(I)) / 3
Next I
Close 1

在上述程式中,以「Open "C:\OutFile.txt" For Output As 1」打開名為「C:\ OutFile.txt」的


檔案當作輸出檔案,檔案編號為 1;以「Print #1, A(I); B(I); C(I); (A(I) + B(I) + C(I)) / 3」程式
將 A(I)、B(I)、C(I)與(A(I) + B(I) + C(I)) / 3(即 3 個值之平均)等資料輸出到該開啟之檔案。在
上述程式中,開啟檔案之資料行數已經被存於 Count 變數中,輸入資料已經被存入 A、B、C
9
之變數陣列中(由於無法事先得知輸入檔案的資料筆數,因此在宣告變數陣列時,可以宣告得
大一些);因此輸出時,僅需以無條件迴圈輸出 Count 筆資料。
上述程式行後可將圖 3.2.12 左側的「InFile.txt」檔案,讀入、處理後,輸出到右側的輸
出文字檔(即 OutFile.txt)中。

圖 3.2.12
7. 程序與函式的呼叫
前述以「Sub … End Sub」含括程式碼之程式稱為「程序」
,除了程序外,也可以定義「函
式」,兩者都可以被其他程序或函式所呼叫(即當作其他程式的「副程式」)。
定義函式的方式如下:

Function MyAdd(x1 As Double, x2 As Double) As Double


MyAdd = x1 + x2
End Function

以上函式之功能為輸入兩數值,相加後輸出,輸入參數值與輸出函式值均為倍精度
(Double)。定義好的函式可被其他程序呼叫,例如:

Sub Test2()
Dim A As Integer
A = MyAdd(3, 4)
MsgBox (A)
End Sub

執行後如圖 3.2.13 所示。

10
圖 3.2.13

函式(Function)與程序(Sub)不同之處,在於函式必須要有輸入參數,但程序不必一定需
要,此外函式定義後,可以在試算表中當作使用者自訂函式使用。
與函式一樣,程序也可被呼叫,直接以程序名稱呼叫即可。
在程序或函式中也可呼叫 Excel 試算表函數,例如:

A= Application. Sum(x1,x2)

即可使用 Sum 這個工作表函數。

8. 其它未提及但重要的指令
(1) 為程式加入註解—「’」
為程式加入註解是一個好的習慣,方便別人也方便自己未來維護系統,程式註解行不影響
程式執行,純粹說明用,以前一範例為例,可加入註解行以區別文字檔輸入區段與輸出區段。

Dim A(10), B(10), C(10), I As Integer


Dim Count As Integer ‘Count 用以儲存輸入資料列數
‘讀入資料檔
Open "C:\InFile.txt" For Input As 1
Count = 0
While Not EOF(1)
Count = Count + 1
Input #1, A(Count), B(Count), C(Count)
Wend
Close 1
11
‘寫出資料檔
Open "C:\OutFile.txt" For Output As 1
For I = 1 To Count
Print #1, A(I); B(I); C(I); (A(I) + B(I) + C(I)) / 3
Next I
Close 1

(2) 2 行變成 1 行程式—「:」


有些程式行很短,且相關,可以使用「:」將多行程式併為 1 行,例如:
A= 1
B=1
C=1
可以相當於:
A = 1: B = 1: C = 1

(3) 1 行變成 2 行程式—「_」


有時候單行程式太長,可以使用「_」將 1 行程式轉為 2 行,例如:

使用「:」將兩行程式併為 1 行,例如:
Print #1, A(I); B(I); C(I); (A(I) + B(I) + C(I)) / 3
等同於:
Print #1, A(I); B(I); C(I); _
(A(I) + B(I) + C(I)) / 3

表 3.2.4 整理前述 20 個 Excel VBA 之重要指令,及其功能與範例。

12
表 3.2.4 Excel VBA 20 個指令與語法範例
No 指令 功能 範例
程序、函式與變數(陣列)型態宣告
1 Sub … 定義程序 Sub MySub(x As Integer, y As Integer)
End Sub End Sub
2 Function … 定義函式 Function MyFn(x As Long) As Double
End Function (可作為自訂函式) End Function
3 Dim 宣告變數(Integer, Dim A as Integer
Long, Single, Dim B(10, 5) As Single
Double, String) Dim C As String
變數設定與運算子
4 = 設定變數、陣列、 A = A + 1: B(4) = 1.8
格位或屬性 Cells(Row ,Col) = A
Worksheets(“Sheet1”).Cells(2,1) = 1
TextBox1.Text = “12”
5 +, -, *, /, \, ^, Mod 算術運算子
6 >, <, =, >=, <=, <> 關係運算子
7 AND OR NOT 邏輯運算子
邏輯判斷命令
8 If .. Then 條件判斷 If A >= 60 Then
.. MsgBox(“Pass”)
Else Else
.. MsgBox(“Fail”)
End If End If
迴圈(重複)命令
9 For I = 1 To n 無條件判斷迴圈 For I =1 To 10
… For J = 1 To 5
Next I Cells(I, J) = I + J
Next J
Next I
10 While … 條件判斷迴圈 While Not EOF()
… Input #1, A(I)
Wend I=I+1
Wend
簡易輸出入介面
11 InputBox 簡易輸入介面 A = Input(“Please Input a Number”)
12 MsgBox 簡易輸出介面 MsgBox(“Out Number:”+ Str(A))
外部檔案開啟關閉、讀入與寫出
13 Open filename For Input 開啟文字檔案輸 Open “C:\Test.txt” For Input As #1

13
As #n 入或輸出
Open filename For Output
As #n
14 Close #n 關閉檔案 Close #1
15 Input #n, A, B, C 由開啟檔案輸入 Input #1, A
資料
16 Print #n, A, B, C 輸出資料到開啟 Print #1, A
檔案
VBA 函數、Excel 函數與自訂副程式(程序或函數)使用
17 Str() Val() EOF(), … VBA 函數
18 Application.WorksheetFunction.Excelfn() 使用 Excel A= Application. Sum(x1,x2)
函數
19 A=MyFunction(m, n) 呼叫函數 Range(“B1”).Value=MyAdd(3,4)
MySub 或程序 MySub
20 其它命令 ‘: _ END …
註:為何要強調只需要學習 20 個指令呢?這個靈感來自於帶小孩上牙醫的經驗。拔牙不管對
於大人或小孩而言,都是痛苦的經驗,特別是對於有理說不清的稚齡小孩,莫怪乎許多牙醫
拒看小孩。有耐心的牙醫通常會告訴小孩說,數到 10 就好啦!藉由數數的過程中,轉移了小
孩的注意力,同時也讓小孩知道痛苦有其終點;同樣的,學程式語言對於非資訊背景的人也
是一個不好受的經驗,藉由 20 個指令的學習終點,學習者也比較不會認為學程式是無窮的煎
熬。然而,依據 80/20 法則,讀者確實不需學習較不常被使用、可被替代的指令及語法,或
許寫出來的程式不是那麼精簡(所謂比較「dirty」),但確實可以達成目標。

為程式加上視窗操作介面
前述的程式,可以由「InputBox 輸入、處理、MsgBox 輸出」 ,或者可用「讀入檔案、處
理、輸出檔案」的方式運作。但通常,我們操作資訊系統的方式,是透過包含不同物件(控制
項)的使用者介面(UI; User interface)。最常出現在輸出入介面的物件如,視窗(UserForm)、輸
出 入 文 字 框(TextBox) 、 文 字 標 籤(Label)、按鍵(CommandButton) 、 分 類 框(Frame) 、 選 紐
(OptionButton)等。
例如以 InputBox 功能所提供的輸入框為例,其包含一視窗、一文字標籤(顯示提示文字)、
一輸出入框,以及兩按鍵。
在 Excel VBA 中也可以設計包含這些控制項物件的操作視窗。
首先,必須在 Excel VBA 的編輯環境中以功能表之「插入¾自訂表單」方式,產生表單
視窗,並帶出包含不同控制項類別的「工具箱」 ,如圖 3.2.14 所示。

14
圖 3.2.14

在圖 3.2.14 名為「UserForm1」的視窗中,即可在「工具箱」中以滑鼠左鍵點選所要加入
控制項類別,再於視窗中拖曳的方式,將所要的控制項物件加入到視窗中,例如,在圖 3.2.14
中加入一按鍵的操作如圖 3.2.15 所示,欲調整該控制項物件之位置與大小,僅需以滑鼠拖曳
與拉放「控制項周圍控制點」的方式調整及可。歸納在視窗中加入控制項之方式,如下:

1. 點選控制項
2. 點選表單中控制項放置位置
3. 調整控制項位置與大小

圖 3.2.15

15
加入按鍵後,使用者可在該控制項物件的屬性視窗中更改屬性,例如希望該按鍵的「標
題」(Caption)由原來預設的「CommandButton1」改為「離開」,即可在圖 3.2.16 的屬性視窗
中直接更改名為「Caption」的屬性即可。若看不到「屬性」視窗,可以功能表「檢視¾屬性
視窗」或使用快速鍵 F4 等方式打開它,開啟的屬性視窗為目前點選的控制項物件之對應屬性
視窗。

圖 3.2.16

以上之操作完成系統的靜態操作環境設計,如果希望該介面動態化,可以滑鼠雙按控制
項,例如在按鍵位置雙按滑鼠,即可開啟如圖 3.2.17 之程序碼編輯視窗。
圖 3.2.17 中的程序(Sub)名為 CommandButton1_Click,意指在其內的程序碼,為當
「CommandButton1」按鍵,被單按(Click)時,啟動;在程序內,可以編碼以前述 Excel VBA
指令所組成的程序。

圖 3.2.17

例如若希望當圖 3.2.17 的 UserForm 按鍵被單按後,可離開系統,則可以在圖 3.2.17 的「程


式碼」視窗中編碼如下:
16
Private Sub CommandButton1_Click()
End
End Sub

「End」指令可離開系統之使用。
圖 3.2.17 之程式設計完後,即可執行(按快速鍵「F5」或選取功能表「執行¾執行 Sub 或
Userform」)。圖 3.2.18 為執行之視窗畫面,以滑鼠單按名為「離開」之按鍵,即可離開系統
之使用。

圖 3.2.18

接下來,我們加深程式深度,寫一個可以完成「四則運算」功能的小系統。此程式由介
面輸入 2 個數值,由使用者選擇要進行「加、減、乘或除」之運算,按「確定」按鍵後,得
到執行結果,按「離開」按鍵後離開系統使用。
系統之物件安排如圖 3.2.19 所示。我們使用了 1 個視窗(UserForm)、2 個分類框(Frame)、
3 個文字標籤(Label)、3 個文字輸出入框(TextBox)、2 個功能按鍵(CommandButton)、4 個選紐
(OptionButton)。

圖 3.2.19

然後,我們改變控制項物件的若干屬性,如表 3.2.5 所示。

表 3.2.5 改變圖 3.2.19 視窗中控制項屬性


控制項名稱 屬性名稱 原屬性 改變後屬性
UserForm2 Caption UserForm2 My First System
Frame1 Caption Frame1 Input
Frame2 Caption Frame2 (空白)
Label1 Caption Label1 數值 1

17
Label2 Caption Label2 數值 2
Label3 Caption Label3 結果
TextBox1 Text (空白) (空白)
TextBox2 Text (空白) (空白)
TextBox3 Text (空白) (空白)
OptionButton1 Caption OptionButton1 +
OptionButton1 Value False True
OptionButton2 Caption OptionButton2 -
OptionButton3 Caption OptionButton3 *
OptionButton4 Caption OptionButton4 /
CommandButon1 Caption CommandButon1 執行
CommandButon2 Caption CommandButon2 離開

改變屬性後之視窗如圖 3.2.20 所示。

圖 3.2.20

最後,我們為兩按鍵加入執行程序,分別為當使用者按下「執行」鍵時,執行運算(依據
使用者選取的選鈕決定進行何種運算),當使用者按下「離開」鍵時,離開系統的使用;如下
所示:

Private Sub CommandButton1_Click()


If OptionButton1.Value = True Then
TextBox3.Text = Str(Val(TextBox1.Text) + Val(TextBox2.Text))
End If
If OptionButton2.Value = True Then
TextBox3.Text = Str(Val(TextBox1.Text) - Val(TextBox2.Text))
End If
If OptionButton3.Value = True Then
TextBox3.Text = Str(Val(TextBox1.Text) * Val(TextBox2.Text))

18
End If
If OptionButton4.Value = True Then
TextBox3.Text = Str(Val(TextBox1.Text) / Val(TextBox2.Text))
End If
End Sub
Private Sub CommandButton2_Click()
End
End Sub

在前述程序中,以 Val 函數將由 TextBox1 與 TextBox2 的 Text 屬性中分別取得的字串轉


為數值,進行數值相加(即「Val(TextBox1.Text) + Val(TextBox2.Text)」),再將輸出的值以 Str
函數轉為字串資料,設定至 TextBox3 的 Text 屬性中,因為 Text 屬性的資料型態為字串型態。
「If OptionButton1.Value = True Then …」程式,則用以判斷 OptionButton1 的 Value 屬性
值是否為 True,若是則表示該選紐被選取,則執行 Then 之後的程式,其它以此類推。
設計完後,即可執行程式,程式執行結果如圖 3.2.21 所示,讀者可試著點選不同的選紐,
即可完成不同的計算。

圖 3.2.21

雖然,Excel VBA 可使用的控制項不少,但常用的就是前述幾個控制項,屬性看起來也


很多,但常用的就是前述 2 個屬性,事件也有許多,但常用的除了前述由 CommandButton 驅
動的 Click 外,就是由 UserForm 驅動的 Activate 事件,其可用於當視窗被啟動(Activate)時,
執行的初始事件(也可以使用 Initilize 事件)。例如以下程式:

Private Sub UserForm_Activate()


MsgBox ("Hello! Let's Go")
End Sub

可於系統執行一開始出現訊息視窗。
歸納 Excel VBA 常用的控制項、屬性與驅動事件,如表 3.2.6 所示。

19
表 3.2.6 Excel VBA 常用的控制項、屬性與驅動事件
圖示 名稱 功能 屬性或事件 功能
UserForm 表單視窗 Caption 屬性 更改視窗標題
Activate 事件 設定當視窗載入時的程序
Label 文字標籤 Caption 屬性 更改顯示文字
TextBox 文字輸出入 Text 屬性 更改文字框文字

CommandButton 功能按鍵 Caption 屬性 更改按鍵名稱
Click 事件 設定當按鍵被滑鼠單按時的程

Frame 分類框 Caption 屬性 更改分類框名稱
ComboBox 下拉式表列 Value 屬性 設定下拉式表列之選項

OptionButton 選紐 Caption 屬性 更改選紐名稱


Value 屬性 設定選紐是否(TRUE/FALSE)
選取

程式執行後,很難不出錯,程式偵錯可以在可能出錯的程式碼前「點選」 ,以設定斷點(或
選擇欲作為斷點的程式行,再使用「F9」功能鍵)。
設定後如圖 3.2.22 所示,執行該程式,執行到斷點時,即會停止;使用者可以「F8」功
能鍵單步執行,或按「F5」功能鍵往下執行。欲取消斷點,則再執行一次操作即可(即在欲取
消斷點的程式碼前「點選」,以取消斷點)。

圖 3.2.22

20

You might also like