110 中華郵政招考營運職 壽險精算 Excel VBA及Access VBA程式 考古題詳解

110 年・中華郵政招考・營運職・壽險精算
試題代碼 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 條件式重複結構。
  • 變數在每次迴圈中的累加與更新順序。

原程式的執行條件為:

  1. I 由 11 開始,逐次增加 11。
  2. 每次迴圈執行 Sum = Sum + I。
  3. 當 I >= 5 時,執行 Exit For,立即離開迴圈。

(一)程式執行追蹤

初始值:

Sum = 0
I = 0

進入 For I = 1 To 10 後,逐次追蹤如下:

迴圈次數I 值Sum 累加後是否離開迴圈
110+1=10+1=1否
221+2=31+2=3否
333+3=63+3=6否
446+4=106+4=10否
5510+5=1510+5=15是,執行 Exit For

當 I = 5 時,程式先執行:

Sum = Sum + I

因此 Sum 變成 1515;接著因為 I >= 5,執行 Exit For,不再執行 I = 6 至 I = 10 的迴圈。

最後執行:

MsgBox (Sum)

訊息方塊顯示:

15

(二)改寫為 While ... Wend

解題方法

原程式在 I = 5 時加總後離開,因此迴圈實際執行的 I 值為:

1,2,3,4,51,2,3,4,5

若使用 While ... Wend,可將「繼續執行的條件」直接設定為 I < 5。

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 第二題 題25 分

請以 VBA 語法撰寫一程序(Sub),可以使用 InputBox 語法取得不特定長度的數字串,計算出現次數最高的數字,並以 MsgBox 指令輸出數字 1 出現次數。

即執行該程式後,將先出現如【圖二之 1】的介面,輸入「12123451671」字串,按下「確定」鍵後,可產生如【圖二之 2】的輸出。【25 分】

【圖二之 1】程式輸入介面

【圖二之 2】程式輸出介面

🖼️ 本題原卷含圖表。基於試題來源之版權考量,本站不轉載原卷影像; 題目文字已完整轉錄,圖表請自行參閱考選部公告之試題原檔。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 VBA 的:

  • InputBox:取得使用者輸入的字串。
  • Mid:逐一擷取字串中的每個字元。
  • 陣列計數:以 count(0 To 9) 分別記錄數字 00 至 99 的出現次數。
  • For...Next 迴圈:逐字掃描輸入字串。
  • MsgBox:輸出出現次數最高的數字及其出現次數。

輸入字串為「12123451671」時:

1 出現 4 次,2 出現 2 次1 \text{ 出現 }4\text{ 次},\quad 2 \text{ 出現 }2\text{ 次}

其餘數字各出現 11 次,因此出現次數最高的數字為 11。

解題方法

先建立一個索引為 00 至 99 的陣列:

count(d)=數字 d 的出現次數count(d)=\text{數字 }d\text{ 的出現次數}

再利用 Mid(字串, 位置, 1) 依序取得每一個字元,轉換成數字後,使對應的計數器加 11。

完成計數後,再以另一個迴圈比較 count(0) 至 count(9),找出最大值及其對應數字。

VBA 程式碼

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 第三題 題25 分

請回答下列問題:

(一)除 Integer 外,請列舉 3 個常用的資料類型。【3 分】

(二)函式中以 Dim i As Integer 宣告整數變數,請問整數 ii 的範圍為何?【3 分】

(三)若 n1=13n1=13,n2=7n2=7,result=n1Xor⁡n2result=n1\operatorname{Xor}n2,請問 resultresult 的值為多少?【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 資料類型包括:

  1. String:字串資料,例如 "VBA"
  2. Long:長整數
  3. Double:雙精度浮點數

其他常見類型還包括:

  • Boolean:布林值,True 或 False
  • Date:日期與時間
  • Currency:貨幣數值
  • Variant:可儲存多種資料型態

解題技巧

題目只要求列舉 3 個,寫出常見且明確的資料類型即可,不必說明全部類型。

【答案】

String、Long、Double。


(二)Integer 的數值範圍

核心觀念

VBA 的 Integer 是 16 位元帶正負號的整數,使用 1 位元表示正負號,其餘 15 位元表示數值。

因此範圍為:

−215∼215−1-2^{15} \sim 2^{15}-1

也就是:

−32768∼32767-32768 \sim 32767

解題技巧

VBA 中不要把 Integer 與其他語言的 32 位元整數混淆。VBA 的 Long 才是 32 位元整數,範圍為 −231-2^{31} 至 231−12^{31}-1。

【答案】

整數 ii 的範圍為:

−32768≤i≤32767-32768 \leq i \leq 32767

(三)Xor 位元運算

核心觀念

Xor 是互斥或(Exclusive OR)運算,逐個比較二進位位元:

位元 1位元 2Xor 結果
000
011
101
110

也就是兩個位元不同時結果為 1,相同時結果為 0。

解題方法

將數值轉成二進位:

13=1101213 = 1101_2 7=011127 = 0111_2

逐位進行 Xor:

110101111010\begin{array}{r} 1101\\ 0111\\ \hline 1010 \end{array}

再將 101021010_2 轉回十進位:

1×23+0×22+1×21+0×20=8+2=101\times 2^3+0\times 2^2+1\times 2^1+0\times 2^0 =8+2=10

解題技巧

看到 Xor 時,不能用一般加法或減法處理,必須逐位比較二進位。

【答案】

result=13Xor⁡7=10result=13\operatorname{Xor}7=10

(四)陣列元素數量

核心觀念

陣列宣告如下:

Dim arr(6 To 9) As Integer

表示陣列索引從 6 到 9,包含兩端的索引值。

解題方法

元素個數為:

9−6+1=49-6+1=4

陣列實際包含:

arr(6)、arr(7)、arr(8)、arr(9)

解題技巧

陣列元素數量的計算公式為:

元素數量=上限−下限+1\text{元素數量}=\text{上限}-\text{下限}+1

不可直接用上限減下限,否則會少算一個元素。

【答案】

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

完整位置如下:

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 第四題 題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 函數會產生 00 以上、11 以下但不包含 11 的亂數,即:

0≤Rnd<10 \leq \text{Rnd} < 1

因此,將 Rnd 乘以 100100 後取整數,可得到 00~9999,再加 11 即可轉換為 11~100100。

初始化亂數產生器可使用:

Randomize

解題方法

Dim n As Integer

Randomize
n = Int(Rnd * 100) + 1
MsgBox n

其中:

  • Rnd * 100 的範圍為 00~小於 100100。
  • Int(...) 取不大於該數值的最大整數,因此得到 00~9999。
  • 加 11 後即為 11~100100。

也可寫成:

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 時,先逐一檢查:

  1. 程式參數是否已宣告。
  2. 程式內使用的變數是否已宣告。
  3. 變數名稱是否拼寫一致。

本題的關鍵不在加法,而在 c 未宣告。


(三)函式 calc(5) 的結果

核心觀念

此函式使用遞迴計算階乘。階乘定義為:

n!=n×(n−1)×⋯×2×1n! = n \times (n-1) \times \cdots \times 2 \times 1

且:

0!=1,1!=10! = 1,\qquad 1! = 1

程式中的終止條件為:

If a <= 1 Then
 calc = 1

遞迴條件為:

calc = calc(a - 1) * a

解題方法

依照函式呼叫逐層展開:

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

其他考古題

110 年壽險精算的其他科目