Section L 通知表の印刷

 作成の基本方針
    ・表表紙、裏表紙は通知表印刷時に作成する。
    ・学期の違いにより、裏表紙の修了証が無記名の場合(1,2学期)と記名の場合(3学期)
     を選択、実行できる方式とする。
    ・名簿欄表示画面上から、印刷したい生徒のセル範囲を選択可能とする。
 
 L-1 印刷学期選択用ユーザーフォーム
    セクション末尾に掲げた「通知表Readme」シートの「通知表印刷の手順」にあるマクロ
   ボタン「印刷実行」を押すと、次のユーザーフォームが表示されます。

               図 L-1 印刷学期選択用ユーザーフォーム
            
    
   このユーザーフォームは、下のマクロプログラムで表示されています。

1    Sub 印刷実行()
2       印刷学期選択.Show   'ユーザーフォームの表示
3    End Sub

   2行目  :「印刷学期選択」のオブジェクト名が付いたユーザーフォームを表示しなさい。

   図L-1に示された2つのケースから、該当するケースを確認し、右横のコマンドボタンを
  押します。個々のコマンドボタンのクリック操作には、次のマクロが対応しています。

      「wcase_1」コマンドボタン
1   Private Sub CommandButton1_Click()
2      wcase = 1           '一学期ニ学期通知表印刷
3      Unload 印刷学期選択    'ユーザーフォームの非表示
4      Call 通知表印刷
5   End Sub

      「wcase_2」コマンドボタン
    Private Sub CommandButton2_Click()
       wcase = 2           '三学期通知表印刷
       Unload 印刷学期選択    'ユーザーフォームの非表示
       Call 通知表印刷
    End Sub

  「wcase_1」コマンドボタンの解説
    2行目を除き、他のコードは全て同じなので、wcase_1についてのみ、説明します。

 1行目と5行目 :コマンドボタンがクリックされたときの実行コードは、Private Sub〜End Sub
           
の間に記述します。
 2行目      :変数wcaseに、何番目のマクロボタンを押したのかを記憶させます。この変数
            は、4行目で呼び出す「通知表印刷」マクロプログムに引き渡すので、Public
            宣言されます。
 3行目      :図L-1に示したユーザーフォームを消します。
 4行目      :「通知表印刷」マクロプログラムを呼び出し、実行します。

  
 L-2 通知表印刷マクロプログラム

   事前に、次のpublic宣言がされています。

    Public student_name As String, student_no As Integer
    Public grade As Integer, Class As Integer
    Public scase As Integer, wcase As Integer

        「通知表印刷」マクロプログラム
1   Sub 通知表印刷()
2   Dim masterTbl As Range, myRng As Range
3    '連結成績から読込
4   Workbooks.Open Filename:=ThisWorkbook.Path & "\連結5段階評価.xls"
5   Worksheets("連結成績").Activate   'シート名「連結成績」をアクティブシートにする
6   ' Tips A-003
7   myStr = "マウスで出力したい生徒番号のセル範囲を選択して、OKボタンを押してください"
8   On Error Resume Next
9      Set myRng = Application.InputBox(myStr, Type:=8)
10   On Error GoTo 0
11   If myRng Is Nothing Then
12      MsgBox "キャンセルされました"
13   End If
14   '
15   Set masterTbl = Range("連結成績")
                      '連結成績と名付けた表のセル範囲をmasterTblにセット
