作業管理をExcelで行おうとすると、毎月の定型業務の履歴を管理する方法として、こんなアイデアが浮かぶかもしれません。
- 各作業を「列方向」に展開して、月ごとの実績や予定を横に追加していく
- または、「月ごと」に新しいシートやブックを作成する
たしかにこれらは始めやすく、見た目もわかりやすいかもしれません。ですが、時間が経つにつれ次のような課題が出てきます。
- 関数やリンクを使ってまとめようとすると、かえって複雑になる
- 列方向の管理は横に長くなり、スクロールが大変で見にくい
- シートやブックが増えると、内容が重複し、管理が煩雑になる
Accessを使えば、履歴管理がシンプルにできます。Accessでは、履歴を「テーブル」に蓄積していくスタイルなので、年月ごとに分けた情報も1つの表でスッキリ管理できます。
毎月の履歴(T2_History)をボタン1つで自動追加する方法をご紹介します。
目次
使用するテーブルの構成と追加例
ここで紹介するテーブルの例です。
テーブル名と用途
- M1_Category :作業のカテゴリ定義
- M2_Status :ステータス(未着手など)
- T1_Tasks: 作業の元データ(一覧)
- T2_History :各月の作業履歴
T2_Historyの主なフィールド
- YearMonth:(履歴の対象年月:例「202505」)
- PlannedDate:(作業予定日)
- ActualDate:(作業実施日)
- Status:(作業の状態。M2_Statusに対応)
履歴追加の例
テーブル「T1_Tasks」

テーブル「T1_Tasks」と同じIDで年月を追加する

SQLで履歴を追加するクエリ
T1_Tasksに登録された作業IDを、まだT2_Historyに存在していない年月だけ追加するクエリです。
例:「202505」を追加
INSERT INTO T2_History ( ID, YearMonth )
SELECT T1_Tasks.ID, 202505
FROM T1_Tasks
WHERE NOT EXISTS ( SELECT 1 FROM T2_History WHERE T2_History.ID = T1_Tasks.ID AND T2_History.YearMonth = 202505 );
「202505」の部分は任意の年月に変更可能です。
フォーム+VBAで操作を簡単
テキストボックスに「yyyymm」の形で年月を入力し、コマンドボックスをクリックします。

- txtYearMonth: テキストボックス 年月(例:202505)を入力
- btnAddHistory: コマンドボタン 履歴追加処理を実行
Private Sub btnAddHistory_Click()
Dim ym As String
ym = Me.txtYearMonth
' 入力チェック(6桁の数字かどうか)
If Len(ym) <> 6 Or Not IsNumeric(ym) Then
MsgBox "正しい年月(例:202505)を入力してください。", vbExclamation
Exit Sub
End If
' SQL文作成
Dim sql As String
sql = "INSERT INTO T2_History (ID, YearMonth) " & _
"SELECT T1_Tasks.ID, " & ym & " " & _
"FROM T1_Tasks " & _
"WHERE NOT EXISTS ( " & _
" SELECT 1 FROM T2_History " & _
" WHERE T2_History.ID = T1_Tasks.ID AND T2_History.YearMonth = " & ym & ");"
' 実行(警告メッセージOFF)
DoCmd.SetWarnings False
DoCmd.RunSQL sql
DoCmd.SetWarnings True
MsgBox "履歴を追加しました(" & ym & ")", vbInformation
End Sub