Section H 所見欄一覧表 |
作成の基本方針
・生徒の名簿欄は、「マスターテーブル.xls」からコピーする。
・所見の記入欄は5行として、コピーした名簿に生徒1人に付き4行分を新規に挿入する。
・1学期〜3学期まで1年間の所見欄を追加する。
なお、所見欄のセル幅は、通知表の所見記載欄のセル幅と同じとする。
H-1 所見欄作成
[メインプログラム]
メインのマクロプログラムは、3つのサブプログラムから構成されています。
「所見欄名簿準備main」マクロプログラム
1 Sub 所見欄名簿準備main()
2 Call 名簿コピー
3 Call 行の挿入
4 Call 所見欄セル準備
5 End Sub
[名簿コピー]マクロプログラム
このマクロは、「マスターテーブル.xls」ブックの「マスターテーブル」シートの表の内、
「名簿Tbl」で登録されたセル範囲をコピーして「所見欄」シートに貼り付けるマクロです。
プログラム末尾で見出し行を1行追加挿入しています。
「名簿コピー」マクロプログラム
1 Sub 名簿コピー()
2 Dim mySht As Worksheet, row As Integer, col As Integer
3 Sheets("所見欄").Select
4 '3:1000行までの削除〜既存の名簿削除
5 Rows("3:1000").Select
6 Selection.Delete Shift:=xlUp
7 'マスターテーブルから読込
8 Workbooks.Open Filename:=ThisWorkbook.Path
& "\マスターテーブル.xls"
9 Sheets("マスターテーブル").Select
10 '名簿貼付
11 Application.Goto Reference:="名簿Tbl"
12 Selection.Copy
13 Workbooks("所見一覧表.xls").Activate
14 Sheets("所見欄").Select
15 row = 4
16 col = 2
17 Cells(row, col).Select
18 ActiveSheet.Paste
19 Selection.PasteSpecial Paste:=xlPasteColumnWidths,
Operation:=xlNone, _
20 SkipBlanks:=False, Transpose:=False
21 ' 見出しの下に1行挿入(学期見出し記入用セル)
22 Rows("5").Select
23 Selection.Insert Shift:=xlDown
24 End Sub
「名簿コピー」マクロプログラムの解説
5,6 行目 :既存の所見欄があると支障が生ずるので、3〜1000行まで最初に削除します。
22,23行目 :見出しを1行分挿入します。
「行の挿入」マクロプログラム
このマクロでは、名簿に記載された一番下の生徒番号セルの絶対アドレスを検出して、
何行目まで空白行を挿入すべきかを決めています。
「行の挿入」マクロプログラム
1 Sub 行の挿入() '所見欄のスペースを5行分確保するため、4行挿入
2 Dim myAdr As String, i As Integer, num As Integer
3 Dim ins As Integer
4 Dim myRng1 As Range, myRng2 As Range ' Tips A-020
5 Set myRng1 = Cells(Rows.Count, 4) '下端(65536行)のセルを取得,
'2番目の引数は列を表現
6 '(即ち、生徒番号)
7 With myRng1
8 If Len(.PrefixCharacter & .Formula) >
0 Then
9 Set myRng2 = myRng1 '下端のセルが該当する場合
10 Else
11 With .End(xlUp)
12 If Len(.PrefixCharacter & .Formula) >
0 Then
13 Set myRng2 = .Cells(1) '引数1は何かが入力されている最終セル行を表現
14 End If
15 End With
16 End If
17 End With
18 If myRng2 Is Nothing Then
19 MsgBox "何も入力されていません"
20 Else
21 MsgBox myRng2.Address
22 End If
23 Set activeRng = myRng2 'インプットボックスで選択されたアクティブセルを
'activeRngにセット
24 Set myRng1 = Nothing 'オブジェクトの解放
25 Set myRng2 = Nothing
26 ' end of Tips A-020
27 ' 表に記載された生徒数
28 Range("H6") = activeRng.Address
'絶対アドレスをH6セルに表示
29 Range("I6").Select
30 ActiveCell.FormulaR1C1 = "=VALUE(RIGHT(RC[-1],LEN(RC[-1])-3))"
31 '絶対アドレスから行番号を取り出して数値化
32 total_student = Range("I6")
- 5 ' -5:絶対アドレス行番号から表の生徒数を
'求める際の調整
33 'マスターテーブルの開始行を変更する時は修正必要
34 Range("H6:I6").Select
35 Selection.ClearContents '一時的なセル表示を消去
36 '行の挿入
37 For num = 1 To total_student
38 ins = 7 + (num - 1) * 5
39 myAdr = CStr(ins) 'Tips A044
40 Rows(myAdr).Select
41 For i = 1 To 4 '4行挿入
42 Selection.Insert Shift:=xlDown
43 Next
44 Next
45 '罫線調整
46 For num = 1 To total_student
47 ins = 6 + (num - 1) * 5
48 myAdr = "B" &
CStr(ins) & ":" & "F"
& CStr(ins + 4) 'Tips A044
49 'Range("B6:F10").Select
50 Range(myAdr).Select
51 Selection.Borders(xlDiagonalDown).LineStyle
= xlNone
52 Selection.Borders(xlDiagonalUp).LineStyle
= xlNone
53 With Selection.Borders(xlEdgeLeft)
54 .LineStyle = xlContinuous
55 .Weight = xlThin
56 .ColorIndex = xlAutomatic
57 End With
58 With Selection.Borders(xlEdgeTop)
59 .LineStyle = xlContinuous
60 .Weight = xlThin
61 .ColorIndex = xlAutomatic
62 End With
63 With Selection.Borders(xlEdgeBottom)
64 .LineStyle = xlContinuous
65 .Weight = xlThin
66 .ColorIndex = xlAutomatic
67 End With
68 With Selection.Borders(xlEdgeRight)
69 .LineStyle = xlContinuous
70 .Weight = xlThin
71 .ColorIndex = xlAutomatic
72 End With
73 With Selection.Borders(xlInsideVertical)
74 .LineStyle = xlContinuous
75 .Weight = xlThin
76 .ColorIndex = xlAutomatic
77 End With
78 Selection.Borders(xlInsideHorizontal).LineStyle
= xlNone
79 Next
80 End Sub
「行の挿入」マクロプログラムの解説
4〜26行目 :これは、下記の参考文献に掲載されているTipsA-020の引用です。
渡辺ひかる著、「Excel
VBA 実用サンプルコレクション」
,
SOFT BANK Publishing.
この文献には、有用なTipsが多数掲載されているので、絶対お勧めです。
5行目でsheetの最終行(65536行目)の4列目のセルがmyRng1にセット
されます。
8行目〜.PrefixCharacterは、接頭辞を返すプロパティで文字列を表すシングル
クォーテーション「’」かNull値を返します。セルの値が「’」のみの場合
には見た目が空白セルと同じに見えるので、このような処理が必要
です。.Formulaは、数式を返すプロパティです。
11行目〜Endプロパティを使って、最終行から上の行に向かって走査します。
21行目〜指定された列において、何かが入力されている一番下のセル(即ち、
下から走査して最初に見つかったセル)の絶対アドレスをMsgBoxに
表示します。サンプルの絶対アドレスは$D$35です。
28〜30行目 :絶対セルのアドレスをH6セルに表示し、I6にはH6セルの文字列右端から文字
列長−3(つまり$D$の3文字分)、即ち上の例では35、を取り出し数値化します。
32行目 :名簿は、「名簿コピー」マクロの15行目のコードにあるように、(4,2)セルを表の
左上隅として貼り付けられたので、30行目のコードでI6セルに表示された行を
表す数値から5を引いた値が表の末尾の生徒番号(=全生徒数)に一致します。
37〜44行目 :各生徒の生徒番号が表示されている行の下に、新規に4行挿入します。
(注意)このコードから明らかなように、このマクロでは生徒番号が1番から連続
して欠番が無く最後の生徒番号になっていることを、前提としています。
48行目 :アドレス文字列を作成して、罫線を調整するセル範囲を決めています。
CStr( )は、( )内のinsで与えられる数値を文字列化しています。
78行目 :50行目で選択されたセル範囲内部に含まれる水平罫線を「表示せず」とします。
46と80行目 :罫線の調整は次第に行をずらし全生徒分行うため、For〜Next文で繰り返します。
なお、変数total_studentは、次の「所見欄セル準備」マクロでも
使用するので、次のようにPublic宣言(セクションFのF−2参照)をします。
Public total_student As Integer
「所見欄セル準備」マクロプログラム
このマクロは、すでに貼り付けた名簿の右横に所見欄を追加します。
「所見欄セル準備」マクロプログラム
1 Sub 所見欄セル準備()
2 Dim myAdr As String, semst As Integer
3 Range("F3") = "所見欄一覧表"
'表題
4 ' 文字列の記入
5 Range("H4") = "所見欄"
6 Range("G5") = "1学期"
7 Range("H5") = "2学期"
8 Range("I5") = "3学期"
9 '罫線枠
10 Range("G4:I5").Select
11 With Selection.Borders(xlEdgeLeft)
12 .LineStyle = xlContinuous
13 .Weight = xlThin
14 .ColorIndex = xlAutomatic
15 End With
16 With Selection.Borders(xlEdgeTop)
17 .LineStyle = xlContinuous
18 .Weight = xlThin
19 .ColorIndex = xlAutomatic
20 End With
21 With Selection.Borders(xlEdgeBottom)
22 .LineStyle = xlContinuous
23 .Weight = xlThin
24 .ColorIndex = xlAutomatic
25 End With
26 With Selection.Borders(xlEdgeRight)
27 .LineStyle = xlContinuous
28 .Weight = xlThin
29 .ColorIndex = xlAutomatic
30 End With
31 With Selection.Borders(xlInsideVertical)
32 .LineStyle = xlContinuous
33 .Weight = xlThin
34 .ColorIndex = xlAutomatic
35 End With
36 With Selection.Borders(xlInsideHorizontal)
37 .LineStyle = xlContinuous
38 .Weight = xlThin
39 .ColorIndex = xlAutomatic
40 End With
41 '列幅変更
42 Columns("G:I").Select
43 Selection.ColumnWidth = 32.5 '通知表通信欄の所見記入セル幅に同じ
44 'セル内背景カラー指定
45 Range("G4:I5").Select
46 With Selection.Interior
47 .ColorIndex = 41
48 .Pattern = xlSolid
49 End With
50 ' 文字列センタリング
51 Range("G4:I5").Select
52 With Selection
53 .HorizontalAlignment = xlCenter
54 .VerticalAlignment = xlCenter
55 End With
56 ' セル範囲外枠罫線
57 For semst = 1 To 3
58 For num = 1 To total_student
59 ins = 6 + (num - 1) * 5
60 If semst = 1 Then
61 myAdr = "G"
& CStr(ins) & ":" & "G" &
CStr(ins + 4) 'Tips A044
62 'Range("G6:G10").Select
63 ElseIf semst = 2 Then
64 myAdr = "H"
& CStr(ins) & ":" & "H"
& CStr(ins + 4) 'Tips A044
65 Else
66 myAdr = "I"
& CStr(ins) & ":" & "I"
& CStr(ins + 4) 'Tips A044
67 End If
68 Range(myAdr).Select
69 Selection.Borders(xlDiagonalDown).LineStyle
= xlNone
70 Selection.Borders(xlDiagonalUp).LineStyle
= xlNone
71 With Selection.Borders(xlEdgeLeft)
72 .LineStyle = xlContinuous
73 .Weight = xlThin
74 .ColorIndex = xlAutomatic
75 End With
76 With Selection.Borders(xlEdgeTop)
77 .LineStyle = xlContinuous
78 .Weight = xlThin
79 .ColorIndex = xlAutomatic
80 End With
81 With Selection.Borders(xlEdgeBottom)
82 .LineStyle = xlContinuous
83 .Weight = xlThin
84 .ColorIndex = xlAutomatic
85 End With
86 With Selection.Borders(xlEdgeRight)
87 .LineStyle = xlContinuous
88 .Weight = xlThin
89 .ColorIndex = xlAutomatic
90 End With
91 Selection.Borders(xlInsideHorizontal).LineStyle
= xlNone
92 Next
93 Next
94 End Sub
「所見欄セル準備」マクロプログラムの解説
43行目 :42行目で選択したセル範囲の各セルについて、列幅を半角32.5文字分として
指定します。
57〜93行目:2重のFor〜Next文によって、先ず1学期の生徒番号1から順に最後の生徒
番号欄までを罫線で囲みます。次いで同様に2学期、3学期と罫線で囲む作業
が進められます。
H-2 所見欄一覧表サンプルシート
以下にサンプルシートを掲げます。
「所見欄Readme」シート
「所見欄」シート
索引
ページの先頭へ戻る
目次へ戻る