社内研修や定例会議、勉強会などで「誰が出席したのか」を記録する作業は、意外と手間がかかります。紙で回覧したり、Excelに直接入力したりすると、入力ミスや集計漏れが発生しやすく、後から確認するのも大変です。
こうした場面で力を発揮するのが、Excel VBAのユーザーフォームを使った出席確認ツールです。
ユーザーフォームを使えば、ボタン操作だけで出席登録ができ、入力ルールも統一できます。しかし、設計を誤ると「フォームが固まる」「データが正しく保存されない」といったトラブルに繋がります。
この記事では、ユーザーフォームの基本構成から、出席確認ツールを完成させるまでの流れを、コード付きで丁寧に解説します。
目次
- ✅ 出席確認ツールをユーザーフォームで作るメリット
- ・ユーザーフォームを使う理由
- ✅ 今回作成する出席確認ツールの仕様
- ・ツールの仕様イメージ
- ✅ 出席データを記録するシートを準備する
- ・シート構成例
- ✅ ユーザーフォームを作成する手順
- ・ユーザーフォームの追加
- ・配置するコントロール
- ✅ フォーム初期化処理(Initialize)
- ・Initializeイベントのコード
- ✅ 出席ボタンの処理を作成する
- ・出席ボタンのコード
- ✅ 欠席ボタンの処理
- ✅ 標準モジュールで共通処理を作成する
- ・標準モジュールのコード例
- ✅ 二重登録を防ぐ仕組みを追加する
- ・チェック用Functionの例
- ・出席処理に組み込む
- ✅ フォームを表示するMain処理
- ✅ 実務でよくある失敗と注意点
- ・ユーザーフォームに処理を書きすぎる
- ・シート構成を途中で変更する
- ・日付判定を入れていない
- ✅ RPA(UiPath)と併用する場合の考え方
- ✅ まとめ:ユーザーフォームで出席確認ツールを作成する方法
✅ 出席確認ツールをユーザーフォームで作るメリット
「セル入力で十分では?」と思われがちですが、ユーザーフォームには明確な利点があります。ここを理解しないまま作り始めると、設計がブレてしまいます。
・ユーザーフォームを使う理由
- 入力方法を統一できる
- 誤入力を防止できる
- 操作が直感的で初心者にも優しい
- 処理をVBA側で完全に制御できる
特に複数人が使う場合、「誰でも同じ操作ができる」 ことは大きなメリットです。
✅ 今回作成する出席確認ツールの仕様
作る前に、完成形を明確にしておくことが重要です。
・ツールの仕様イメージ
- ユーザーフォームで名前を選択
- 出席/欠席をボタンで登録
- 出席結果をシートに自動記録
- 同じ人を二重登録しない
この程度の仕様でも、実務では十分活用できます。
✅ 出席データを記録するシートを準備する
まずは、データの保存先となるシートを用意します。
・シート構成例
| A列 | B列 | C列 |
|---|---|---|
| 日付 | 氏名 | 出席状況 |
このようにシンプルな構成にしておくと、後から集計もしやすくなります。
✅ ユーザーフォームを作成する手順
ここからが本題です。VBEでユーザーフォームを作成します。
・ユーザーフォームの追加
- VBAエディタを開く
- 「挿入」→「ユーザーフォーム」
- フォーム名を
frmAttendanceに変更
・配置するコントロール
| 種類 | 名前 | 用途 |
|---|---|---|
| ComboBox | cmbName | 氏名選択 |
| CommandButton | btnAttend | 出席 |
| CommandButton | btnAbsent | 欠席 |
| CommandButton | btnClose | 閉じる |
| Label | lblTitle | タイトル表示 |
✅ フォーム初期化処理(Initialize)
ユーザーフォームを開いたときに、名前リストをセットします。
・Initializeイベントのコード
Private Sub UserForm_Initialize()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("名簿")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To lastRow
Me.cmbName.AddItem ws.Cells(i, 1).Value
Next i
End Sub
ポイント
- 初期化処理は必ず
UserForm_Initializeに書く - フォーム表示時に毎回最新の名簿を読み込める
✅ 出席ボタンの処理を作成する
ここがツールの中核です。
・出席ボタンのコード
Private Sub btnAttend_Click()
If Me.cmbName.Value = "" Then
MsgBox "氏名を選択してください。"
Exit Sub
End If
Call WriteAttendance(Me.cmbName.Value, "出席")
MsgBox "出席を登録しました。"
Me.cmbName.Value = ""
End Sub
✅ 欠席ボタンの処理
出席とほぼ同じ構造にします。
Private Sub btnAbsent_Click()
If Me.cmbName.Value = "" Then
MsgBox "氏名を選択してください。"
Exit Sub
End If
Call WriteAttendance(Me.cmbName.Value, "欠席")
MsgBox "欠席を登録しました。"
Me.cmbName.Value = ""
End Sub
✅ 標準モジュールで共通処理を作成する
ユーザーフォーム側に処理を書きすぎると、保守性が落ちます。
ここで標準モジュールを活用します。
・標準モジュールのコード例
Public Sub WriteAttendance(ByVal userName As String, ByVal status As String)
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("出席記録")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(lastRow, 1).Value = Date
ws.Cells(lastRow, 2).Value = userName
ws.Cells(lastRow, 3).Value = status
End Sub
メリット
- フォームと処理を分離できる
- 他のツールでも再利用可能
参考:【VBA】標準モジュールの呼び出し方法とは|Sub・Functionの使い分けと実務設計
✅ 二重登録を防ぐ仕組みを追加する
実務では「同じ人を2回登録してしまう」事故が起きがちです。
・チェック用Functionの例
Public Function IsAlreadyRegistered(ByVal userName As String) As Boolean
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("出席記録")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row
Dim i As Long
For i = 2 To lastRow
If ws.Cells(i, 2).Value = userName And ws.Cells(i, 1).Value = Date Then
IsAlreadyRegistered = True
Exit Function
End If
Next i
IsAlreadyRegistered = False
End Function
・出席処理に組み込む
If IsAlreadyRegistered(Me.cmbName.Value) Then
MsgBox "すでに登録されています。"
Exit Sub
End If
✅ フォームを表示するMain処理
最後に、フォームを呼び出す入口を作ります。
Public Sub ShowAttendanceForm()
frmAttendance.Show
End Sub
このSubをボタンやRPAから呼び出すことで、ツールを起動できます。
参考:【Excel】開発タブの使い方を初心者向けに解説|マクロ・VBA・フォームを活用して業務効率化!
✅ 実務でよくある失敗と注意点
ここを読まないと、後で確実に困ります。
・ユーザーフォームに処理を書きすぎる
→ 修正が困難になる
・シート構成を途中で変更する
→ コードが壊れる
・日付判定を入れていない
→ 出席データが混在する
✅ RPA(UiPath)と併用する場合の考え方
RPAと併用する場合は、
- RPA →
ShowAttendanceFormを呼ぶ - VBA側でロジックを完結させる
という設計が理想です。
これにより、VBA側の修正がRPAに影響しにくくなります。
✅ まとめ:ユーザーフォームで出席確認ツールを作成する方法
- ユーザーフォームは入力ミス防止に最適
- Initializeで初期データを設定する
- 処理は標準モジュールに分離する
- 二重登録防止は必ず入れる
- Main処理を用意すると拡張しやすい
- RPA連携を意識すると実務で強い
ユーザーフォームを使った出席確認ツールは、
VBA設計力を一段引き上げてくれる題材です。
まずはシンプルな構成で作成し、
必要に応じて「時間帯」「部署」「集計」などを追加してみてください。