こんにちは!まっつんです。
今回は VBA を使って、身近な業務課題にアプローチしてみました。
はじめに
取締役会や会議の出欠管理を
- 紙でチェック
- 後からExcelに転記
していませんか?
会議実施前や会議中はバタバタしていて、つい後回しにしてしまいがち。
そしてそのまま忘れてしまい、結果調べ直しに時間がかかってしまいます。
本記事では Excel初心者でも作れるVBA を使って、
「入力が簡単・ミスが少ない・会議後の資料作成が楽」 な
出欠管理アプリを作ります。
完成すると、次のことができます。
- 出欠をボタン1つで記録
- 欠席時のみ理由を入力
- 同じ人の二重登録を防止
- 会議終了後に「出席者一覧」を自動作成
作成したもの
エクセルベースでVBAを使って簡単に記録できる仕様
- 入力シートで
「実施日・氏名・出欠」を選択 - [記録する]ボタンを押す
- 記録シートに縦に自動保存
- [出席者一覧]ボタンで会議資料用一覧を生成
全体構成(シート設計)
| シート名 | 役割 |
|---|---|
| 入力 | 出欠を入力する画面 |
| 記録 | 出欠ログ(縦に蓄積) |
| 名簿 | 氏名マスタ |
| 出席者一覧 | 会議後に自動作成 |
STEP1:Excelファイルを準備する
- 新規Excelを作成
- 名前を付けて保存
- Excel マクロ有効ブック(.xlsm)
STEP2:名簿シートを作る
シート名:名簿
A列に取締役の氏名を縦に入力します。
A1:氏名
A2:○○○○
A3:△△△△
A4:□□□□
STEP3:入力シートを作る
シート名:入力
| セル | 内容 |
|---|---|
| B2 | 実施日 |
| B4 | 氏名 |
| B6 | 出欠 |
| B8 | 欠席理由(欠席時のみ) |
氏名(B4)をドロップダウンにする
- データ → データの入力規則
- 種類:リスト
- 元の値
=名簿!A2:A50
出欠(B6)をドロップダウンにする
出席,欠席,途中退席,オンライン
STEP4:記録シートを作る
シート名:記録
A1:記録日時
B1:実施日
C1:氏名
D1:出欠
E1:欠席理由
2行目以降は空欄でOKです。
STEP5:VBAを登録する
VBA画面を開く
Alt + F11- 「挿入」→「標準モジュール」
以下をそのまま貼り付け
Sub 出欠を記録する()
Dim wsInput As Worksheet
Dim wsLog As Worksheet
Dim targetRow As Long
Dim i As Long
Dim answer As VbMsgBoxResult
Set wsInput = Worksheets("入力")
Set wsLog = Worksheets("記録")
' 必須入力チェック
If wsInput.Range("B2") = "" _
Or wsInput.Range("B4") = "" _
Or wsInput.Range("B6") = "" Then
MsgBox "未入力の項目があります", vbExclamation
Exit Sub
End If
' 欠席時は理由必須
If wsInput.Range("B6").Value = "欠席" _
And wsInput.Range("B8").Value = "" Then
MsgBox "欠席理由を入力してください", vbExclamation
Exit Sub
End If
targetRow = 0
' 実施日+氏名を検索
For i = 2 To wsLog.Cells(wsLog.Rows.Count, 1).End(xlUp).Row
If wsLog.Cells(i, 2).Value = wsInput.Range("B2").Value _
And wsLog.Cells(i, 3).Value = wsInput.Range("B4").Value Then
targetRow = i
Exit For
End If
Next i
' 既存データがあった場合
If targetRow > 0 Then
answer = MsgBox("既に登録があります。上書きしますか?", _
vbQuestion + vbYesNo)
If answer = vbNo Then Exit Sub
Else
' 新規の場合は次の空行
targetRow = wsLog.Cells(wsLog.Rows.Count, 1).End(xlUp).Row + 1
End If
' 記録(上書き or 新規)
wsLog.Cells(targetRow, 1).Value = Now
wsLog.Cells(targetRow, 2).Value = wsInput.Range("B2").Value
wsLog.Cells(targetRow, 3).Value = wsInput.Range("B4").Value
wsLog.Cells(targetRow, 4).Value = wsInput.Range("B6").Value
wsLog.Cells(targetRow, 5).Value = wsInput.Range("B8").Value
' 入力欄クリア
wsInput.Range("B4,B6,B8").ClearContents
End Sub
Sub 出席者一覧を作成する()
Dim wsInput As Worksheet
Dim wsLog As Worksheet
Dim wsList As Worksheet
Dim lastRow As Long
Dim outRow As Long
Dim i As Long
Dim targetDate As Date
Set wsInput = Worksheets("入力")
Set wsLog = Worksheets("記録")
Set wsList = Worksheets("出席者一覧")
' 実施日を取得
If wsInput.Range("B2").Value = "" Then
MsgBox "実施日が入力されていません", vbExclamation
Exit Sub
End If
targetDate = wsInput.Range("B2").Value
' 一覧をクリア
wsList.Range("A6:C1000").ClearContents
wsList.Range("B3").Value = targetDate
outRow = 6
lastRow = wsLog.Cells(wsLog.Rows.Count, 1).End(xlUp).Row
' 記録シートをチェック
For i = 2 To lastRow
If wsLog.Cells(i, 2).Value = targetDate _
And (wsLog.Cells(i, 4).Value = "出席" _
Or wsLog.Cells(i, 4).Value = "オンライン") Then
wsList.Cells(outRow, 1).Value = outRow - 5
wsList.Cells(outRow, 2).Value = wsLog.Cells(i, 3).Value
wsList.Cells(outRow, 3).Value = wsLog.Cells(i, 4).Value
outRow = outRow + 1
End If
Next i
MsgBox "出席者一覧を作成しました", vbInformation
End Sub
STEP6:記録ボタンを配置する
入力シート
開発 → 挿入 → フォームコントロール(ボタン)
マクロ:出欠を記録する
使ってみよう
出席入力
欠席だと理由を記入するよう注意
出来上がったリストがこちら
日時毎に一覧も作成可能
おわりに
このExcelは
-
VBA30行程度
-
初心者向け構文のみ
-
実務で即使える
を意識して作りました。
「まずは小さく作る → 改良する」
その第一歩として、ぜひ使ってみてください。



