名称未設定-2

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

目次

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

1.出典

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

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

2.問題で使用するExcelシート「学習進捗管理」の簡単な作り方

3.問題文の要旨

単元は100~1200の100刻みである。項目のIDは、属する単元のIDの下2桁を01から始まる連番にしたものである。セルO2に学習を開始したい項目IDを入力する。その項目が学習開始可能で、かつ学習開始日が空値の場合に学習開始日(本日)を設定する。さらに、単元の学習開始日が空値の場合には単元の学習開始日にも同じ日(本日)を設定する。マクロを用いて本日の日付を入力したい。ただし、本日()はこの関数を実行した日のシリアル値を整数値で返す。

4.問題文(疑似言語)

ループもないようなアルゴリズムの問題は論外です。

[マクロ:StartLearning]
〇マクロ:StartLearning
〇数値型:ItemRow, UnitRow
・ItemRow ← 照合一致(O2, I2~I53, 0)
・UnitRow ← 照合一致(切り捨て(O2, -2), A2~A13, 0)
▲ 論理積([ 解答欄e ])
|・相対(L1, ItemRow, 0) ← 本日()
|▲ 相対(E1, UnitRow, 0) = null
||・相対(E1, UnitRow, 0) ← [ 解答欄f ]
|▼
▼

5.解答群(疑似言語)

eに関する解答群
 ア 表引き(K2~K53, ItemRow, 1) = '可', 表引き(E2~E53, UnitRow, 1) = null
 イ 表引き(K2~K53, ItemRow, 1) = '可', 表引き(E2~E53, UnitRow, 1) <> null
 ウ 表引き(K2~K53, ItemRow, 1) = '可', 表引き(L2~L53, ItemRow, 1) = null
 エ 表引き(K2~K53, ItemRow, 1) = '可', 表引き(L2~L53, ItemRow, 1) <> null
 オ 表引き(K2~K53, ItemRow, 1) = '不可', 表引き(E2~E53, UnitRow, 1) = null
 カ 表引き(K2~K53, ItemRow, 1) = '不可', 表引き(E2~E53, UnitRow, 1) <> null
 キ 表引き(K2~K53, ItemRow, 1) = '不可', 表引き(L2~L53, ItemRow, 1) = null
 ク 表引き(K2~K53, ItemRow, 1) = '不可', 表引き(L2~L53, ItemRow, 1) <> null

fに関する解答群
 ア 表引き(E2~E53, ItemRow, 1)
 イ 表引き(F2~F53, ItemRow, 1)
 ウ 表引き(F2~F53, UnitRow, 1)
 エ 表引き(L2~L53, ItemRow, 1)
 オ 表引き(L2~L53, UnitRow, 1)
 カ 表引き(M2~M53, ItemRow, 1)
 キ 表引き(M2~M53, UnitRow, 1)

6.問題文(VBA翻訳)

Sub StartLearning()
   Dim ItemRow As Integer, UnitRow As Integer
   ItemRow = WorksheetFunction.Match(Range("O2"), Range("I2:I53"), 0)
   UnitRow = WorksheetFunction.Match(WorksheetFunction.RoundDown(Range("O2"), -2), Range("A2:A13"), 0)
   Do While [ 解答欄e ]
       Range("L1").Offset(ItemRow, 0) = Date
       If Range("E1").Offset(UnitRow, 0) = "" Then
           Range("E1").Offset(UnitRow, 0) = [ 解答欄f ]
       End If
   Loop
End Sub

7.解答群(VBA翻訳)

eに関する解答群

 ア WorksheetFunction.Index(Range("K2:K53"), ItemRow, 1) = "可" And WorksheetFunction.Index(Range("E2:E53"), UnitRow, 1) = ""
 イ WorksheetFunction.Index(Range("K2:K53"), ItemRow, 1) = "可" And WorksheetFunction.Index(Range("E2:E53"), UnitRow, 1) <> ""
 ウ WorksheetFunction.Index(Range("K2:K53"), ItemRow, 1) = "可" And WorksheetFunction.Index(Range("L2:L53"), ItemRow, 1) = ""
 エ WorksheetFunction.Index(Range("K2:K53"), ItemRow, 1) = "可" And WorksheetFunction.Index(Range("L2:L53,") ItemRow, 1) <> ""
 オ WorksheetFunction.Index(Range("K2:K53"), ItemRow, 1) = "不可" And WorksheetFunction.Index(Range("E2:E53"), UnitRow, 1) = ""
 カ WorksheetFunction.Index(Range("K2:K53"), ItemRow, 1) = "不可" And WorksheetFunction.Index(Range("E2:E53"), UnitRow, 1) <> ""
 キ WorksheetFunction.Index(Range("K2:K53"), ItemRow, 1) = "不可" And WorksheetFunction.Index(Range("L2:L53"), ItemRow, 1) = ""
 ク WorksheetFunction.Index(Range("K2:K53"), ItemRow, 1) = "不可" And WorksheetFunction.Index(Range("L2:L53"), ItemRow, 1) <> ""

fに関する解答群

 ア WorksheetFunction.Index(Range("E2:E53"), ItemRow, 1)
 イ WorksheetFunction.Index(Range("F2:F53"), ItemRow, 1)
 ウ WorksheetFunction.Index(Range("F2:F53"), UnitRow, 1)
 エ WorksheetFunction.Index(Range("L2:L53"), ItemRow, 1)
 オ WorksheetFunction.Index(Range("L2:L53"), UnitRow, 1)
 カ WorksheetFunction.Index(Range("M2:M53"), ItemRow, 1)
 キ WorksheetFunction.Index(Range("M2:M53"), UnitRow, 1)

8.正解

e ウ
「その項目が学習可能で空値である」=「I~Mで'可' And null」で答えが出る。
f エ
単元の学習開始日がなければ、本日()を入れたらいいので表引きを使う必要もない。あえて使うのであれば相対(L1, ItemRow, 0)と同じ意味の表引き(L2~L53, ItemRow, 1)しかない。

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

Sub StartLearning()
   Dim ItemRow As Integer, UnitRow As Integer
   ItemRow = WorksheetFunction.Match(Range("O2"), Range("I2:I53"), 0)
   UnitRow = WorksheetFunction.Match(WorksheetFunction.RoundDown(Range("O2"), -2), Range("A2:A13"), 0)
   Do While WorksheetFunction.Index(Range("K2:K53"), ItemRow, 1) = "可" And WorksheetFunction.Index(Range("L2:L53"), ItemRow, 1) = ""
       Range("L1").Offset(ItemRow, 0) = Date
       If Range("E1").Offset(UnitRow, 0) = "" Then
           Range("E1").Offset(UnitRow, 0) = WorksheetFunction.Index(Range("L2:L53"), ItemRow, 1)
       End If
   Loop
End Sub

10.バックナンバー

11.ExcelVBA講座ご紹介


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