こんにちは、なかぜんです。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 コードを書いて運用できそう—という自信が持てた
- 定期アーカイブや検索・可視化といった運用の深め方もイメージできた
次のステップとしては:
- 本番環境で試す前に、ログテーブルを作ったテスト環境で動作確認
- 運用開始後はログ量やパフォーマンスに注意し、自動アーカイブなど運用周りも構築
- 差分ログの可視化や、必要ならレポート化ツールへの連携なども検討
なかぜんでした。また次の記事でお会いしましょう!
