自分で作るから面白い。VBAシンプル時間割をリメークしてオリジナルの時間割をつくる

はじめに

 今年も学校の冬休みが近くなってきました。例年この時期にVectorで公開しているVBA時間割をたくさんダウンロードしていただいてます。ほとんどの方はそれぞれの学校事情に合わせて作り変えられていることと思いますが、ときどき質問をいただきますので、コードをわかりやすいものに置き換えてリメークする方法を掲載します。一度リメークすると中身が見えますので、コツをつかんだところで全面的にオリジナルの時間割を組んでいただければと思います。

1 ベースになるVBAシンプル時間割をダウンロードしてコードを置き換える

  1. https://www.vector.co.jp/soft/winnt/business/se458630.htmlにアクセスしてダウンロード、解凍してください。

  2. Alt+F11をタップするとVBEが開きます。

  3. プロジェクトウインドウから標準モジュールをクリックして開きます。

  4. 転記というプロシージャがありますので、完全に削除します。

  5. そして、次のコードをコピペしてください。

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時間目用の列があります。必要な場合は再表示してください。今は縦行を削除しました。図の下に行数を書いてます。

クラス時間割 縦24行
教員時間割 縦35行
教室時間割 縦30行

3 各表にあわせて行数を書き換える

この状態でVBEの実行ボタン(ツールバーにある三角、緑色のボタン)をクリックすると教員時間割と教室時間割のたくさんの文字がでてきます。何もないところでVBAが働いて余計なことをしてくれます。これを避けるため、検索範囲を厳密に設定します。

'出力領域を初期化
Worksheets("教室時間割").Range("c5:aj49") = "" →aj49をaj30
Worksheets("教員時間割").Range("c5:aj56") = "" →aj56をaj35
'データを配列に読み込み
c = Worksheets("クラス時間割").Range("a1:aj50")  →aj50をaj24
d = Worksheets("編成表").Range("a1:K350")
e = Worksheets("教員時間割").Range("a1:aj60") →aj60をaj35
f = Worksheets("教室時間割").Range("a1:aj50") →aj50をaj30

'クラス時間割から読み込み
For i = 4 To 48 →4 To 24
 For j = 3 To 36 
'教員時間割に出力
  For n = 5 To 56 →5 To 35
 '教室時間割に出力
 For m = 5 To 49 →5 To 30
'ワークシートに保存
Worksheets("教員時間割").Range("a1:an60") = e →aj60をaj35
Worksheets("教室時間割").Range("a1:al50") = f  →aj50をaj30

編成表は350行まで検索する設定になっていますが、減らすと処理速度が速くなります。実行ボタンをクリックして正常に動けばコードの変更は成功しています。

4 印刷設定

この時間割を作った時の私の勤務校がヘッダーに印刷されます。
印刷>ページ設定>ヘッダー・フッター>ページの編集
で削除あるいは変更できますので、お勤めの学校名に変えてください。

5 アルゴリズムの把握

高速化のために配列を使っています。Cellsでもできますが、書き込みに時間がかかって使い物になりません。Rangeを使って一括読み込み、一括出力しています。各パートの働きは次のようになってます。

'出力領域を初期化
 教員時間割と教室時間割の古いデータを消去
'データを配列に読み込み
 各ワークシートのデータを一括して配列(変数の入れ物)に読み込み
'クラス時間割から読み込み
 
組・科目・横列(時間)を読み取る
'編成表から読み込み
 
担当教諭・使用教室を読み取る 
'教員時間割に出力
  該当時間(横列)で縦行が担当教員のセルに組・科目を書き込む
 '教室時間割に出力
 該当時間(横列)で縦行が使用教室のセルに組・科目を書き込む
'ワークシートに保存
 配列に書き込まれたデータをワークシートに出力

6 実際の処理の流れ例

1年1組数学
1年2組数学

7 編成表の作成

 編成表は組・科目と担当教諭・使用教室を関連させる働きをします。全部手入力でもできますが、VLOOKUPを使ってIDで呼び出せるようにしてます。このIDは各時間割表の1列目に記入して以後の処理でも使われます。

8 コマの作成

編成表の略称がそのままコマになります。例えば1年1組・国語総合の略称が「国」の場合、クラス時間割に「国」と入力することによって教員時間割・教室時間割に1年1組のID+略称「11国」と出力されます。

9 イベントプロシージャの設定

VBEの実行ボタンをクリックしなくても、データを書き換えると自動的にプログラムが実行されるようにしましょう。

  1. Alt+F11でVBEを開き、

  2. プロジェクトエクスプローラからクラス時間割をクリックしてシートモジュールを開きます。

  3. そこに書かれているコードはもう使えませんので完全に削除します。

  4. オブジェクトボックスからWorksheetを選択します。

  5. プロシージャボックスからChangeを選択選択します。

  6. Private Sub Worksheet_Change(ByVal Target As Range)に次のコードをコピペし、範囲を指定します。iはクラス時間割の行番号、jは列番号です。

  7. 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

クラス時間割の科目名を書き換えると自動的に実行されるようになります。
「表示>ウインドウ>新しいウィンドウを開く」を使って、教員時間割・教室時間割を確認しながら、クラス時間割で科目を記入や変更ができるようになります。

以上です。ぜひ素敵な時間割を作成してください。