はじめに
現役の高校教員(数学)です。エンジニアではありません。
教員には「教務手帳」という紙の手帳があります。担当クラスの名簿が入っていて、授業のたびに出欠を書き込み、学期末に欠課時数を数える、あれです。
これを毎日やっていると、地味にしんどい作業が2つあります。
- 授業のたびに、クラスごとの名簿を開いて該当生徒の欄に印をつける
- 学期末に、その印を1人ずつ数える
特に2が厳しい。私の場合、担当は7クラス・年間288時間あります。数え間違いは許されないのに、目視で数えます。
これをClaude Codeと一緒にExcelで作り直しました。今は 日付と欠席者の番号を打つだけで、7クラス分の出席簿に自動転記され、欠課時数と出席率が常に出ている状態です。
この記事には生徒の個人情報・成績データは一切含みません。仕組みだけを書きます。
環境
- Windows / Excel(マクロ有効ブック
.xlsm) - Claude Code
- VBAは書けません(書いてもらいました)
作ったものの全体像
シート構成はこうなりました。
| シート | 役割 |
|---|---|
| 設定 | 学期の開始日・終了日・授業週数 |
| 時間割 | 曜日×時限の基本時間割+変更・休講の登録テーブル |
| 欠課入力 | 毎日触るのはここだけ |
| 各クラス(7枚) | 出席簿の本体。1クラスあたり295列 |
日々の運用は「欠課入力」シートだけで完結します。他は最初に設定したら基本触りません。
1. 入力を1画面に閉じ込める
最初に決めたのは「毎日触る画面を1つにする」ことでした。
紙の運用がしんどいのは、作業そのものより「7クラス分の名簿を行ったり来たりすること」だったからです。
そこで入力シートはこの4ステップだけにしました。
1. 日付を入力(Ctrl + ; で今日が入る)
2. その日の時間割が自動で表示される
3. 欠席者の番号を、3桁・カンマ区切りで打つ
4. [欠課を記入] ボタンを押す
打つのは日付と番号だけです。科目は自分で選びません。
日付を入れたら時間割が出る
ここが地味に効きました。日付から曜日を求めて、時間割シートを引いています。
=IFERROR(IF(INDEX(時間割!$B$5:$H$16, MATCH($B$5, 時間割!$A$5:$A$45, 0), 時限) <> "",
... ), "")
さらに、時間割シートには「変更・休講テーブル」を別に用意しました。基本時間割と、その日だけの例外を分けて持つ設計です。学校の時間割は行事や考査でよく崩れるので、ここを分けないと現実に耐えません。休講の日は「休講」と入力すれば、その時限は転記対象から外れます。
2. キー設計:3桁番号
複数クラスを1つの入力欄で扱うために、生徒の識別子をこう決めました。
3桁番号 = 組 × 100 + 出席番号
例) 1組10番 = 110
2組37番 = 237
6組 5番 = 605
110, 237, 605 のようにカンマ区切りで打つと、マクロが上位1桁で行き先のクラスシートを判定し、下2桁で行を特定します。
これは自分で思いついたわけではなく、Claude Codeと「複数クラスをどう1画面で捌くか」を相談していて出てきた形です。入力する人間が桁の意味を覚えるだけで、シート選択の操作が丸ごと消えるのが良いところでした。
補足すると、この番号の付け方は学校の校務システムが元々使っている形式と同じです。既存の業務で使われている識別子をそのまま使うと、移行時に覚え直しが発生しません。ここは新しく設計しない方が正解でした。
3. 出席簿は「1授業=1列」にした
各クラスのシートは、こういう構造です。
A列 : 番号
B列 : 氏名
C列〜: 1学期(78回)
CC列〜: 2学期(102回)
GA列〜: 3学期(108回)
KE〜KG列: 学期別の欠課数
KH列 : 年間欠課
KI列 : 年間出席率
授業1回につき1列。年間288回なので、288列あります。全部で295列。横に長大です。
正直これは設計として悩みました。「1行1レコード(日付・生徒・欠課)の縦持ちの方がデータとしては正しいのでは」と考えたからです。
ただ、紙の出席簿がまさにこの形でした。横に日付が並び、縦に生徒が並ぶ。教員は全員この形を見慣れています。
データとして正しい形と、現場が読める形は違う。ここは現場が読める方を採りました。移行のコストを下げる方が優先だと判断したからです。
各列には、欠課したら / が入ります。これも紙の出席簿の記号をそのまま踏襲しました。
4. 集計は COUNTIF 1本
そして、この設計のおかげで集計はとても単純になりました。
1学期の欠課 = COUNTIF(C2:CB2, "/")
2学期の欠課 = COUNTIF(CC2:FZ2, "/")
3学期の欠課 = COUNTIF(GA2:KD2, "/")
年間欠課 = 1学期 + 2学期 + 3学期
年間出席率 = IFERROR((288 - 年間欠課) / 288, "")
**学期末に数える作業がゼロになりました。**常に計算済みの状態です。ここが今回一番うれしかった点です。
数え間違いが構造的に起こらなくなった、というのが正確な表現かもしれません。人間が数えないので。
5. Claude Codeに何をしてもらったか
VBAは1行も書けません。やったのは、こういう会話でした。
- 「7クラス分の出席簿を、1つの入力画面から更新したい」
- 「3桁の番号をカンマ区切りで受け取って、上1桁でシートを選んで、下2桁で行を探して、該当する日付の列に
/を入れたい」 - 「休講の日は転記しないでほしい」
日本語で条件を伝えると、動くマクロが返ってきます。詰まったのはむしろ自分の要件が曖昧なときでした。
例えば「同じ日に同じ生徒を2回入力したらどうするか」を決めていませんでした。実装の途中でClaude Codeに聞かれて、初めて考えました。結論としては、既に / が入っているセルは上書きしても結果が変わらないので、そのままにしました。
こういう**「詰めていない仕様を先に聞かれる」経験**が、非エンジニアには一番勉強になった気がします。自分では気づけない穴だからです。
6. ハマったポイント
| ハマり | 対処 |
|---|---|
| 授業回数が学期で違う(78 / 102 / 108) | 列の範囲を決め打ちにせず、設定シートで学期の授業週数を持つ |
| 時間割が行事で崩れる | 基本時間割と「変更・休講テーブル」を分けて持つ |
| 日付から時限を引くのが煩雑 | 日付入力を1セルに固定し、そこから時間割をINDEX/MATCHで展開 |
| 列が295もあり目視でズレる | 学期の境目に見出し行を置く。集計はCOUNTIFに任せて目視しない |
.xlsm はマクロ有効で保存が必要 |
通常の .xlsx で保存するとマクロが消える |
7. 校務でAIを使うときに気をつけていること
最後に、これは技術以上に大事なので書いておきます。
生徒の個人情報はAIに渡していません。
Claude Codeに読ませているのは、シートの構造・列の意味・数式だけです。名簿のデータそのものは触らせていません。作業としては、
- 構造だけを説明してマクロと数式を作ってもらう
- 実データは自分の手元でExcelに入れる
という順序に固定しています。Claude Codeが手元のファイルを直接読むツールだからこそ、「どのファイルを見せるか」を自分で決められる。ここは意識して線を引いています。
教員には守秘義務があります。便利になることと、生徒のデータを守ることは、当然ですが後者が優先です。仕組みは共有できるが、データは共有できない。この線引きさえ守れば、校務の効率化にAIを使うことに問題はないと考えています。
おわりに
作ったものは、Excelとしては特別なことを何もしていません。INDEX/MATCHとCOUNTIF、あとは短いVBAだけです。
それでも、毎日の入力が1画面に減り、学期末の集計がゼロになったのは、体感としてかなり大きい変化でした。
非エンジニアがこの手のものを作るとき、難しいのは技術ではなく「自分の業務のどこが本当に面倒なのか」を言語化することだと思います。私の場合、面倒の正体は「数えること」ではなく「7クラス分の名簿を行き来すること」でした。そこに気づいてから設計が決まりました。
Claude Codeは、その言語化を手伝ってくれる相手としても役に立ちます。作る前に「何が面倒なのか」を話すところから始めるのが、たぶん一番の近道です。
次は、同じくExcelで作った欠課時数の集計まわりについて書く予定です。