Professional Documents
Culture Documents
程式設計相較於使用套裝軟體而言,是操作資訊時代工具(電腦),最直接、最有彈性、
最有潛力(可以設計出所有軟體)的方式。如前所述,程式是指令的集合,但這些指令必須以
特定的語法組合起來,其過程包括:
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
圖 3.2.4
7. 隨即,可出現如圖 3.2.5 之結果,即經 A=A+1 後,變數 A 為 6 之結果。按「確定」鍵即
可結束程式執行。
3
圖 3.2.5
圖 3.2.6
圖 3.2.7
1. 變數宣告指令—「Dim」
首先,變數使用前最好能事先宣告,以便電腦可以適當的幫該變數保留合適的記憶體空
間,雖然 VBA 並不強制要求變數使用前必須事先宣告(因此之前我們寫的程式都可以執行),
但在 VB 7.0 版本以後,以及 C 語言中,就強制要求變數使用前必須先行宣告,因此最好能現
在就維持好習慣。VBA 中的變數型態有多種,但常用的包括表 3.2.2 中的幾種。
表 3.2.2 中的一般整數僅能存「-32768~32768」之整數,長整數能儲存的數值範圍就更廣;
同理,雙倍精密度能儲存之實數(不管是極大或極小的數),較之單倍精密度為廣。其實,以
現有記憶體之巨大與便宜,在財務計算上,不妨整數就宣告成 Long,包含小數的數則宣告為
Double。 由表 3.2.2 中亦可知,變數名稱要盡量「有意義」,以便望文生義,知道該變數儲存
何種資料,例如以 Age 當作存年齡的變數。
2. 陣列變數
變數也可以代表一群同類型的資料,例如要存整班 50 個同學 5 個科目的成績,不需宣告
成 250(=50*5)個變數,僅需如下宣告即可。
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
圖 3.2.8
4. 運算子
在前述程式中,我們已經使用了算術運算子(即「+」)以及關係運算子(即「>=」),此外
程式中還有作邏輯判斷的邏輯運算子。整理如表 3.2.3 所示。
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
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
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
圖 3.2.11
6. 輸出到外部文字檔案
上述程式完成讀入資料檔的功能,若要經過處理後輸出,則可用以下程式:
圖 3.2.12
7. 程序與函式的呼叫
前述以「Sub … End Sub」含括程式碼之程式稱為「程序」
,除了程序外,也可以定義「函
式」,兩者都可以被其他程序或函式所呼叫(即當作其他程式的「副程式」)。
定義函式的方式如下:
以上函式之功能為輸入兩數值,相加後輸出,輸入參數值與輸出函式值均為倍精度
(Double)。定義好的函式可被其他程序呼叫,例如:
Sub Test2()
Dim A As Integer
A = MyAdd(3, 4)
MsgBox (A)
End Sub
10
圖 3.2.13
函式(Function)與程序(Sub)不同之處,在於函式必須要有輸入參數,但程序不必一定需
要,此外函式定義後,可以在試算表中當作使用者自訂函式使用。
與函式一樣,程序也可被呼叫,直接以程序名稱呼叫即可。
在程序或函式中也可呼叫 Excel 試算表函數,例如:
A= Application. Sum(x1,x2)
8. 其它未提及但重要的指令
(1) 為程式加入註解—「’」
為程式加入註解是一個好的習慣,方便別人也方便自己未來維護系統,程式註解行不影響
程式執行,純粹說明用,以前一範例為例,可加入註解行以區別文字檔輸入區段與輸出區段。
使用「:」將兩行程式併為 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
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
「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
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
最後,我們為兩按鍵加入執行程序,分別為當使用者按下「執行」鍵時,執行運算(依據
使用者選取的選鈕決定進行何種運算),當使用者按下「離開」鍵時,離開系統的使用;如下
所示:
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
圖 3.2.21
可於系統執行一開始出現訊息視窗。
歸納 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 屬性 設定下拉式表列之選項
程式執行後,很難不出錯,程式偵錯可以在可能出錯的程式碼前「點選」 ,以設定斷點(或
選擇欲作為斷點的程式行,再使用「F9」功能鍵)。
設定後如圖 3.2.22 所示,執行該程式,執行到斷點時,即會停止;使用者可以「F8」功
能鍵單步執行,或按「F5」功能鍵往下執行。欲取消斷點,則再執行一次操作即可(即在欲取
消斷點的程式碼前「點選」,以取消斷點)。
圖 3.2.22
20