日々の業務において、Excelを使った単純作業に多くの時間を費やしてはいないでしょうか。講師や研修担当の方であれば、その代表例が「座席表」の作成かもしれません。一つ一つのセルに手作業で名前をコピー&ペーストし、レイアウトが変わるたびに修正する…こうした作業は、創造的とは言えず、時間ばかりが過ぎていきます。
実は、このような定型業務こそ、Excel VBA を活用することで劇的に効率化できる領域です。
この記事では、私が実際に構築し、現場で利用した「座席表作成ツール」を題材に、VBAがいかにして私たちの仕事の生産性を飛躍的に向上させてくれるのかを紹介します。VBAの便利さを体感し、もう一歩進んだExcelスキルを身につけたいと考えているビジネスパーソンの皆様、ぜひ最後までお付き合いください。
背景にある課題:ある大学の先生の悩み
このツールを構築したきっかけは、ある大学教員からの依頼でした。新学期が始まり、授業の履修登録者が確定した後、速やかに座席表を作成しなければならないのですが、その作業が想像以上に大きな負担となっているとのことです。
その課題は、次のようなものでした。
- 膨大な時間コスト:特に履修者が100名を超えるような大規模な授業では、名簿からExcelシートへ手作業で転記するだけで、かなりの時間を費やすことがありました。
- ヒューマンエラーの発生:手作業によるコピー&ペーストのミスは避けられず、名前の重複や漏れが発生。それが原因で、初回の授業での出欠確認やグループ分けの際に混乱を招いていました。
- 柔軟性の欠如:履修変更期間の直後は参加者が流動的ですし、通常授業と試験期間では座席レイアウトを変更する必要があるなど、その都度ほぼゼロから作り直す手間が発生していました。
これらは、教育現場に限らず、多くのオフィスで起こりうる典型的な非効率業務の姿です。
このツールが実現する、スマートな業務フロー
では、VBAで作成したツールが、この面倒な作業をどのように変えるのでしょうか。技術的な解説に入る前に、まずはこのツールが実現する驚くほどシンプルな操作フローをご覧ください。
1. 準備:2つのシートを用意するだけ
ユーザーが行う準備はたった2つです。
data
シート:A列に履修者名簿を貼り付けます。座席表
シート:座席にしたいセルを好きな色で塗り、レイアウトを作成します。
2. 実行:ボタンを押し、3つの質問に答える
準備ができたら、data
シートに設置した「座席表作成」ボタンをクリックします。すると、ツールが対話形式で3つの質問をしてきます。
- 質問① 「どの色のセルを座席にしますか?」 → 色付きのセルを一つクリックして答えます。
- 質問② 「縦方向に並べますか?」 → 「はい」か「いいえ」で答えます。
- 質問③ 「完成シートの名前は何にしますか?」 → 名前を入力します(日時の初期値あり)。
3. 完成:わずか数秒で、新しいシートに座席表が自動生成
全ての質問に答えると、入力した名前で新しいシートが自動で作成され、そこには背景色がクリアされた見やすい座席表が完璧な状態で生成されています。元の座席表
シートはテンプレートとしてそのまま残るため、何度でも繰り返し利用可能です。
手作業であれば数十分かかっていた作業が、慣れればわずか30秒ほどで完了します。これこそがVBAによる業務自動化の力です。
VBAコードの核心に触れる:4つのキーポイント
では、このスマートな挙動を実現しているプログラムの内部を覗いてみましょう。すべてを解説するのではなく、このツールの「心臓部」とも言える、特に重要な4つのポイントに絞って、そのコードと考え方をご紹介します。
ポイント1:ユーザーに「セルを選択させる」対話ボックス
ツールを使いやすくするためには、ユーザーに複雑な操作をさせないことが重要です。座席の色を指定する際に、色の番号を入力させるのではなく、セルを直接クリックしてもらうためのコードがこちらです。
' --- 座席の色を選択させる部分 --- Dim selectedCell As Range Set selectedCell = Application.InputBox("座席の色のセルを選択してください。", "色選択", Type:=8)
Application.InputBox
に Type:=8
という引数を加えるだけで、Excelはユーザーにセル範囲を選択させる特殊なダイアログを表示します。これにより、ユーザーは直感的な操作が可能になります。
ポイント2:名簿の人数を「自動で」把握する
参加者の数は毎回変動します。人数が変わるたびにコードを修正するのはスマートではありません。以下のコードは、data
シートA列に何人の名前が入力されていても、その最終行を自動で検知します。
' --- 名簿の最終行を取得する部分 --- Dim lastRow As Long lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
これはVBAにおける定石で、シートの一番下のセルから上方向に遡ってデータのある最終セルを探します。この一行があるだけで、ツールは普遍的な対応力を手に入れます。
ポイント3:座席の位置情報を「収集し、並べ替える」
これが今回のロジックの心臓部です。バラバラに配置された座席セルを、指定された順番(縦または横)に並べ替えるための考え方です。
' --- 座席セルを縦方向に収集する部分 --- Dim seatCells As Collection Set seatCells = New Collection Dim i As Long, j As Long For j = 1 To 10 ' 列を先にループ For i = 1 To 20 ' 行を後にループ If Cells(i, j).Interior.ColorIndex = 36 Then ' もし黄色なら seatCells.Add Cells(i, j) ' seatCellsに格納 End If Next i Next j
Collection
という「入れ物」:まずseatCells
という特殊な変数(コレクション)を用意します。これは、発見した座席セルを順番に放り込んでおくための便利な入れ物です。For...Next
の二重ループ:シート全体をくまなく探すため、ループを二重(入れ子)にします。- ループの順番が「並び順」を決める:「列(j)のループ」を外側に、「行(i)のループ」を内側にすることで、プログラムは一つの列を上から下まで探し、終わったら隣の列に移る、という動きになります。これが「縦方向」の並び順の正体です。逆にすれば「横方向」になります。この単純な順番の入れ替えで、複雑な処理を実現しているのです。
ポイント4:エラーを「予測」し、先回りする処理
ユーザーが入力したシート名が既に使用されていた場合、通常マクロはエラーで停止してしまいます。それを防ぎ、ユーザーに再入力を促すための、より堅牢なエラー処理の考え方がこちらです。
' --- シート名のエラー処理部分の考え方 --- On Error Resume Next ' エラーが起きても続行させるおまじない newWs.Name = newSheetName ' ←ここでエラーが起きる可能性がある If Err.Number <> 0 Then ' エラーが起きた場合の処理(警告メッセージを表示) End If On Error GoTo 0 ' おまじないを解除
On Error Resume Next
で一時的にエラーを無視させ、処理の直後にエラーが発生したかどうか(Err.Number
)をチェックします。この構造により、予期せぬエラーでツールが停止することを防ぎ、ユーザーを優しく導くことが可能になります。
まとめと完成版コードのご案内
いかがでしたでしょうか。ここでご紹介したコードは、「かんたん座席表作成ツール」を構成するコードのほんの一部です。
実際の完成版コードには、
- 人数があふれた場合に、対象者一覧をアラート表示する機能
- 堅牢なシート名重複チェックと、再入力を促すループ処理
- 完成したシートを自動で整形し、テンプレートを初期化する一連の処理
など、実務で安心して使うための様々な工夫が網羅されています。
このツールの全貌と、すぐに使えるVBAコードのすべてを盛り込んだ完全版の記事は、以下のnoteで公開しています。
コピー&ペーストしてすぐに使える完成品が欲しい方、そしてVBAのスキルをさらに一段階引き上げたい方は、ぜひご覧ください。
▼ VBAで業務を自動化する第一歩!コピペで使える「座席表作成ツール」全コードと徹底解説
この記事が、あなたの業務改善のヒントとなり、VBAという新たなスキルへの扉を開く一助となれば幸いです。