UI・ユーザーフォーム VBAテクニック集 VBA一覧 オブジェクト操作

【VBA】ユーザーフォームで出席確認ツールを作成する方法|実務で使える設計とコード例

社内研修や定例会議、勉強会などで「誰が出席したのか」を記録する作業は、意外と手間がかかります。紙で回覧したり、Excelに直接入力したりすると、入力ミスや集計漏れが発生しやすく、後から確認するのも大変です。
こうした場面で力を発揮するのが、Excel VBAのユーザーフォームを使った出席確認ツールです。

ユーザーフォームを使えば、ボタン操作だけで出席登録ができ、入力ルールも統一できます。しかし、設計を誤ると「フォームが固まる」「データが正しく保存されない」といったトラブルに繋がります。
この記事では、ユーザーフォームの基本構成から、出席確認ツールを完成させるまでの流れを、コード付きで丁寧に解説します。

✅ 出席確認ツールをユーザーフォームで作るメリット

「セル入力で十分では?」と思われがちですが、ユーザーフォームには明確な利点があります。ここを理解しないまま作り始めると、設計がブレてしまいます。

・ユーザーフォームを使う理由

  • 入力方法を統一できる
  • 誤入力を防止できる
  • 操作が直感的で初心者にも優しい
  • 処理をVBA側で完全に制御できる

特に複数人が使う場合、「誰でも同じ操作ができる」 ことは大きなメリットです。


✅ 今回作成する出席確認ツールの仕様

作る前に、完成形を明確にしておくことが重要です。

・ツールの仕様イメージ

  • ユーザーフォームで名前を選択
  • 出席/欠席をボタンで登録
  • 出席結果をシートに自動記録
  • 同じ人を二重登録しない

この程度の仕様でも、実務では十分活用できます。


✅ 出席データを記録するシートを準備する

まずは、データの保存先となるシートを用意します。

・シート構成例

A列B列C列
日付氏名出席状況

このようにシンプルな構成にしておくと、後から集計もしやすくなります。


✅ ユーザーフォームを作成する手順

ここからが本題です。VBEでユーザーフォームを作成します。

・ユーザーフォームの追加

  1. VBAエディタを開く
  2. 「挿入」→「ユーザーフォーム」
  3. フォーム名を frmAttendance に変更

・配置するコントロール

種類名前用途
ComboBoxcmbName氏名選択
CommandButtonbtnAttend出席
CommandButtonbtnAbsent欠席
CommandButtonbtnClose閉じる
LabellblTitleタイトル表示



✅ フォーム初期化処理(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

メリット


✅ 二重登録を防ぐ仕組みを追加する

実務では「同じ人を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設計力を一段引き上げてくれる題材です。

まずはシンプルな構成で作成し、
必要に応じて「時間帯」「部署」「集計」などを追加してみてください。

    -UI・ユーザーフォーム, VBAテクニック集, VBA一覧, オブジェクト操作