スポンサーリンク

Accessアプリにおけるログ設計と運用方法(上級者向け)

スポンサーリンク
Access
スポンサーリンク

こんにちは、なかぜんです。Access や VBA を業務でガンガン使いこなす皆さまにとって、「ログってもっとしっかり設計したい」「でもどう始める?」というモヤモヤはありませんか?そんな悩みに優しく寄り添いつつ、実践的な方法とコード例を交えて、ログを安定・効率よく運用するノウハウをお届けします。安心してチャレンジしてくださいね!

スポンサーリンク

1. なぜログ設計/運用が重要なのか

Access アプリは、小規模〜中規模の業務で大活躍しますが、それゆえに気づきにくい不具合や操作ミスが発生しがちです。「いつ」「誰が」「どんな操作をしたのか」がログで追えるだけで、トラブル対応や監査対応が格段に楽になります。

  • 操作履歴の追跡で原因特定が迅速に
  • 不正操作や誤操作の予防・抑制にも
  • 作業内容を定量的に把握できる

2. ログ設計の基本構成

2.1 ログテーブルの構成(例)

まずはログをため込むテーブルの基本構成から。例えば以下のような構造です:

<!-- テーブル名:tblLog -->
Field Name       | Data Type          | 説明
---------------------------------------------------------
LogID            | AutoNumber (PK)    | ログの一意識別子
UserID           | Long Integer       | 操作したユーザー ID
Action           | Text (255)         | 実行した操作(例:"データ登録", "削除")
TargetTable      | Text (100)         | 対象テーブル名
RecordID         | Long Integer       | 該当レコードのキー値(null 可)
ActionDate       | Date/Time          | 実行日時
Details          | Memo / Long Text   | 操作内容の詳細(変更前後など)

「Details」列には、変更前・変更後の内容や、入力内容などを JSON 形式・Key‑Value 形式で記録すると扱いやすくなります。

2.2 ログ挿入のタイミング

操作直後にログを記録すると安心です。基本は以下のタイミングで:

  • データの追加/更新/削除後(DoCmd.RunSQL 後など)
  • フォームの「保存」ボタン押下時
  • 重大なイベント(ログイン/エクスポートなど)発生時

具体的には、VBA 内でログ用プロシージャを作っておくと便利ですね。

3. コード例と画面イメージ

3.1 VBA:ログ記録プロシージャ

Public Sub WriteLog(ByVal UserID As Long, ByVal Action As String, _
                      ByVal TargetTable As String, ByVal RecordID As Variant, _
                      ByVal Details As String)
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Set db = CurrentDb()
    Set rst = db.OpenRecordset("tblLog", dbOpenDynaset)

    rst.AddNew
    rst!UserID = UserID
    rst!Action = Action
    rst!TargetTable = TargetTable
    rst!RecordID = IIf(IsNull(RecordID), Null, RecordID)
    rst!ActionDate = Now()
    rst!Details = Details
    rst.Update

    rst.Close
    Set rst = Nothing
    Set db = Nothing
End Sub

上記のプロシージャを、たとえば「注文」登録フォームで使うと:

Private Sub btnSave_Click()
    ' ここで通常の保存処理...
    DoCmd.RunSQL "INSERT INTO tblOrders (...) VALUES (...)"
    ' ログ記録
    Call WriteLog(CurrentUserID, "データ登録", "tblOrders", Me!OrderID, "自動登録 by フォーム")
End Sub

こうすることで、誰がいつどんな操作をしたかがしっかり残ります。画面イメージとしては、Access データシートビューで tblLog を開くと、さまざまな操作履歴が一覧できます。

4. 注意点やよくあるミス

  • ログテーブルが肥大化しすぎて動作が重くなる → 定期的なアーカイブ実行を推奨
  • Details に「全部保存したい!」と大量テキストを詰めすぎてパフォーマンス落ち → 必要最小限に絞る工夫を
  • 同時編集/アクセスの衝突 → 分散型の Access では排他制御やレコードロックにも注意
  • ログ未記録状態でエラー → エラー処理の中でも WriteLog 呼び出しを忘れずに

5. 応用ポイント

5.1 アーカイブ自動化

VBA やバッチで定期的に古いログを別ファイルや別テーブルに移動するようにすると、システムの健全性が保たれます。たとえば:

Sub ArchiveLogs()
    Dim cutoff As Date
    cutoff = DateAdd("m", -3, Date) ' 3か月前より古いログ

    CurrentDb.Execute "INSERT INTO tblLogArchive SELECT * FROM tblLog WHERE ActionDate < #" & cutoff & "#;"
    CurrentDb.Execute "DELETE FROM tblLog WHERE ActionDate < #" & cutoff & "#;"
End Sub

5.2 ログの検索・レポート化

Access クエリやフォーム、VBA のフィルターを使って、たとえば「特定ユーザーが削除した記録」などを抽出すれば、監査用に強力なレポートになります。フォーム上にログを表示するボタンを設けたり、CSV 出力したりするのも実務では定番ですね。

5.3 JSON や細かい差分ログを扱う

より高度に扱いたい場合は、Details に JSON で変更前と変更後を記録し、後で VBA 側で解析する流れも作れます。たとえば:

Dim beforeJson As String, afterJson As String
beforeJson = "{""Quantity"":10,""Price"":500}"
afterJson = "{""Quantity"":12,""Price"":500}"
Call WriteLog(CurrentUserID, "更新", "tblOrders", Me!OrderID, "変更前:" & beforeJson & " → 変更後:" & afterJson)

これにより、異なるバージョンの差分を後で VBA で解析したり、Excel に吐いたりできます。

6. まとめと次のステップ

今回は、Access アプリにおける「ログ設計と運用方法」について、ログテーブルの構成、VBA コード例、注意点や応用ポイントを、なかぜんらしい優しい語り口でご紹介しました。この記事を読んでいただくことで、

  • ログ設計の基本が明確になった
  • 実際に VBA コードを書いて運用できそう—という自信が持てた
  • 定期アーカイブや検索・可視化といった運用の深め方もイメージできた

次のステップとしては:

  1. 本番環境で試す前に、ログテーブルを作ったテスト環境で動作確認
  2. 運用開始後はログ量やパフォーマンスに注意し、自動アーカイブなど運用周りも構築
  3. 差分ログの可視化や、必要ならレポート化ツールへの連携なども検討

なかぜんでした。また次の記事でお会いしましょう!