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段階評価-生徒名」サンプルシート
 

索引
ページの先頭へ戻る

目次へ戻る