Section D 座席表の作成 |
座席表の作成を例に罫線の表示などについて解説します。座席表作成の基本的な考え方
は、個々の座席を罫線で囲み、セル内に生徒番号を入力し、それに対応する生徒氏名を
「名簿」シートから転記する。作成後の部分修正も可能な様に配慮するなどです。
末尾にはサンプルシートを掲げています。
D-1 座席枠表示
先ず、事前の準備として次のことをしましょう。
1)各自新規の練習用ブックを開き、マスターテーブルをシート名「名簿」に準備して下さい。
なお、以下の点に注意して下さい。
マスターテーブルの表全体のセル範囲が「マスターテーブル」の名前で正しく登録され
ているか確認して下さい。確認する際の注意事項は、C-1を参照して下さい。
2)別シートにシート名を「座席表」とした空のシートを準備して下さい。
座席配置のセル選択
「座席表」シートにおいて、1座席1セルと考え、座席を配置するセルを全て選択します。
複数セルを同時に選択するには、Ctrlキー+クリックです。
一般操作
罫線アイコンを押して、外枠のみの罫線表示を選択すると、座席枠が表示されます。
マクロの記録
次のコードでは、座席枠は既に選択されて、全てアクティブになっているものとします。
Sub 座席枠表示()
Worksheets("座席表").Activate 'シート「座席表」をアクティブにする
Selection.Borders(xlDiagonalDown).LineStyle
= xlNone '右下がり斜め罫線
Selection.Borders(xlDiagonalUp).LineStyle
= xlNone '右上がり斜め罫線
With Selection.Borders(xlEdgeLeft) '罫線左サイド
.LineStyle = xlContinuous '実線
.Weight = xlThin '細線
.ColorIndex = xlAutomatic '罫線カラー自動:黒
End With
With Selection.Borders(xlEdgeTop) '罫線上縁
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom) '罫線下縁
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight) '罫線右サイド
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Sub
上記マクロにはWith 〜 End With文が使われています。これは間に挟まれたブロック文
を簡潔に記述するもので、Withの右横に書かれたオブジェクト(即ち、Selection.Borders
(xlEdgeLeft))について、ブロックの中で再定義しなくても使用できる便利な命令です。
With 〜 End With文を使わないで罫線左サイドのブロック文を記述すると、次のように
なります。
Selection.Borders(xlEdgeLeft).LineStyle = xlContinuous '実線
Selection.Borders(xlEdgeLeft).Weight
= xlThin '細線
Selection.Borders(xlEdgeLeft).ColorIndex
= xlAutomatic '罫線カラー自動:黒
D-2 座席枠削除
座席枠を表示した後、机の配置の変更や修正をしたい場合には、削除するなどの操作が
必要となります。
一般操作
削除したいセルを選択して、罫線アイコンを押し、「枠なし」を押せば、該当セルの
周囲四方の枠線を消去できます。
マクロの記録
一般操作と同一の操作に関する「マクロの記録」のコードは、次のようになります。
図 D-1 枠線削除マクロ例
2行目コード :この例では、J13セルに枠線を記入しているので、先ずそのセルを
選択しています。
3,4行目コード :上の枠線表示に同じ。右下がり、右上がり罫線なしの意味。
5〜8行目 :選択セル周囲四方の罫線をNone、即ち削除しています。
9,10行目 :複数セルを選択しているときには、範囲内部の罫線を削除の意味。
9行目が縦線、10行目が横線です。
なお、末尾のサンプルシート「座席表Readme」に示すように、座席枠を削除するとき
隣座席が接している場合には、それとの境界線も削除しますので、改めてD−1に掲げた
枠線表示を実行して、該当座席の消えた枠線を表示する必要があります。
D-3 一座席毎の名前挿入
セクションCに掲げた生年月日の表記変更を既に理解していれば、「一座席毎の名前
挿入」マクロプログラムに目新しいことは、あまり有りません。以下に全コードを示します。
「一座席毎の名前挿入」マクロプログラムの例
VBAマクロプログラムには、行番号(各行の左端の数字)はありませんが、解説の都合上
下のコード例には記入してあります。
1 Sub 一座席毎_名前挿入() '一座席毎に名前を挿入
2 Dim masterTbl As Range, masterFld As Integer, activeRng As Range, s As Range
3 Dim student_no As Integer, name As String, i As Integer 'Dimは変数の型宣言
4 Worksheets("座席表").Activate
'シート名「座席表」をアクティブシートにする
5 Set masterTbl = Range("マスターテーブル")
6 'マスターテーブルと名付けた表のセル範囲をmasterTblにセット
7 Set activeRng = Selection '現在選択されているアクティブセルをactiveRngにセット
8 student_no = Range(activeRng.Address)
'activeRng.AddressはactiveRngの絶対アドレス,
9 '()内アドレスの内容をstudent_noに代入
10 Worksheets("名簿").Activate
'シート名「名簿」をアクティブシートにする
11 masterFld = 3 '生徒番号フィールドのmasterTbl内での相対的な列番号
12 For i = 2 To masterTbl.Rows.Count '見出しを除く2行目から最終行までの繰り返し
13 'iはmasterTbl内での相対的な行番号
14 If masterTbl.Cells(i, masterFld).Value = student_no
Then
15 name = masterTbl.Cells(i,
masterFld + 1) '名前の読込
16 Worksheets("座席表").Activate
17 Range(activeRng.Address)
= student_no & Chr(10) & name
18 '&は文字列の連結,Chr(10)はセル内の強制改行
19 Exit Sub
20 End If
21 Next
22 Set masterTbl = Nothing 'オブジェクトの開放
23 End Sub
「一座席毎の名前挿入」マクロプログラムの解説
1行目と23行目:プログラムは、Sub マクロ名()で始まり、End Sub で終わります。
マクロ名の先頭文字は、英字または日本語などで数字は使えません。
2〜3行目 :Dim文です。詳細はセクションCを参照のこと。
変数student_noは、整数型の宣言です。17行目では数値も文字列同様
&で結合してくれます。
4行目 :「座席表」という名前のシートをアクティブにしなさい。即ち、クリックして選択
した状態にしなさい。
5行目 :シート名「座席表」にある「マスターテーブル」という名前で登録された表を
領域変数masterTblにセットしなさい。
7行目 :注釈行の説明通り
8行目 :注釈行の説明通り
12行目 :セクションCのVBAマクロプログラム20行目とまったく同じです。
14〜20行目 :If 〜End If 文の固まりです。これはIf文のバリエーションのひとつで、
先に説明したElseIf文やElse文が無い構造となっています。
If 条件式 Then 条件式が満足されたとき実行するコード(15〜19行目) End If |
条件文の解釈は次の通りです。
もし、 masterTblにセットされた表(この例ではマスターテーブル)のセル (i行、masterFld列)の値がシート「座席表」でアクティブになっている セルに記入されている学生番号等しい ならば |
()内の行番号 i はループ変数と同じなので2,3,4,....,表の最終行まで順に変わり、
列番号は18行目でmasterFldに3が代入されているので、3列目に固定されます。
結局、表の(i行、3列)セルがシート「座席表」でアクティブになっているセルに記入
されている学生番号に等しい場合に、条件式が満足されることになります。
15行目 :masterTblにセットされた表のセル(i行、4列)内容を変数nameに代入しな
さい。
16行目 :シート名「座席表」をアクティブにしなさい。
17行目 :シート名「座席表」のアクティブセルにstudent_noとChr(10)とnameの文字列
を連結して表示しなさい。
ここで、Chr(10)はAltキーを押しながらEnterキーを押す操作、即ち「セル内の
強制改行」を意味しています。従って、表示されると学生番号が上段に、セル
内で改行されて生徒氏名が下段に表示されます。
19行目 :Sub〜End Subで記述されたマクロプログラムから抜け出しなさい。即ち、
このマクロの実行を終了しなさいの意味です。
このマクロでは、一座席のみに生徒氏名を挿入すれば、役割は終わるので
マクロの実行を終了してよいことになります。
後述する複数の座席に一括して全ての名前を挿入する場合には、この文は
Exit For文に置換されています。
22行目 :セクションCの78行目の説明に同じです。
D-4 一括名前挿入
上の一座席毎のマクロに少し手を加えると、指定された複数の座席に一括して全ての
名前を挿入するマクロに修正することが出来ます。このマクロプログラムの全コードを掲げ
ます。上のマクロと異なるコードについて、左端の行番号を赤い色で示しています。
「全座席に一括名前挿入」マクロプログラムの例
1 Sub 座席表_名前挿入() '一括して全ての座席に名前を挿入
2 Dim masterTbl As Range, masterFld As Integer, activeRng As Range, s As Range
3 Dim student_no As String, name As String, i As Integer 'Dimは変数の型宣言
4 Worksheets("座席表").Activate
'シート名「座席表」をアクティブシートにする
5 Set masterTbl = Range("マスターテーブル")
6 'マスターテーブルと名付けた表のセル範囲をmasterTblにセット
7 For Each s In Range("座席範囲")
8 Set activeRng = s '現在選択されているアクティブセルをactiveRngにセット
9 student_no = Range(activeRng.Address)
'activeRng.AddressはactiveRngの絶対アドレス,
10 '()内アドレスの内容をstudent_noに代入
11 If Len(student_no) <> 0 And Len(student_no) <= 3 Then '生徒番号最大3桁まで
12 Worksheets("名簿").Activate
'シート名「名簿」をアクティブシートにする
13 masterFld = 3 '生徒番号フィールドのmasterTbl内での相対的な列番号
14 For i = 2 To masterTbl.Rows.Count '見出しを除く2行目から最終行までの繰り返し
15 'iはmasterTbl内での相対的な行番号
16 If masterTbl.Cells(i, masterFld).Value = student_no
Then
17 name = masterTbl.Cells(i,
masterFld + 1) '名前の読込
18 Worksheets("座席表").Activate
19 Range(activeRng.Address)
= student_no & Chr(10) & name
20 '&は文字列の連結,Chr(10)はセル内の強制改行
21 Exit For
22 End If
23 Next
24 End If
25 Next
26 Set masterTbl = Nothing 'オブジェクトの開放
27 End Sub
「全座席に一括名前挿入」マクロプログラムの解説
以下には、行番号の表示が赤色のコードについてのみ、解説します。
3行目 :変数student_noは、このマクロではStringの宣言です。Integerで宣言
した場合には、座席の一部変更に際して、既に生徒番号と生徒氏名が
入力されているセルに対して、支障が生じます。
7行目と25行目:For Each〜Next文は、指定された回数を実行するFor〜Next文とは
異なり、コレクションの全てのオブジェクトに対して繰り返し実行しなさい
の意味です。
For Each 変数名 In コレクション 処理コード Next |
コレクションとは、オブジェクトの集合のことで、この例ではセルがオブジェクト、
「座席範囲」がセルの集合、即ちコレクションです。変数名
s には、アクティブに
された座席範囲のセルが順に引き渡され、間に挟まれている8〜24行目まで
が対象セルが無くなるまで繰り返し実行されます。
8行目 :上記の選択されたセル
s を領域変数activeRngにセットします。
この文を省略することもできますが、その場合には9行目、19行目にある
activeRng.Address
を s.Address に変える必要があります。
11〜24行目 : If〜End If文の条件式は「もし、student_noの文字列長さが0に等しくなく、
且つ、student_noの文字列長さが3以下ならば」の意味。
これは、上記「座席範囲」登録時に含まれる座席間の空白セルおよび生徒
氏名入力済セル(文字列長さが生徒番号の最大桁数3桁を超えるセル)に
ついては、12〜23行目の文が実行不要なため設けています。
21行目 :Exit For文は、この文を含むFor〜Nextループから抜け出しなさいの意味。
注意事項
座席の一部変更に対しては、該当部分のセル内容をクリアーし、新たな生徒番号を
入力してから、マクロを実行します。この際、入力した生徒番号がセルの高さ方向中央に
位置付けられているか確認して下さい。そうでない場合には、強制改行が含まれており、
マクロを実行しても生徒氏名が記入されません。
本マクロプログラムの実行結果については、セクション末尾のシートサンプル「座席表」
を参照して下さい。
D-5 座席表の作成サンプルシート
「座席表Readme」シート
「名簿」シート
「座席表」シート
索引
ページの先頭へ戻る
目次へ戻る