自分で作るから面白い。VBAシンプル時間割をリメークしてオリジナルの時間割をつくる
はじめに
今年も学校の冬休みが近くなってきました。例年この時期にVectorで公開しているVBA時間割をたくさんダウンロードしていただいてます。ほとんどの方はそれぞれの学校事情に合わせて作り変えられていることと思いますが、ときどき質問をいただきますので、コードをわかりやすいものに置き換えてリメークする方法を掲載します。一度リメークすると中身が見えますので、コツをつかんだところで全面的にオリジナルの時間割を組んでいただければと思います。
1 ベースになるVBAシンプル時間割をダウンロードしてコードを置き換える
https://www.vector.co.jp/soft/winnt/business/se458630.htmlにアクセスしてダウンロード、解凍してください。
Alt+F11をタップするとVBEが開きます。
プロジェクトウインドウから標準モジュールをクリックして開きます。
転記というプロシージャがありますので、完全に削除します。
そして、次のコードをコピペしてください。
Sub timetable()
'出力領域を初期化
Worksheets("教室時間割").Range("c5:aj49") = ""
Worksheets("教員時間割").Range("c5:aj56") = ""
'データを配列に読み込み
c = Worksheets("クラス時間割").Range("a1:aj50")
d = Worksheets("編成表").Range("a1:K350")
e = Worksheets("教員時間割").Range("a1:aj60")
f = Worksheets("教室時間割").Range("a1:aj50")
'クラス時間割から読み込み
For i = 4 To 48
For j = 3 To 36
If c(i, j) <> "" Then
科目 = c(i, j)
組 = c(i, 1)
'編成表から読み込み
For k = 2 To 350
If 科目 = d(k, 6) Then
If 組 = d(k, 1) Then
教員 = d(k, 7)
教室 = d(k, 9)
'教員時間割に出力
For n = 5 To 56
If 教員 = e(n, 1) Then
e(n, j) = e(n, j) & 組 & 科目
End If
Next n
'教室時間割に出力
For m = 5 To 49
If 教室 = f(m, 1) Then
f(m, j) = f(m, j) & 組 & 科目
End If
Next m
End If
End If
Next k
End If
Next j
Next i
'ワークシートに保存
Worksheets("教員時間割").Range("a1:aj60") = e
Worksheets("教室時間割").Range("a1:aj50") = f
End Sub
2 学校事情に合わせてクラス時間割、教員時間割、教室時間割、編成表を作り変える
VBAシンプル時間割は全国的にみても複雑で大きな時間割をもつ総合学科の高校のものです。おそらく拡大する必要はないと思います。一部を削って縮小する場合を例にします。横列は6時間授業で1週間確保してありますので変更の必要はありません。7時間授業になっても対応できるように各曜日の間に7時間目用の列があります。必要な場合は再表示してください。今は縦行を削除しました。図の下に行数を書いてます。
3 各表にあわせて行数を書き換える
この状態でVBEの実行ボタン(ツールバーにある三角、緑色のボタン)をクリックすると教員時間割と教室時間割のたくさんの文字がでてきます。何もないところでVBAが働いて余計なことをしてくれます。これを避けるため、検索範囲を厳密に設定します。
編成表は350行まで検索する設定になっていますが、減らすと処理速度が速くなります。実行ボタンをクリックして正常に動けばコードの変更は成功しています。
4 印刷設定
この時間割を作った時の私の勤務校がヘッダーに印刷されます。
印刷>ページ設定>ヘッダー・フッター>ページの編集
で削除あるいは変更できますので、お勤めの学校名に変えてください。
5 アルゴリズムの把握
高速化のために配列を使っています。Cellsでもできますが、書き込みに時間がかかって使い物になりません。Rangeを使って一括読み込み、一括出力しています。各パートの働きは次のようになってます。
'出力領域を初期化
教員時間割と教室時間割の古いデータを消去
'データを配列に読み込み
各ワークシートのデータを一括して配列(変数の入れ物)に読み込み
'クラス時間割から読み込み
組・科目・横列(時間)を読み取る
'編成表から読み込み
担当教諭・使用教室を読み取る
'教員時間割に出力
該当時間(横列)で縦行が担当教員のセルに組・科目を書き込む
'教室時間割に出力
該当時間(横列)で縦行が使用教室のセルに組・科目を書き込む
'ワークシートに保存
配列に書き込まれたデータをワークシートに出力
6 実際の処理の流れ例
7 編成表の作成
編成表は組・科目と担当教諭・使用教室を関連させる働きをします。全部手入力でもできますが、VLOOKUPを使ってIDで呼び出せるようにしてます。このIDは各時間割表の1列目に記入して以後の処理でも使われます。
8 コマの作成
編成表の略称がそのままコマになります。例えば1年1組・国語総合の略称が「国」の場合、クラス時間割に「国」と入力することによって教員時間割・教室時間割に1年1組のID+略称「11国」と出力されます。
9 イベントプロシージャの設定
VBEの実行ボタンをクリックしなくても、データを書き換えると自動的にプログラムが実行されるようにしましょう。
Alt+F11でVBEを開き、
プロジェクトエクスプローラからクラス時間割をクリックしてシートモジュールを開きます。
そこに書かれているコードはもう使えませんので完全に削除します。
オブジェクトボックスからWorksheetを選択します。
プロシージャボックスからChangeを選択選択します。
Private Sub Worksheet_Change(ByVal Target As Range)に次のコードをコピペし、範囲を指定します。iはクラス時間割の行番号、jは列番号です。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)は間違いを防ぐために削除しましょう。
Private Sub Worksheet_Change(ByVal Target As Range)
i = Target.Row
j = Target.Column
If i >= 4 And i <= 24 Then
If j >= 3 And j <= 36 Then
timetable
End If
End If
End Sub
クラス時間割の科目名を書き換えると自動的に実行されるようになります。
「表示>ウインドウ>新しいウィンドウを開く」を使って、教員時間割・教室時間割を確認しながら、クラス時間割で科目を記入や変更ができるようになります。
以上です。ぜひ素敵な時間割を作成してください。