110 中華郵政招考營運職 壽險精算 Excel VBA及Access VBA程式 考古題詳解
第 第一題 題25 分
請回答下列問題:
(一)追蹤以下程式的執行,請問將產生何種輸出結果?【5 分】
Sub P1() Dim Sum As Integer, I As Integer Sum = 0: I = 0 For I = 1 To 10 Sum = Sum + I If I >= 5 Then Exit For Next I MsgBox (Sum) End Sub
(二)若以上程式改以條件式重複結構(While … Wend)撰寫,不使用 If … Then 判斷結構與 For … Next 重複結構,應如何改寫?【20 分】
登入後即可作答並保存紀錄。
核心觀念
本題考查 VBA 的:
For ... Next計數迴圈。Exit For提前離開迴圈。While ... Wend條件式重複結構。- 變數在每次迴圈中的累加與更新順序。
原程式的執行條件為:
I由 開始,逐次增加 。- 每次迴圈執行
Sum = Sum + I。 - 當
I >= 5時,執行Exit For,立即離開迴圈。
(一)程式執行追蹤
初始值:
Sum = 0
I = 0
進入 For I = 1 To 10 後,逐次追蹤如下:
| 迴圈次數 | I 值 | Sum 累加後 | 是否離開迴圈 |
|---|---|---|---|
| 1 | 1 | 否 | |
| 2 | 2 | 否 | |
| 3 | 3 | 否 | |
| 4 | 4 | 否 | |
| 5 | 5 | 是,執行 Exit For |
當 I = 5 時,程式先執行:
Sum = Sum + I
因此 Sum 變成 ;接著因為 I >= 5,執行 Exit For,不再執行 I = 6 至 I = 10 的迴圈。
最後執行:
MsgBox (Sum)
訊息方塊顯示:
15
(二)改寫為 While ... Wend
解題方法
原程式在 I = 5 時加總後離開,因此迴圈實際執行的 I 值為:
若使用 While ... Wend,可將「繼續執行的條件」直接設定為 I < 5。
第 第二題 題25 分
請以 VBA 語法撰寫一程序(Sub),可以使用 InputBox 語法取得不特定長度的數字串,計算出現次數最高的數字,並以 MsgBox 指令輸出數字 1 出現次數。
即執行該程式後,將先出現如【圖二之 1】的介面,輸入「12123451671」字串,按下「確定」鍵後,可產生如【圖二之 2】的輸出。【25 分】
【圖二之 1】程式輸入介面
【圖二之 2】程式輸出介面
登入後即可作答並保存紀錄。
核心觀念
本題考查 VBA 的:
InputBox:取得使用者輸入的字串。Mid:逐一擷取字串中的每個字元。- 陣列計數:以
count(0 To 9)分別記錄數字 至 的出現次數。 For...Next迴圈:逐字掃描輸入字串。MsgBox:輸出出現次數最高的數字及其出現次數。
輸入字串為「12123451671」時:
其餘數字各出現 次,因此出現次數最高的數字為 。
解題方法
先建立一個索引為 至 的陣列:
再利用 Mid(字串, 位置, 1) 依序取得每一個字元,轉換成數字後,使對應的計數器加 。
完成計數後,再以另一個迴圈比較 count(0) 至 count(9),找出最大值及其對應數字。
VBA 程式碼
第 第三題 題25 分
請回答下列問題:
(一)除 Integer 外,請列舉 3 個常用的資料類型。【3 分】
(二)函式中以 Dim i As Integer 宣告整數變數,請問整數 的範圍為何?【3 分】
(三)若 ,,,請問 的值為多少?【3 分】
(四)函式中以 Dim arr(6 To 9) As Integer 宣告陣列,請問 arr 最多可以儲存多少整數值?【3 分】
(五)請於 Next i 之後,以不影響 arr 現有資料的前提下,新增程式碼以擴充 arr 大小至 10 個元素。【3 分】
Dim i As Integer ReDim arr(5) As Integer
For i = 1 To 5 arr(i) = i Next i
(六)在子程序或函式間傳遞變數,可透過 ByRef 和 ByVal 關鍵字描述,請說明兩者差異以及 VBA 預設使用方式。【4 分】
(七)請寫出把除錯資料(debug_msg)輸出到即時運算視窗中的語法。【3 分】
Dim i As Integer Dim debug_msg As String
For i = 1 To 5 debug_msg = "i = " & i Next i
(八)請修改下方程式碼,使其可在訊息對話框中顯示「確定」和「取消」按鈕。【3 分】
MsgBox "在對話框顯示確定和取消按鈕"
登入後即可作答並保存紀錄。
核心觀念
本題考查 VBA 的基本語法與資料處理,包括:
- 常用資料類型及其儲存範圍
- 整數的二進位位元運算
- 陣列索引與元素數量
ReDim Preserve動態調整陣列ByRef與ByVal傳遞方式- 即時運算視窗除錯輸出
MsgBox按鈕樣式常數
(一)常用資料類型
解題方法
除 Integer 外,常用的 VBA 資料類型包括:
String:字串資料,例如"VBA"Long:長整數Double:雙精度浮點數
其他常見類型還包括:
Boolean:布林值,True或FalseDate:日期與時間Currency:貨幣數值Variant:可儲存多種資料型態
解題技巧
題目只要求列舉 3 個,寫出常見且明確的資料類型即可,不必說明全部類型。
【答案】
String、Long、Double。
(二)Integer 的數值範圍
核心觀念
VBA 的 Integer 是 16 位元帶正負號的整數,使用 1 位元表示正負號,其餘 15 位元表示數值。
因此範圍為:
也就是:
解題技巧
VBA 中不要把 Integer 與其他語言的 32 位元整數混淆。VBA 的 Long 才是 32 位元整數,範圍為 至 。
【答案】
整數 的範圍為:
(三)Xor 位元運算
核心觀念
Xor 是互斥或(Exclusive OR)運算,逐個比較二進位位元:
| 位元 1 | 位元 2 | Xor 結果 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
也就是兩個位元不同時結果為 1,相同時結果為 0。
解題方法
將數值轉成二進位:
逐位進行 Xor:
再將 轉回十進位:
解題技巧
看到 Xor 時,不能用一般加法或減法處理,必須逐位比較二進位。
【答案】
(四)陣列元素數量
核心觀念
陣列宣告如下:
Dim arr(6 To 9) As Integer
表示陣列索引從 6 到 9,包含兩端的索引值。
解題方法
元素個數為:
陣列實際包含:
arr(6)、arr(7)、arr(8)、arr(9)
解題技巧
陣列元素數量的計算公式為:
不可直接用上限減下限,否則會少算一個元素。
【答案】
arr 最多可以儲存 4 個整數值。
(五)使用 ReDim Preserve 擴充陣列
核心觀念
ReDim:重新設定陣列大小。Preserve:重新設定大小時保留原有資料。- 未指定下限時,VBA 陣列預設下限為 0。
原程式:
Dim i As Integer
ReDim arr(5) As Integer
For i = 1 To 5
arr(i) = i
Next i
此時 arr(5) 實際上代表索引範圍:
arr(0) 至 arr(5)
共 6 個元素;其中 arr(1) 至 arr(5) 已儲存資料。
解題方法
若要擴充為「總共 10 個元素」,索引應為 0 To 9,因此程式碼為:
ReDim Preserve arr(9) As Integer
完整位置如下:
第 第四題 題25 分
請依照下列說明撰寫程式碼:
(一)請撰寫程式碼取得一個介於 1~100 的亂數值,並描述初始化亂數產生器可以使用何種陳述式?【5 分】
(二)請說明執行下方副程式 calc 6,8 的顯示結果,理由為何?【7 分】
Option Explicit
Sub calc(a As Integer, b As Integer) c = a + b MsgBox "a + b = " & c End Sub
(三)執行以下函式 result = calc(5),請問 result 的值為多少?【7 分】
Function calc(a As Integer) If a <= 1 Then calc = 1 Else calc = calc(a - 1) * a End If End Function
(四)請完成下列程式碼,新增一筆紀錄 UserName = "A 先生"、UserAge = 18 到 Users 資料表中。【6 分】
Dim db As Database Dim exec As QueryDef Dim sql As String
Set db = OpenDatabase("C:\Northwind.accdb")
登入後即可作答並保存紀錄。
(一)取得 1~100 的亂數值
核心觀念
VBA 的 Rnd 函數會產生 以上、 以下但不包含 的亂數,即:
因此,將 Rnd 乘以 後取整數,可得到 ~,再加 即可轉換為 ~。
初始化亂數產生器可使用:
Randomize
解題方法
Dim n As Integer
Randomize
n = Int(Rnd * 100) + 1
MsgBox n
其中:
Rnd * 100的範圍為 ~小於 。Int(...)取不大於該數值的最大整數,因此得到 ~。- 加 後即為 ~。
也可寫成:
n = Int((100 * Rnd) + 1)
解題技巧
Rnd 本身不會保證每次程式執行都從不同的亂數序列開始,因此通常在產生亂數前使用 Randomize 初始化。考試時應同時寫出:
Randomize
Rnd
(二)執行 calc 6, 8 的結果
核心觀念
題目前方有:
Option Explicit
此陳述式要求所有變數都必須先使用 Dim、Private、Public 等方式宣告。
副程式中雖然宣告了參數:
Sub calc(a As Integer, b As Integer)
但變數 c 未曾宣告:
c = a + b
解題方法
執行程式時,VBA 會在編譯階段發現 c 未宣告,產生:
Variable not defined
亦即「變數未定義」的編譯錯誤。
因此:
- 不會正常執行
c = a + b。 - 不會顯示
a + b = 14的訊息框。 calc 6, 8的呼叫無法順利完成。
正確修正方式是在副程式內宣告 c:
Option Explicit
Sub calc(a As Integer, b As Integer)
Dim c As Integer
c = a + b
MsgBox "a + b = " & c
End Sub
修正後,執行:
calc 6, 8
才會顯示:
a + b = 14
解題技巧
看到 Option Explicit 時,先逐一檢查:
- 程式參數是否已宣告。
- 程式內使用的變數是否已宣告。
- 變數名稱是否拼寫一致。
本題的關鍵不在加法,而在 c 未宣告。
(三)函式 calc(5) 的結果
核心觀念
此函式使用遞迴計算階乘。階乘定義為:
且:
程式中的終止條件為:
If a <= 1 Then
calc = 1
遞迴條件為:
calc = calc(a - 1) * a
解題方法
依照函式呼叫逐層展開: