平成29年度春期基本情報技術者_表計算のマクロをExcelVBAで再現する
目次
1.出典
2.問題で使用するExcelシート「商品重量」「重量区分」「料金計算」のダミーデータの簡単な作り方
3.問題文の要旨
4.問題文(疑似言語)
5.解答群(疑似言語)
6.問題文(VBA翻訳)
7.解答群(VBA翻訳)
8.正解
9.正解を入れたVBA完全版 ※動作確認済み
10.バックナンバー
11.ExcelVBA講座ご紹介
1.出典
経済産業省国家試験(IPA情報処理推進機構)
平成29年度春期 基本情報技術者試験 午後試験 選択問題 問13表計算設問3[解答欄e~f]
なお、試験問題及び正解の著作権はIPA情報処理推進機構に帰属します。
2.問題で使用するExcelシート「商品重量」「重量区分」「料金計算」のダミーデータの簡単な作り方
シート「商品重量」
シート「重量区分」
シート「料金計算」
・B4=10、C4=36、D4=30
・セルE4:=商品重量!$B$3*B4+商品重量!$B$4*C4+商品重量!$B$5*D4
・セルF4:=Match(E4, 重量区分!$D$4:$D$8, 1)
・セルE9~F10:セルE4~F4をコピーする。
・F列のエラーはマクロの実行に影響はない。G~H列はマクロの実行に無関係なので空欄でよい。
3.問題文の要旨
シート「商品重量」の3種類の商品X, Y, Zがある。シート「料金計算」のE9:E10には商品総重量(各商品の重さ*数量の合計)を計算する数式が既に入力されている。4行目の数量の商品を、複数の荷物に分けて発送しようとしている。ただし、1個の荷物の重量が、シート「重量区分」のセルE8(28680g)を超過してはいけないので、28680g以下で最大の重量になるようにマクロを用いて調節したい。
まず、B4:D4をB9:D9に転記する。B9:D9の数量を上限として、B10:D10に個数をいろいろと入れて28680g以下で最大の重量になる組み合わせを探す。その組み合わせを16行目以降に転記するとともに、B9:D9から引く。この残数量が0になるまで繰り返す。
4.問題文(疑似言語)
[マクロ:Package_count]
〇マクロ:Package_count
〇数値型:package_no, i, j, k, m, work_weight
■ i: 0, i<=2, 1
|・相対(B9, 0, i) ← 相対(B4, 0, i)
■
・package_no ← 1
■ E9 > 0
|・相対 (A15, package_no, 0) ← package_no
|・相対 (F15, package_no, 0) ← F9
|・相対 (G15, package_no, 0) ← G9
|・work_weight ← 0
|■ i: 0, i<=B9, 1
||・B10 ← i
||■ j: 0, j<=C9, 1
|||・C10 ← j
|||■ k: 0, k<=D9, 1
||||・D10 ← k
||||▲ [ 解答欄e ]
|||||■ m: 0, m<=3, 1
||||||・相対 (B15, package_no, m) ← 相対 (B10, 0, m)
|||||■
|||||・work_weight ← E10
||||▼
|||■
||■
|■
|■ i: 0, i<=2, 1
||[ 解答欄f ]
|■
|・package_no ← package_no + 1
■
5.解答群(疑似言語)
eに関する解答群
ア 論理積(work_weight < E9, E10 > 重量区分!E8)
イ 論理積(work_weight < E10, E10 <= 重量区分!E8)
ウ 論理積(work_weight > E9, E10 > 重量区分!E8)
エ 論理積(work_weight > E10, E10 <= 重量区分!E8)
fに関する解答群
ア 相対(B9, 0, i) ← 相対(B4, 0, i) - 相対(B10, 0, i)
イ 相対(B9, 0, i) ← 相対(B4, 0, i) - 相対(B15, package_no, i)
ウ 相対(B9, 0, i) ← 相対(B9, 0, i) - 相対(B10, 0, i)
エ 相対(B9, 0, i) ← 相対(B9, 0, i) - 相対(B15, package_no, i)
6.問題文(VBA翻訳)
Sub Package_count()
Dim package_no As Integer, i As Integer, j As Integer, k As Integer, m As Integer, work_weight As Integer
For i = 0 To 2
Range("B9").Offset(0, i) = Range("B4").Offset(0, i)
Next
package_no = 1
Do While Range("E9") > 0
Range("A15").Offset(package_no, 0) = package_no
Range("F15").Offset(package_no, 0) = Range("F9")
Range("G15").Offset(package_no, 0) = Range("G9")
work_weight = 0
For i = 0 To Range("B9")
Range("B10") = i
For j = 0 To Range("C9")
Range("C10") = j
For k = 0 To Range("D9")
Range("D10") = k
If [ 解答欄e ] Then
For m = 0 To 3
Range("B15").Offset(package_no, m) = Range("B10").Offset(0, m)
Next
work_weight = Range("E10")
End If
Next
Next
Next
For i = 0 To 2
[ 解答欄f ]
Next
package_no = package_no + 1
Loop
End Sub
7.解答群(VBA翻訳)
eに関する解答群
ア work_weight < Range("E9") And Range("E10") > Sheets("重量区分").Range("E8")
イ work_weight < Range("E10") And Range("E10") <= Sheets("重量区分").Range("E8")
ウ work_weight > Range("E9") And Range("E10") > Sheets("重量区分").Range("E8")
エ work_weight > Range("E10") And Range("E10") <= Sheets("重量区分").Range("E8")
fに関する解答群
ア Range("B9").Offset(0, i) = Range("B4").Offset(0, i) - Range("B10").Offset(0, i)
イ Range("B9").Offset(0, i) = Range("B4").Offset(0, i) - Range("B15").Offset(package_no, i)
ウ Range("B9").Offset(0, i) = Range("B9").Offset(0, i) - Range("B10").Offset(0, i)
エ Range("B9").Offset(0, i) = Range("B9").Offset(0, i) - Range("B15").Offset(package_no, i)
8.正解
e イ
If文の中にwork_weight ← E10 と保存しているので、E10が28680g以下で、work_weightを超える最高記録であったということである。
f エ
4重ループで相対(B15, package_no, m) ← 相対(B10, 0, m)と保存しているので、相対(B15, package_no, m)を減算して残数量を求めている。
9.正解を入れたVBA完全版 ※動作確認済み
Sub Package_count()
Dim package_no As Integer, i As Integer, j As Integer, k As Integer, m As Integer, work_weight As Integer
For i = 0 To 2
Range("B9").Offset(0, i) = Range("B4").Offset(0, i)
Next
package_no = 1
Do While Range("E9") > 0
Range("A15").Offset(package_no, 0) = package_no
Range("F15").Offset(package_no, 0) = Range("F9")
Range("G15").Offset(package_no, 0) = Range("G9")
work_weight = 0
For i = 0 To Range("B9")
Range("B10") = i
For j = 0 To Range("C9")
Range("C10") = j
For k = 0 To Range("D9")
Range("D10") = k
If work_weight < Range("E10") And Range("E10") <= Sheets("重量区分").Range("E8") Then
For m = 0 To 3
Range("B15").Offset(package_no, m) = Range("B10").Offset(0, m)
Next
work_weight = Range("E10")
End If
Next
Next
Next
For i = 0 To 2
Range("B9").Offset(0, i) = Range("B9").Offset(0, i) - Range("B15").Offset(package_no, i)
Next
package_no = package_no + 1
Loop
End Sub
10.バックナンバー
11.ExcelVBA講座ご紹介
この記事が気に入ったらサポートをしてみませんか?