パソコン情報

【Access】VBA内でトランザクション付きでクエリを実行する

ココに注意

この記事の内容でトランザクションの問題

があることが分かりました。

解決策をみつけましたので、下記のサイト内リンクを参考にしてください。

https://pctips.jp/pc-soft/access-query-transaction2020/

 

 

私の様にVBAでバリバリと組めない人は、

 

ココがポイント

VBAとクエリを組み合わせて使えばいい

 

んじゃないかと思います。

今回は、トランザクション処理も付加して安全に複数のクエリを実行できるようにしました。

 

トランザクション処理は、既知の一貫した状態のデータベースを維持するよう設計されており、相互依存のある複数の操作が全て完了するか、全てキャンセルされることを保証する。

 

 

つまり、途中で何かのエラーで止まったとしてもデータを途中で放置しないで、元に戻すか、最後まで実行できることをトランザクション処理と言います。

 

下記に全体のVBA内容を記載します。

 

[php]

Private Sub サンプル_Click()

Dim cn As New ADODB.Connection
Dim cmd As ADODB.Command


        If MsgBox("処理を実行しますか? ", vbYesNo, "更新確認") = vbYes Then


                Set cn = CurrentProject.Connection
                Set cmd = New ADODB.Command
                cmd.ActiveConnection = cn
                
                On Error GoTo ErrorHandler
                
                cmd.CommandText = "BEGIN TRANSACTION"
                cmd.Execute
                
                DoCmd.SetWarnings False
                
                DoCmd.OpenQuery "クエリ1"
                DoCmd.OpenQuery "クエリ2"
                DoCmd.OpenQuery "クエリ3"
                DoCmd.OpenQuery "クエリ4"
                
                cmd.CommandText = "COMMIT TRANSACTION"
                cmd.Execute
                
                Set cmd = Nothing
                cn.Close: Set cn = Nothing


        Else

                MsgBox "処理せずに終了しました。"
                Exit Sub

        End If




ExitErrorHandler:
        Exit Sub
        
        
ErrorHandler:
        cmd.CommandText = "ROLLBACK TRANSACTION"
        cmd.Execute
        Set cmd = Nothing
        cn.Close: Set cn = Nothing
        MsgBox "エラーが発生しました。処理せずに戻ります。"
        End

End Sub


[/php]

 

とにかく、何も考えずに、クエリ1~4までの場所に動かしたいクエリを入れればいいだけです。増やす事も、減らすことも可能です。

 

ここでは、細かいトランザクション処理の説明は省きますが、複数のクエリを実行して、データを整える場合があるときに、トランザクション処理が入っていると本当に安心です。