名称未設定-2

平成26年度秋期基本情報技術者_表計算のマクロをExcelVBAで再現する

目次

1.出典
2.問題で使用するExcelシート「路線情報」「運賃情報」のダミーデータの簡単な作り方
3.問題文の要旨
4.問題文(疑似言語)
5.解答群(疑似言語)
6.問題文(VBA翻訳)
7.解答群(VBA翻訳)
8.正解
9.正解を入れたVBA完全版 ※動作確認済み
10.バックナンバー
11.ExcelVBA講座ご紹介

1.出典

経済産業省国家試験(IPA情報処理推進機構)
平成26年度秋期 基本情報技術者試験 午後試験 選択問題 問13表計算設問2[解答欄f~g]

なお、試験問題及び正解の著作権はIPA情報処理推進機構に帰属します。

2.問題で使用するExcelシート「路線情報」「運賃情報」のダミーデータの簡単な作り方

シート「路線情報」

・A2~A33:=RIGHT("000"&ROW()-1,3)
・B2~B33:=INT(RAND()*40+10)/10
・B列はRand()を使ってダミーのデータを入力しているので値の貼り付けをして数式を消しておくこと。

シート「運賃情報」

3.問題文の要旨

起点駅001~終点駅032の32の駅からなる鉄道路線があり、分岐はない。シート「路線情報」は次の駅までの距離を示していて、セルB33は終点なので0である。

運賃はシート「運賃情報」の基本運賃+乗車した距離の運賃である。現在、距離運賃は10kmまでの部分が1kmごとに10円、40kmまでの部分が3kmごとに20円、70kmまでの部分が5kmごとに30円、70km超の部分が10kmごとに50円(端数はそれぞれ単位距離で切り上げ)で、これらを合算した額である。この料金の見直しをしようとしている。マクロを用いてB5:B7を次のように変更したい。

・B5:隣接駅間の最大値の小数点以下切り上げ
・B6:5つ離れた駅までの距離の最大値を、区分2の単位距離で切り上げた値
・B7:鉄道全区間の50%を、区分3の単位距離で切り上げた値

4.問題文(疑似言語)

[マクロ:Change_SectionInfo]
〇マクロChange_SectionInfo
〇数値型:I, J
〇数値型:Dist1, Dist2, Dist3, Sum2
・Dist1 ← 最大(路線情報!B2~B32)
・Dist2 ← 0
■ I: 0, i<=26, 1
|・Sum2 ← 相対(路線情報!B2, I, 0)
|■ [ 解答欄f ], 1
||・Sum2 ← Sum2 + 相対(路線情報!B2, I + J, 0)
|■
|▲ Sum2 > Dist2
||・Dist2 ← Sum2
|▼
■
・Dist3 ← 合計(路線情報!B2~B32) * 0.5
・B5 ← 切り上げ(Dist1 / C5, 0) * C5
・B6 ← 切り上げ([ 解答欄g1 ] / C6, 0) * C6 + B5
・B7 ← 切り上げ([ 解答欄g2 ] / C7, 0) * C7 + B6

5.解答群(疑似言語)

fに関する解答群
 ア J:0, J<=4
 イ J:1, J<=4
 ウ J:0, J<=5
 エ J:1, J<=5
 オ J:0, J<=31
 カ J:1, J<=31

gに関する解答群([g1]と[g2]の組み合わせを選ぶ)
 ア [g1] Dist2 [g2] Dist3
 イ [g1] (Dist2-B5) [g2] (Dist3-B6)
 ウ [g1] (Dist2-Dist1) [g2] (Dist3-Dist2)
 エ [g1] (Dist2-B5+1) [g2] (Dist3-B6+1)
 オ [g1] (Dist2-Dist1+1) [g2] (Dist3-Dist2+1)

6.問題文(VBA翻訳)

Sub Change_SectionInfo()
   Dim I As Integer, J As Integer
   Dim Dist1 As Single, Dist2 As Single, Dist3 As Single, Sum2 As Single
   Dist1 = WorksheetFunction.Max(Sheets("路線情報").Range("B2:B32"))
   Dist2 = 0
   For I = 0 To 26
       Sum2 = Sheets("路線情報").Range("B2").Offset(I, 0)
       For [ 解答欄f ]
           Sum2 = Sum2 + Sheets("路線情報").Range("B2").Offset(I + J, 0)
       Next
       If Sum2 > Dist2 Then
           Dist2 = Sum2
       End If
   Next
   Dist3 = WorksheetFunction.Sum(Sheets("路線情報").Range("B2:B32")) * 0.5
   Range("B5") = WorksheetFunction.RoundUp(Dist1 / Range("C5"), 0) * Range("C5")
   Range("B6") = WorksheetFunction.RoundUp([ 解答欄g1 ] / Range("C6"), 0) * Range("C6") + Range("B5")
   Range("B7") = WorksheetFunction.RoundUp([ 解答欄g2 ] / Range("C7"), 0) * Range("C7") + Range("B6")
End Sub

7.解答群(VBA翻訳)

fに関する解答群

 ア For J = 0 To 4
 イ For J = 1 To 4
 ウ For J = 0 To 5
 エ For J = 1 To 5
 オ For J = 0 To 31
 カ For J = 1 To 31

gに関する解答群

 ア [g1] Dist2    [g2] Dist3
 イ [g1] (Dist2-Range("B5"))    [g2] (Dist3-Range("B6"))
 ウ [g1] (Dist2-Dist1)    [g2] (Dist3-Dist2)
 エ [g1] (Dist2-Range("B5")+1)    [g2] (Dist3-Range("B6")+1)
 オ [g1] (Dist2-Dist1+1)    [g2] (Dist3-Dist2+1)

8.正解

問題文の説明がもうすこし分かりやすくならないものかと思ってしまいますが、簡単に言えば「逓減」の計算です。
f イ
5つ先の駅までの距離(累計)を求めますが、J=0とすると相対(路線情報!B2, I, 0)と重複するので、J=1~4となる。
g イ
15分単位のように切り上げの単位が変則的な場合、RoundUpの前後で加減や乗除をするのはよくあるパターン。C6やC7で割ってからかけているのがポイント。B5, B6を引いてから最後に足すというパターン。

9.正解を入れたVBA完全版 ※動作確認済み

Sub Change_SectionInfo()
   Dim I As Integer, J As Integer
   Dim Dist1 As Single, Dist2 As Single, Dist3 As Single, Sum2 As Single
   Dist1 = WorksheetFunction.Max(Sheets("路線情報").Range("B2:B32"))
   Dist2 = 0
   For I = 0 To 26
       Sum2 = Sheets("路線情報").Range("B2").Offset(I, 0)
       For J = 1 To 4
           Sum2 = Sum2 + Sheets("路線情報").Range("B2").Offset(I + J, 0)
       Next
       If Sum2 > Dist2 Then
           Dist2 = Sum2
       End If
   Next
   Dist3 = WorksheetFunction.Sum(Sheets("路線情報").Range("B2:B32")) * 0.5
   Range("B5") = WorksheetFunction.RoundUp(Dist1 / Range("C5"), 0) * Range("C5")
   Range("B6") = WorksheetFunction.RoundUp((Dist2 - Range("B5")) / Range("C6"), 0) * Range("C6") + Range("B5")
   Range("B7") = WorksheetFunction.RoundUp((Dist3 - Range("B6")) / Range("C7"), 0) * Range("C7") + Range("B6")
End Sub

10.バックナンバー

11.ExcelVBA講座ご紹介


この記事が気に入ったらサポートをしてみませんか?