パソコン情報

【Access】ログ機能をVBAのFunctionプロシージャで実装する方法

マイクロソフトアクセス(以下Accessに略)でデータベースを組んでいると、操作ログを採取したいというケースが少なくありません。

今回は、

ココがポイント

AccessVBAのFunctionプロシージャを使ってログ機能を実装

してみたいと思います。

 

機能説明

機能としては、「いつ、だれが、何を」の操作ログを採取できれば良い訳です。

あとは、「何を」の部分をいくつ採取したいのかでログの取り方は変わっていくと思います。

 

VBAを組んでいくことになるかと思いますが、フォームごとにVBAを入れ込んでいくのは面倒なので、ひとつのVBAを使い回しできるように、

FunctionプロシージャにしてVBAを組んでいきます。

 

 

ログイン時のユーザー

確実に「誰が」という部分を知るために、ログイン時にユーザーを記録した方が良いですね。

変数を、Publicにして、仕組み全体で使用できる変数にしておいた方がいいです。

 

Private Sub login_AfterUpdate()
Dim who As Variant
Dim what As Variant
Dim log1 As Variant
Dim log2 As Variant
Dim log3 As Variant
Dim log4 As Variant
Dim log5 As Variant


If login = "TestUser5" Then

                    DoCmd.OpenForm "menu", acNormal, , , acFormEdit, acWindowNormal
                    DoCmd.Close acForm, "login", acSaveNo
                    login_user = "Ma2n2n"
                    who = login_user
                    
Else
                    MsgBox ("ログインNOが相違しています。")
                    login = ""
                    who = "ログイン失敗"

End If

                    what = "ログイン"

 Call add_log(who, what, log1, log2, log3, log4, log5)

End Sub

とりあえず、ログインすると、whoが、「Ma2n2n」になり、whatが、「ログイン」が代入されるようにしました。

そして、Call add_log でFunctionプロシージャに行くようにしています。

なを、

ココに注意

データ型は、数字でも文字でも入れられるように、Variant型

にしてあります。

※String型にすると、Nullなどの場合エラーが出ます。

 

Funtionプロシージャ

Functionプロシージャと言えば、初心者だったころは敷居の高いVBAという感じがしましたが、使いこなせば便利です。

結果を返すようなFunctionプロシージャもありますが、今回は、データベースにログを記録するだけのプロシージャになります。

 

Function add_log(who_input As Variant, what_input As Variant, uch1_input As Variant, uch2_input As Variant, uch3_input As Variant, uch4_input As Variant, uch5_input As Variant)
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
  
            On Error GoTo ErrRtn
            
                       'アクションクエリ非表示設定
                        DoCmd.SetWarnings False

                Set cn = CurrentProject.Connection
                Set rs = New ADODB.Recordset
                rs.Open "log", cn, adOpenKeyset, adLockOptimistic

                    ' トランザクションの開始
                    cn.BeginTrans
'
                    rs.AddNew

                    rs!when_time = Now()
                    rs!who = who_input
                    rs!what = what_input
                    rs!uch1 = uch1_input
                    rs!uch2 = uch2_input
                    rs!uch3 = uch3_input
                    rs!uch4 = uch4_input
                    rs!uch5 = uch5_input

                    rs.Update

                    ' トランザクションの保存
                    cn.CommitTrans

                rs.Close: Set rs = Nothing
                cn.Close: Set cn = Nothing


ExitErrRtn:
    Exit Function

ErrRtn:
'    MsgBox "エラー: " & Err.description
    'BeginTransの時点まで戻り、変更をキャンセルする
    cn.RollbackTrans
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing


End Function

 

このコードを見て頂ければ分かるように、「いつ」の部分は、NOW()でシステムから自動で入力されることになります。

そして、「だれ」「なに」と、他5個の採取データをするようにしてあります。

とりあえず、logテーブルも掲載しておきます。

 

 

ログを採取したい場所に埋め込む

Private Sub add_btn_Click()
Dim who As Variant
Dim what As Variant
Dim log1 As Variant
Dim log2 As Variant
Dim log3 As Variant
Dim log4 As Variant
Dim log5 As Variant
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
        
    If MsgBox("追加しますか? yes/no", vbYesNo, "データ追加登録") = vbYes Then
    
            On Error GoTo ErrRtn
            
                       'アクションクエリ非表示設定
                        DoCmd.SetWarnings False

                Set cn = CurrentProject.Connection
                Set rs = New ADODB.Recordset
                rs.Open "data", cn, adOpenKeyset, adLockOptimistic

                    ' トランザクションの開始
                    cn.BeginTrans
'
                    rs.AddNew

                    ' 追加したいデータ内容

                    rs.Update

                    ' トランザクションの保存
                    cn.CommitTrans

                rs.Close: Set rs = Nothing
                cn.Close: Set cn = Nothing

                    ' ログ書き込む
                    who = login_user
                    what = "新規登録"
                    log1 = add_data1
                    log2 = add_data2
                    log3 = add_data3
                    log4 = add_data4
                    log5 = add_data5
                                    
                    Call add_log(who, what, log1, log2, log3, log4, log5)

                    
                    MsgBox ("登録しました。")
            
            Else
            
                MsgBox ("登録しないで戻りました。")
                Exit Sub
    
    End If

ExitErrRtn:
    Exit Sub

ErrRtn:
    MsgBox "エラー: " & Err.description
    'BeginTransの時点まで戻り、変更をキャンセルする
    cn.RollbackTrans
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing

上のVBAコードは、フォームからデータを追加ボタンを押したときに、同時にログを採取しています。

ログを採取する(logテーブルに書き込む)変数を設定してCall add_logで実行させれば良いだけです。

 

ログデータは自由に表示

ログデータは、テーブルlogに蓄積されていきますので、フォームに起して、データを抽出してもいいし、レポートにしても良い訳です。

 

参考

複数人がシステムを使うような場合は、誰が何をしたのかを把握するにはこのような仕組みを入れておくと良いかもしれません