業務管理テーブルにある業務の履歴管理をする方法〜SQLとVBA履歴追加する

作業管理を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
目次