16   Set activeRng = myRng 'インプットボックスで選択されたアクティブセルをactiveRngにセット
17   '選択範囲の取り出し
18   Workbooks("通知表.xls").Activate
19   Worksheets("表表紙").Activate
20   Range("B27") = activeRng.Address    '絶対アドレスの範囲をB27セルに表示
21   If activeRng.Address Like "*:*" Then   '選択人数複数の場合
22      Range("B28").Select
23      ActiveCell.FormulaR1C1 = "=LEFT(R[-1]C,FIND("":"",R[-1]C)-1)"
24                         '絶対アドレス範囲の前半分をB28セルに表示
25      Range("B29").Select
26      ActiveCell.FormulaR1C1 = "=RIGHT(R[-2]C,LEN(R[-2]C)-FIND("":"",R[-2]C))"
27                       '絶対アドレス範囲の後ろ半分をB29セルに表示
28      Range("C28").Select
29      ActiveCell.FormulaR1C1 = "=VALUE(RIGHT(RC[-1],LEN(RC[-1])-3))"
30                        '絶対アドレスから行番号を取り出して数値化
31      ist = Range("C28") - 5 ' -5:絶対アドレス行番号から生徒番号を求める際の調整
32                         '連結成績の開始行を変更する時は修正必要
33      Range("C29").Select
34      ActiveCell.FormulaR1C1 = "=VALUE(RIGHT(RC[-1],LEN(RC[-1])-3))"
35      iend = Range("C29") - 5
36   Else              '選択人数1人の場合
37      Range("C28").Select
38      ActiveCell.FormulaR1C1 = "=VALUE(RIGHT(R[-1]C[-1],LEN(R[-1]C[-1])-3))"
39                       '絶対アドレスから行番号を取り出して数値化
40      ist = Range("C28") - 5
41      iend = ist
42   End If
43   Range("B27:C29").Select
44   Selection.ClearContents     '一時的なセル表示を消去
45   For i = ist To iend
46      student_no = i
47      grade = masterTbl.Cells(student_no + 2, 1).Value  '行番号+2は見出し分、
48                            '列番号1;masterTbl 内での相対列番号
49      Class = masterTbl.Cells(student_no + 2, 2).Value
50      student_name = masterTbl.Cells(student_no + 2, 4).Value
51      Call 表表紙作成
52   'ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True'アクティブシートの印刷
53      new_sheet_name = "5段階評価−" & student_name
54      Worksheets(new_sheet_name).Activate '「5段階評価−個人名」が既に出力分作成さ
55                             'いることを前提にシートをアクティブに切換
56   'ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True'アクティブシートの印刷
57      new_sheet_name = "各種記録と通信欄−" & student_name
58      Worksheets(new_sheet_name).Activate '「各種記録と通信欄−個人名」が既に出力分
59                         '作成されていることを前提にシートをアクティブに切換
60   'ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True'アクティブシートの印刷
61      If wcase = 1 Then
62         Worksheets("無記名裏表紙").Activate
63      Else
64         Call 裏表紙作成
65      End If
66   'ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True'アクティブシートの印刷
67   Next
68   Set masterTbl = Nothing
69   Set
myRng = Nothing
70   End Sub


        通知表印刷」マクロプログラムの解説
 3〜44行目   :セクションJのJ-3プログラムに同じ。
 51行目     :「表表紙作成」サブプログラムの呼び出し。
 52,56,60,66行目:先頭の注釈行の印’を取ると、赤字の部分が有効となり、印刷が可能です。
            ここでは、マクロプログラムの動きを理解する目的のためには、実行の度毎
            の出力は煩わしいので、注釈の印’を付けています。本番印刷の際には、
            この’を削除して下さい。
 64行目     :3学期の場合のみ、修了証に学年、名前が記入されます。

        「表表紙作成」マクロプログラム
1   Sub 表表紙作成()   '一人毎の通知表作成
2   '表表紙に挿入
3   Windows("通知表.xls").Activate
4   Worksheets("表表紙").Activate  'シート名「表表紙」をアクティブシートにする
5   Range("E20") = "   第 " & grade & " 年 " & Class & " 組 "
6   Range("F20") = student_no & "番     生徒氏名"
7    With Selection
8      .HorizontalAlignment = xlRight
9      .VerticalAlignment = xlCenter
10   End With
11   Range("G20") = student_name
12   With Selection
13      .HorizontalAlignment = xlCenter
14      .VerticalAlignment = xlCenter
15   End With
16   End Sub
        「表表紙作成」マクロプログラムの解説
 6〜10行目  :F20セルに「○番   生徒氏名」を水平方向右寄せ、高さ方向中央位置指定
 11〜15行目 :G20セルに生徒氏名を表示し、水平方向中央寄せ、高さ方向中央位置指定

        「裏表紙作成」マクロプログラム
1   Sub 裏表紙作成()
2   Dim myTbl As Range
3   Worksheets("裏表紙").Activate  'シート名「裏表紙」をアクティブシートにする
4   Set myTbl = Range("修了証Tbl")
5                '修了証Tblと名付けた表のセル範囲をmasterTblにセット
6   myTbl.Cells(14, 3) = grade      '修了証Tbl内の相対行列番号
7   myTbl.Cells(8, 4) = student_name
8   Set myTbl = Nothing
9   End Sub

     「裏表紙作成」マクロプログラムの解説
 4〜7行目  :修了証の学年、氏名欄の記入

 L-3 通知表印刷サンプルシート 

  以下にサンプルシートを掲げます。

             図 L-2 「通知表Readme」シートの通知表印刷の手順
 

    「表表紙」サンプルシートは、次のpdfファイルを参照下さい。sample_1p.pdfへのリンク
    「裏表紙」サンプルシートは、次のpdfファイルを参照下さい。sample_4p.pdfへのリンク

索引
ページの先頭へ戻る

目次へ戻る