Section J 5段階評価作成 |
作成の基本方針
・「5段階評価−生徒名」のシート名で各生徒毎の5段階評価ページを作成する。
・学期の違い、選択教科の評価時期の違い(1年2学期、2,3年3学期と仮定)により、
マクロの実行コード範囲が異なるので、ユーザーフォームのコマンドボタンから実行
する方式とする。
・名簿欄表示画面上から、5段階評価ページを作成したい生徒のセル範囲を選択可能
とする。
J-1 マクロ選択用ユーザーフォーム
セクション末尾に掲げた「通知表Readme」シートの「5段階評価作成手順」にあるマクロ
ボタン「評価作成実行」を押すと、次のユーザーフォームが表示されます。
図 J-1 5段階評価マクロ選択ユーザーフォーム
このユーザーフォームは、下のマクロプログラム(実質1行)で表示されます。
1 Sub 評価作成実行()
2 学期選択.Show 'ユーザーフォームの表示
3 End Sub
2行目 :「学期選択」のオブジェクト名が付いたユーザーフォームを表示しなさい。
図J-1に示された4つのケースから、どれに該当する通知表を作成するのかを確認し、
右横のコマンドボタンを押します。個々のコマンドボタンのクリック操作には、次のマクロ
が対応しています。
「case_1」コマンドボタン
1 Private Sub CommandButton1_Click()
2 scase = 1 '一学期5段階評価作成
3 Unload 学期選択 'ユーザーフォームの非表示
4 Call 五段階評価作成
5 End Sub
「case_2」コマンドボタン
Private Sub CommandButton2_Click()
scase = 2 '一年ニ学期5段階評価作成
Unload 学期選択 'ユーザーフォームの非表示
Call 五段階評価作成
End Sub
「case_3」コマンドボタン
Private Sub CommandButton2_Click()
scase = 3 'ニand三年ニ学期5段階評価作成
Unload 学期選択 'ユーザーフォームの非表示
Call 五段階評価作成
End Sub
「case_4」コマンドボタン
Private Sub CommandButton2_Click()
scase = 4 '三学期5段階評価作成
Unload 学期選択 'ユーザーフォームの非表示
Call 五段階評価作成
End Sub
「case_1」コマンドボタンの解説
2行目を除き、他のコードは全て同じなので、case_1についてのみ、説明します。
1行目と5行目 :コマンドボタンがクリックされたときの実行コードは、Private Sub〜End Sub
の間に記述します。
2行目 :変数scaseに、何番目のマクロボタンを押したのか、即ちどの種類の通知表
を選択したのかを記憶させます。この変数は、4行目で呼び出す「五段階
評価作成」マクロプログムに引き渡したいので、Public宣言されます。
3行目 :図J-1に示したユーザーフォームを消します。
4行目 :「五段階評価作成」マクロプログラムを呼び出し、実行します。
J-2 ユーザーフォームの作成
ユーザーフォームは、マクロプログラムの編集画面のメニューバーから挿入/ユーザー
フォームを選択します。
図 J−2 ユーザーフォームの挿入
ユーザーフォームを選択すると、次のようなウィンドウ画面とツールボックスが表示されます。
図 J−3 ユーザーフォームウィンドウ ツールボックス
上記で示した図J-1のユーザーフォームの作成では、ツールボックスのラベルアイコンと
コマンドボタンアイコンを使用しています。ラベルアイコンを用いて文章の入力を終えたら、
必要に応じて、文字色の変更をしましょう。そのためには、下に示すツールバーのアイコン
からプロパティウィンドウを開きます。次に、「項目別」タブに切り替え、表示/ForeColorを
選択して右端のリストボタンを押して、図J−4の様な画面が表示されたら、「パレット」タブ
を選択すると、色の変更が可能となります。
なお、オブジェクト名やキャプションは、適宜分かり易い名前に変更します。
↑ ↑
プロジェクトエクスプローラ プロパティウィンドウ
図 J−4 文字色の変更
上図に示されたプロジェクトエクスプローラのアイコンを押すと、プロジェクトエクスプローラ画面
が表示され、ユーザーフォームが「フォーム」ホルダーに保存されていることが分かります。
図 J−5 プロジェクトエクスプローラ表示画面
ユーザーフォームの修正
オブジェクト名(例えば、学期選択)をプロジェクトエクスプローラ表示画面にてダブルクリック
すると、該当ユーザーフォームが表示され、修正できる状態となります。
また、表示されたユーザーフォームをダブルクリックすると、それに関連付けられたマクロ
(例えば、コマンドボタンなど)のコードが表示され、修正可能となります。
J-3 五段階評価作成プログラム
事前に、次のpublic宣言がされています。
Public student_name As String, student_no As Integer
Public grade As Integer, Class As Integer
Public scase As Integer, wcase As Integer
このマクロプログラムは、4つのケースいずれの通知表にも対応可能としているので、
少し複雑で分かりづらい所があります。マクロに慣れていない人は、先に次のセクション
(Section K)の説明を眺めた方がよいかも知れません。
「五段階評価作成」マクロプログラム
1 Sub 五段階評価作成() 'ユーザーフォーム対応プログラム
2 Dim masterTbl As Range, sendTbl As Range, myRng As Range
3 Dim subj1(9) As Integer, subj2(9) As Integer, subj3(9) As Integer
4 Dim subj1_p(9) As String, subj2_p(9) As String, choice(4) As String
5 Dim mySht As Worksheet, myStr As String, new_sheet_name As String
6 Dim kanten_A(3, 9) As String, kanten_B(3, 9) As String, kanten_C(3, 9) As String
7 Dim kanten_D(3, 9) As String, kanten_E(3, 1) As String
8 Dim s_kanten_A(4) As String, s_kanten_B(4) As String, s_kanten_C(4) As String
9 Dim k As Integer
10 '連結5段階評価.xlsの「連結成績」シートから読込
11 Workbooks.Open Filename:=ThisWorkbook.Path
& "\連結5段階評価.xls"
12 Worksheets("連結成績").Activate
'シート名「連結成績」をアクティブシートにする
13 ' Tips A-003
14 myStr = "マウスで出力したい生徒番号のセル範囲を選択して、OKボタンを押してください"
15 On Error Resume Next
16 Set myRng = Application.InputBox(myStr, Type:=8)
17 On Error GoTo 0
18 If myRng Is Nothing Then
19 MsgBox "キャンセルされました"
20 End If
21 'end of Tips A-003
22 Set masterTbl = Range("連結成績")
23 '連結成績と名付けた表のセルをmasterTblにセット
24 Set activeRng = myRng 'インプットボックスで選択されたアクティブセルをactiveRngにセット
25 '選択範囲の取り出し
26 Workbooks("通知表.xls").Activate
27 Worksheets("表表紙").Activate
28 Range("B27") = activeRng.Address
'絶対アドレスでセル範囲をB27セルに表示
29 If activeRng.Address Like "*:*" Then '選択人数複数の場合
30 Range("B28").Select
31 ActiveCell.FormulaR1C1 = "=LEFT(R[-1]C,FIND("":"",R[-1]C)-1)"
32 '絶対アドレス範囲の前半分をB28セルに表示
33 Range("B29").Select
34 ActiveCell.FormulaR1C1 = "=RIGHT(R[-2]C,LEN(R[-2]C)-FIND("":"",R[-2]C))"
35 '絶対アドレス範囲の後ろ半分をB29セルに表示
36 Range("C28").Select
37 ActiveCell.FormulaR1C1 = "=VALUE(RIGHT(RC[-1],LEN(RC[-1])-3))"
38 '絶対アドレスから行番号を取り出して数値化
39 ist = Range("C28")
- 5 ' -5:絶対アドレス行番号から生徒番号を求める際の調整
40 '連結成績の開始行を変更する時は修正必要
41 Range("C29").Select
42 ActiveCell.FormulaR1C1 = "=VALUE(RIGHT(RC[-1],LEN(RC[-1])-3))"
43 iend = Range("C29")
- 5
44 Else '選択人数1人の場合
45 Range("C28").Select
46 ActiveCell.FormulaR1C1 = "=VALUE(RIGHT(R[-1]C[-1],LEN(R[-1]C[-1])-3))"
47 '絶対アドレスから行番号を取り出して数値化
48 ist = Range("C28")
- 5
49 iend = ist
50 End If
51 Range("B27:C29").Select
52 Selection.ClearContents '一時的な作業セルの表示を消去
53 '
54 For k = ist To iend
55 If k <> ist Then
56 Workbooks("連結5段階評価.xls").Activate
57 Worksheets("連結成績").Activate 'シート名「連結成績」をアクティブシートにする
58 Set masterTbl = Range("連結成績")
59 End If
60 student_no = k
61 '()内アドレスの内容をstudent_noに代入
62 grade = masterTbl.Cells(student_no
+ 2, 1).Value '行番号+2は見出し分、
63 '列番号1;masterTbl 内での相対列番号
64 Class = masterTbl.Cells(student_no
+ 2, 2).Value
65 student_name = masterTbl.Cells(student_no
+ 2, 4).Value
66 '
67 '5段階評価−生徒名として挿入
68 Workbooks("通知表.xls").Activate
69 Worksheets("5段階評価").Activate
'シート名「5段階評価」をアクティブシートにする
70 Set mySht = Worksheets("5段階評価")
71 With Worksheets
72 mySht.Copy After:=.Item(.Count)
'ワークシート「5段階評価」を最末尾にコピー
73 End With
74 ActiveSheet.Shapes("Button
5").Select 'マクロボタンの削除
75 Selection.Cut
76 '
77 Set mySht = ActiveSheet
78 new_sheet_name = "5段階評価"
& "−" & student_name
79 Sheets(mySht.name).name = new_sheet_name '"5段階評価" & student_name
80 'シート「mySht.Name」の名前を「5段階評価+生徒名」に変更
81 '
82 Set masterTbl = Range("成績評価ページ名前欄")
83 masterTbl.Cells(1, 2) = student_no
84 masterTbl.Cells(1, 3) = " "
& student_name
85 '
86 '成績の読込
87 Workbooks("連結5段階評価.xls").Activate
88 Worksheets("連結成績").Activate
89 'シート名「連結成績」をアクティブシートにする
90 Set sendTbl = Range("連結成績")
91 colw1 = 15
92 For i = 1 To 9 'i=1:国語,i=2:社会,i=3:数学,i=4:理科,i=5:音楽,
93 'i=6:美術,i=7:保健体育,i=8:技術・家庭,i=9:英語
94 subj1(i) = sendTbl.Cells(student_no
+ 2, 6 + (i - 1) * colw1 + 5 * (grade - 1))
95 ' 1:1学期
96 subj1_p(i) = sendTbl.Cells(student_no
+ 2, 7 + (i - 1) * colw1 + 5 * (grade - 1))
97 ' p:補助評価○、×
98 If scase > 1 Then
99 subj2(i) = sendTbl.Cells(student_no
+ 2, 8 + (i - 1) * colw1 + 5 * (grade - 1))
100 ' 2:2学期
101 subj2_p(i) = sendTbl.Cells(student_no
+ 2, 9 + (i - 1) * colw1 + 5 * (grade - 1))
102 End If
103 If scase = 4 Then
104 subj3(i) = sendTbl.Cells(student_no
+ 2, 10 + (i - 1) * colw1 + 5 * (grade -
1))
105 ' 3:3学期
106 End If
107 Next
108 If scase = 2 Or scase = 4 Then
109 lastcol = 6 + 9 * colw1
110 colw2 = 3
111 For i = 1 To 4 ' 1年2学期,2,3年3学期のみ選択教科の評価有り,
'i=1〜4:選択教科1〜4
112 choice(i) = sendTbl.Cells(student_no
+ 2, lastcol + (i - 1) * colw2 + (grade -
1))
113 Next
114 End If
115 '
116 '成績の書き込み
117 Workbooks("通知表.xls").Activate
118 Worksheets(new_sheet_name).Activate 'シート名「5段階評価+生徒名」を
'アクティブシートにする
119 Set masterTbl = Range("成績評価欄")
120 colw1 = 4
121 For i = 1 To 9 'i=1:国語,i=2:社会,i=3:数学,i=4:理科,i=5:音楽,
122 'i=6:美術,i=7:保健体育,i=8:技術・家庭,i=9:英語
123 masterTbl.Cells(2, 3 +
(i - 1) * colw1) = subj1(i) ' 1:1学期
124 masterTbl.Cells(2, 4 +
(i - 1) * colw1) = subj1_p(i) ' p:補助評価○、×
125 If scase > 1 Then
126 masterTbl.Cells(4,
3 + (i - 1) * colw1) = subj2(i) ' 2:2学期
127 masterTbl.Cells(4,
4 + (i - 1) * colw1) = subj2_p(i)
128 End If
129 If scase = 4 Then
130 masterTbl.Cells(6,
3 + (i - 1) * colw1) = subj3(i) ' 3:3学期
131 End If
132 Next
133 If scase = 2 Or scase = 4 Then
134 lastcol = 3 + 9 * colw1
135 colw2 = 3
136 For i = 1 To 4 '1年2学期,2,3年3学期のみ選択教科の評価有り,
'i=1〜4:選択教科1〜4
137 masterTbl.Cells(6,
lastcol + (i - 1) * colw2) = choice(i)
138 Next
139 End If
140 '
141 '各教科観点評価の読込
142 If scase = 1 Then
143 semsend = 1
144 ElseIf scase = 2 Or scase = 3 Then
145 semsend = 2
146 Else
147 semsend = 3
148 End If
149 Workbooks.Open Filename:=ThisWorkbook.Path
& "\観点評価.xls"
150 'Workbooks("観点評価.xls").Activate
151 For i = 1 To 9 'i=1:国語,i=2:社会,i=3:数学,i=4:理科,i=5:音楽,
152
'i=6:美術,i=7:保健体育,i=8:技術・家庭,i=9:英語
153 colw1=4
154 If i = 1 Then
155 myStr = "国語観点評価"
156 colw1=5
157 ElseIf i = 2 Then
158 myStr = "社会観点評価"
159 ElseIf i = 3 Then
160 myStr = "数学観点評価"
161 ElseIf i = 4 Then
162 myStr = "理科観点評価"
163 ElseIf i = 5 Then
164 myStr = "音楽観点評価"
165 ElseIf i = 6 Then
166 myStr = "美術観点評価"
167 ElseIf i = 7 Then
168 myStr = "保健体育観点評価"
169 ElseIf i = 8 Then
170 myStr = "技術家庭観点評価"
171 Else
172 myStr = "英語観点評価"
173 End If
174 Worksheets(myStr).Select
'シート名「〜観点評価」をアクティブシートにする
175 Set sendTbl = Range(myStr)
176 For sems = 1 To semsend 'sems=1:1学期,sems=2:2学期,sems=3:3学期
177 kanten_A(sems, i)
= sendTbl.Cells(student_no + 2, 6+(sems-1)*colw1)
178 '
行番号、列番号は相対行、列番号
179 kanten_B(sems, i)
= sendTbl.Cells(student_no + 2, 7+(sems-1)*colw1)
180 kanten_C(sems, i)
= sendTbl.Cells(student_no + 2, 8+(sems-1)*colw1)
181 kanten_D(sems, i)
= sendTbl.Cells(student_no + 2, 9+(sems-1)*colw1)
182 If i = 1 Then
183 kanten_E(sems,
i) = sendTbl.Cells(student_no + 2, 10+(sems-1)*colw1)
184 End If
185 Next
186 Next
187 '
188 If scase = 2 Or scase = 4 Then
189 For i = 1 To 4 'i=1:選択教科1,i=2:選択教科2,i=3:選択教科3,i=4:選択教科4
190 If i = 1 Then
191 myStr = "選択教科1観点評価"
192 ElseIf i = 2 Then
193 myStr = "選択教科2観点評価"
194 ElseIf i = 3 Then
195 myStr = "選択教科3観点評価"
196 Else
197 myStr = "選択教科4観点評価"
198 End If
199 Worksheets(myStr).Activate 'シート名「〜観点評価」をアクティブシートにする
200 Set sendTbl = Range(myStr)
201 s_kanten_A(i) = sendTbl.Cells(student_no
+ 2, 6)
' 行番号、列番号は相対行、列番号
202 s_kanten_B(i) = sendTbl.Cells(student_no
+ 2, 7)
203 s_kanten_C(i) = sendTbl.Cells(student_no
+ 2, 8)
204 Next
205 End If
206 '
207 '観点評価の書込
208 Workbooks("通知表.xls").Activate
209 'new_sheet_name = "5段階評価" &
"−" & student_name
210 Worksheets(new_sheet_name).Activate
'シート名「5段階評価+生徒名」を
'アクティブシートにする
211 Set masterTbl = Range("成績評価欄")
212 For i = 1 To 9 'i=1:国語,i=2:社会,i=3:数学,i=4:理科,i=5:音楽,
213
'i=6:美術,i=7:保健体育,i=8:技術・家庭,i=9:英語
214 If i <= 2 Then
215 dc = 1 + 5 * (i - 1)
216 Else
217 dc = 10 + 4 * (i - 3)
218 End If
219 For sems = 1 To semsend 'sems=1:1学期,sems=2:2学期,sems=3:3学期,
220 masterTbl.Cells(3 +
2 * (sems - 1), dc) = kanten_A(sems, i)
221 masterTbl.Cells(3 +
2 * (sems - 1), dc + 1) = kanten_B(sems,
i)
222 masterTbl.Cells(3 +
2 * (sems - 1), dc + 2) = kanten_C(sems,
i)
223 masterTbl.Cells(3 +
2 * (sems - 1), dc + 3) = kanten_D(sems,
i)
224 If i = 1 Then
225 masterTbl.Cells(3
+ 2 * (sems - 1), 5) = kanten_E(sems, i)
226 End If
227 Next
228 Next
229 adjcol = dc + 1
230 If scase = 2 Or scase = 4 Then
231 For i = 1 To 4 '1年2学期,2,3年3学期のみ選択教科の評価有り,
'i=1〜4:選択教科1〜4
232 masterTbl.Cells(7, adjcol
+ 3 * i) = s_kanten_A(i)
233 masterTbl.Cells(7, adjcol
+ 3 * i + 1) = s_kanten_B(i)
234 masterTbl.Cells(7, adjcol
+ 3 * i + 2) = s_kanten_C(i)
235 Next
236 End If
237 Next ' k
238 Set MasterTbl = Nothing 'オブジェクトの開放
239 Set sendTbl = Nothing
240 Set myRng = Nothing
241 End Sub
「五段階評価作成」マクロプログラムの解説
1行目 :マクロ名の先頭文字として、数字は使えません。それ故、「5段階評価作成」
ではなく、「五段階評価作成」としています。
2〜9行目 :Dim文の中で変数名に(9)、(3,9)などの表記が付けられたコードがあります。
このように()が付けられた変数のことを配列変数と云います。
1次元配列変数〜subj1(9)、choice(4)のように、()内の数字、これを添え字
と呼びます、が1つの場合を1次元配列変数と云います。
2次元配列変数〜kanten_A(3,9)のように、添え字が2つある変数
配列変数の場合には、Dim文の宣言で変数のサイズも同時に指定します。
これで、指定した変数名に指定サイズの記憶場所をあらかじめ確保します。
例: Dim choice(4)
と宣言することにより、choice(1),choice(2),choice(3),
choice(4)の4つの記憶場所が確保され、()内の添え字の違いにより、
記憶場所が区別されます。
なお、添え字の付かないスカラー変数と配列変数を同じ名前で宣言、
使用することは出来ません。同一の性格を有するものに対して配列変数
を当てると変数名の種類が増えず、分かり易いプログラムとなります。
ここでは、選択教科1〜4にchoice(1)〜choice(4)を割り当てています。
13〜21行目 :インプットボックスで指定されたセル範囲を取得します。ただし、後続コードの
「選択範囲の取り出し」の制約から、セル範囲は連続していることが前提
条件となります。
16行目〜インプットボックスに選択表示された文字列をMyRngにセットします。
15行目〜エラーが発生してもプログラムを中断せず、エラー発生の原因と
なった次の行からプログラムの実行を継続します。
17行目〜エラー処理を無効にする構文です。
25〜50行目 :上記で選択した絶対アドレス表示のセル範囲から、文字列操作し、生徒番号
初期値をistに、最終値をiendに代入しなさい。
29行目〜「もし、B27セルに表示した絶対アドレスが、*:*のようになって
いれば」の意味で、これでセルの選択が複数か1つかを区別し、
条件分岐させています。
54と237行目 :大きなFor〜Next文で、5段階評価を作成する生徒の人数に等しい回数分、
繰り返し実行します。
55〜59行目 :「連結5段階評価.xls」ブックの「連結成績」シートをアクティブにし、「連結成績」
の名で登録されたセル範囲をMasterTblにセットします。このコードは、最初
の生徒には、既に22行目でセットされているので不要ですが、後続コード
ではMasterTblに様々な領域を当てているので、2人目以降の生徒からは、
56〜58行目を実行しなければなりません。
条件式は、「もし、kがist(最初の生徒番号)に等しくなければ」の意味です。
62,64,65行目 :MasterTblにセットされた「連結成績」から該当生徒の学年、クラス名、生徒
氏名を夫々変数名grade、Class、student_nameに代入しなさい。
67〜73行目 :成績未記入のシート「5段階評価」をシート末尾にコピーします。これは、後で
「5段階評価−○○○」とシート名を変更し、成績を記入するための準備です。
74、75行目 :成績未記入シート「5段階評価」には「○,△,・,空白選択リストボタン設定」の
マクロボタンを残しています。しかし、「五段階評価」マクロには観点評価の
達成状況もマクロで転記し、リスト入力の設定もコピーされるので、
「○,△,・,空白選択リストボタン設定」マクロボタンを削除しています。
77〜80行目 :末尾にコピーしたシートを新しいシート名「5段階評価−○○○」に変更します。
○○○には78行目から分かるように、具体的な生徒氏名を当てます。
82〜84行目 :成績未記入のシート「5段階評価」において、成績評価ページの左上隅B3〜D3
セルの範囲が「成績評価ページ名前欄」で登録されており、新しいシート名「5段
階評価−生徒名」には、その登録も含めてコピーされています。
このコードでは、その領域をアクティブにし、相対セル番号で指定したセルに生徒
番号と名前を表示します。
91行目 :9教科の各科目については、1年〜3年まで計15列の成績欄があります。
colw1は、次の科目の成績を読み込む際のステップ幅です。
92〜107行目 :9教科分の成績の読込。subjの後ろに付く数字は学期を、更に_pとあるのは
補助評価を意味しています。
98〜106行目にある2つのIf文で、2学期、3学期の読込が必要か否かを判断
します。
108〜114行目:選択教科の成績が通知表に含まれるか否かを判断します。
109行目〜lastcolには、9教科の成績欄の最後の列+1、即ち選択教科の
最初の欄の相対列番号が代入されます。
110行目〜選択教科1つ当り、成績欄は3列なので、ステップ幅は3です。
116〜139行目:成績の転記です。
119行目〜「成績評価欄」の名で登録されたセル範囲をMasterTblにセット。
以下では、このセル範囲での相対行列番号で転記先のセルを
指定します。
141〜205行目:観点評価の読込
142〜148行目〜通知表の4つのケースが夫々何学期までの成績を考慮
するのかを変数semsendに代入、176行目を参照のこと。
154〜173行目〜変数myStrに174行目でアクティブにするシート名を代入
176〜185行目〜観点評価のシートから評価(○,△,・,空白)の読込
182〜184行目〜国語のみ観点評価項目E欄があるので、評価の読込
151〜186行目〜9教科分For〜Endで挟まれた文を繰り返し
188〜205行目〜選択教科の観点評価の読込
207〜236行目:観点評価の転記です。
214〜218行目〜転記する相対列番号を制御する変数dcを決めています。
229行目 〜230から236行目の選択教科の転記を行なう際の相対列
番号を制御する変数adjcolを決めています。
J-4 5段階評価サンプルシート
以下にサンプルシートを掲げます。
「通知表Readme」シートの5段階評価作成手順
「5段階評価」空白シート
「5段階評価-生徒名」サンプルシート
索引
ページの先頭へ戻る
目次へ戻る