名称未設定-2

平成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講座ご紹介


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