You are on page 1of 20

Excel VBA 作資訊系統開發

程式設計相較於使用套裝軟體而言,是操作資訊時代工具(電腦),最直接、最有彈性、

最有潛力(可以設計出所有軟體)的方式。如前所述,程式是指令的集合,但這些指令必須以

特定的語法組合起來,其過程包括:

1. 解析希望電腦幫我們完成的程序工作,將之標準化、合理化,並分析是否適合電腦來作,

若是,則可以準備將之程式化。

2. 分解該程序工作至逐步程序,此即演算法(Algorithm)

3. 以程式指令與語法將演算程序轉為程式語法。

4. 反覆「執行、偵錯」,直到系統執行正確無誤。

5. 由簡入繁逐步改進程式(系統)功能(此即所謂漸進開發策略)

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

3.2.1

BASIC

VB(VB; VBA; ASP; VBScript)

C(C++; Java; C#)

順序結構(以下說明為 BASIC 語法之逐行解釋)

 

1.

由鍵盤取得數值輸入,並存入變數 A

2.

將變數 A 值取出,加上 1(+1),存入變數 A(=A)

3.

由螢幕印出變數 A 的值

 

1

Input A

A = InputBox(“Input No#:”)

#include <iostream.h> void main() {float A; cin>>A; A = A + 1; cout<<A;}

2

A

= A + 1

A = A + 1

3

Print A

MsgBox(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 MsgBox(A)

void main() {float A;

-1*A

3

Print A+1

Else

cin>>A;

1

   

MsgBox(-1*A)

if (A >= 0) {cout<<A} else { cout<<-1*A }

End If

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> void main() {float A; int I cout<<”Input No#:”; cin>>A;

for (I = 1; I <= 5; I++) {if (A >= 0) {cout<<A}}

2

Input A

A

= InputBox(“Input No#:”)

3

If A>=0 Then Print A

If

A>=0 Then MsgBox(A)

4

Next I

Next I

 
 

}

經過以上的學習,讀者大概已經了解程式語言的基本結構與原理,但為了能確實完成「編 碼」、「執行」與「輸出」的程序(而非紙上談兵),我們選擇 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.2Book1 – Module(程式碼)」視窗中編輯程式碼,程式碼必須包含在「Sub … End Sub」間,且給予該程序名稱(例如圖 3.2.3 Test),編輯完後如圖 3.2.3 所示。

2

圖 3.2.1 圖 3.2.2 圖 3.2.3 5. 編輯完程式碼後,以功能表之「執行 執行 Sub 或 UserForm

3.2.1

圖 3.2.1 圖 3.2.2 圖 3.2.3 5. 編輯完程式碼後,以功能表之「執行 執行 Sub 或 UserForm

3.2.2

圖 3.2.1 圖 3.2.2 圖 3.2.3 5. 編輯完程式碼後,以功能表之「執行 執行 Sub 或 UserForm

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)

A 中 ( 即 A=5) 。 圖 3.2.4 7. 隨即,可出現如圖 3.2.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.5

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

程式之判斷結構程式碼。如圖 3.2.6 所示。 圖 3.2.6 執行後,若輸入為正數 ( 如 5)

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)」之程式碼。

」與「 If A >= 0 Then MsgBox (A) 」之程式碼。 圖 3.2.7 建構程式交易環境必須學習的 VBA

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 所示。

列、第 1 欄」內;執行後如圖 3.2.8 所示。 圖 3.2.8 4. 運算子

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:」磁碟機根目錄中。

」為檔案名,存於「 C: 」磁碟機根目錄中。 圖 3.2.9 接下來於 Test 程序 (Sub)

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 個變數值,分別存入 ABC 中。 「Cells(1, 1) = A」將讀入的變數 A 值,存入工作表 A1 位置,其它 2 行以此類推。 「Close 1」程式可將打開的指定檔案關閉。 上述程式行後可將圖 3.2.10 左側的「InFile.txt」檔案,讀入、處理後,輸出到右側試算 表格位中。

7

圖 3.2.10 上述程式僅能讀入一列資料,如果希望讀入多列資料,就必須使用「重複 ( 迴圈 )

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 轉為 FalseFalse 轉為 True)。因此「While Not EOF(1)」即為「當未到檔尾, 則執行 While Wend 間的程式段」之意。

8

上述程式行後可將圖 3.2.11 左側的「InFile.txt」檔案,讀入、處理後,輸出到右側試算表 格位中。

格位中。 圖 3.2.11 6. 輸出到外部文字檔案

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 變數中,輸入資料已經被存入 ABC

9

之變數陣列中(由於無法事先得知輸入檔案的資料筆數,因此在宣告變數陣列時,可以宣告得 大一些);因此輸出時,僅需以無條件迴圈輸出 Count 筆資料。 上述程式行後可將圖 3.2.12 左側的「InFile.txt」檔案,讀入、處理後,輸出到右側的輸 出文字檔(OutFile.txt)中。

出文字檔 ( 即 OutFile.txt) 中。 圖 3.2.12 7. 程序與函式的呼叫 前述以「 Sub

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)

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, Long, Single, Double, String)

Dim A as Integer Dim B(10, 5) As Single 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

 

End If

MsgBox(“Fail”) End If

迴圈(重複)命令

 
 

9 For I = 1 To n

無條件判斷迴圈

For I =1 To 10 For J = 1 To 5 Cells(I, J) = I + J Next J Next I

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) MySub

 

呼叫函數

Range(“B1”).Value=MyAdd(3,4)

或程序

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

1. 點選控制項

2. 點選表單中控制項放置位置

3. 調整控制項位置與大小

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

3.2.15

15

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

視窗。 圖 3.2.16

3.2.16

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

Excel VBA 指令所組成的程序。 圖 3.2.17 例如若希望當圖 3.2.17 的 UserForm

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

3.2.18

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

(CommandButton) 、 4 個選紐 (OptionButton) 。 圖 3.2.19

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 所示。 圖 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

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 屬性 更改視窗標題

UserForm

表單視窗

Caption 屬性

更改視窗標題

 

Activate 事件 設定當視窗載入時的程序

Label 文字標籤 Caption 屬性 更改顯示文字

Label

文字標籤

Caption 屬性

更改顯示文字

TextBox 文字輸出入 Text 屬性 更改文字框文字

TextBox

文字輸出入

Text 屬性

更改文字框文字

CommandButton 功能按鍵 Caption 屬性 更改按鍵名稱

CommandButton

功能按鍵

Caption 屬性

更改按鍵名稱

Click 事件

設定當按鍵被滑鼠單按時的程

Frame 分類框 Caption 屬性 更改分類框名稱

Frame

分類框

Caption 屬性

更改分類框名稱

ComboBox 下拉式表列   Value 屬性 設定下拉式表列之選項

ComboBox

下拉式表列

 

Value 屬性 設定下拉式表列之選項

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

OptionButton

選紐

Caption 屬性

更改選紐名稱

Value 屬性

設定選紐是否(TRUE/FALSE)

選取

程式執行後,很難不出錯,程式偵錯可以在可能出錯的程式碼前「點選」,以設定斷點(

選擇欲作為斷點的程式行,再使用「F9」功能鍵)

設定後如圖 3.2.22 所示,執行該程式,執行到斷點時,即會停止;使用者可以「F8」功

能鍵單步執行,或按「F5」功能鍵往下執行。欲取消斷點,則再執行一次操作即可(即在欲取

消斷點的程式碼前「點選」,以取消斷點)

( 即在欲取 消斷點的程式碼前「點選」,以取消斷點 ) 。 圖 3.2.22 20

3.2.22

20