ACCESS Debug.Printの使い方

Debug.Printの使い方

ACCESSで想定しない動作が発生したときにどうやって原因を解析しますか?

VBAの処理の途中で、変数に格納した値がどうなっているか確認できれば、解析がしやすいですよね。
そんなときに便利なのが、Debug.Printです。

今回は、ACCESSのエラー解析に使用するDebug.Printの使い方をご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。

Debug.Printとは

ACCESS VBAのエラー解析でよく利用されるのが Debug.Print です。

VBAのコードに以下の構文で記述を行うと、Visual Vasic Editor(VBE)の画面下段に表示される、イミディエイトウィンドウにメッセージを表示できます。

Debug.Print “表示したいメッセージ”

実際に使用すると以下のようになります。

Degug.Print で「エラーメッセージ」というテキストを指定していますので、イミディエイトウィンドウにそのテキストが表示されます。

Degug.Print は処理自体には影響を与えずにイミディエイトウィンドウに表示ができるため、エラーの解析に適しているのです。

VBAのコードのIF文の分岐先にDebug.Printを入れ、分岐ルートを通っているかを確認したり、処理の最中に変数に格納された値が想定通りかを確認するために使用します。

Debug.Printの利用シーン

Debug.Printはプロシージャの動作には一切影響しません。

そのため、プロシージャを作成する際に必ず入れなければいけないものではありません。

一方で、こんな時にはDebug.Printを入れておくと便利、というシーンがいくつかあります。

条件分岐

If文で条件分岐をさせているプロシージャの場合、変数の値によって分岐先を変えることが多いと思います。

作成したプロシージャの動作を検証する際、どの条件分岐ルートを通っているか確認するために、分岐先ごとに異なるメッセージをDebug.Printで表示させると便利です。

下記の例ではIf文の分岐先を表すメッセージをDebug.Printで表示させています。


Public Sub debug_print()

Dim bunki As Long

If bunki > 0 Then

    Debug.Print "分岐1"

Else

    Debug.Print "分岐2"
    
End If


End Sub

変数の値の確認

長い処理のプロシージャを作成すると、処理の最中で変数に格納した値が適切かを確認したくなります。

こうした際も、処理の最中にDebug.Printで変数の値を表示させると、間違いがないかを確認できます。

下記の例では、Do Loop処理中に値に誤りがないかを出力しています。


        Do Until rst2.BOF

            rst2!請求 = "false"
            rst2!請求済 = "true"
            rst2!請求ID = seikyu_id
            rst2.Update
            Debug.Print "請求ID付与:" & rst2!売上ID

            rst2.MovePrevious
            
        Loop

Debug.Printの使い方

では、Debug.Print の具体的な使い方を見ていきましょう。

以下は、請求書発行時に、売上伝票を請求済みにする処理を行うために作成したVBAのプロシージャです。


Public Sub seikyu()

'変数にADOオブジェクトを代入
Set cnn = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient
Set rst2 = New ADODB.Recordset
rst2.CursorLocation = adUseClient

'レコードセットを取得
rst1.Open "TRN_請求", cnn, adOpenKeyset, adLockOptimistic
rst2.Open "TRN_売上", cnn, adOpenKeyset, adLockOptimistic


'トランザクション処理開始
cnn.Execute "begin transaction;"

rst1.Filter = "請求ID = " & seikyu_id
rst2.Filter = "請求 = true and 顧客ID =" & seikyu_kokyaku_id

    '請求伝票を「請求済」に更新
    rst1.Update "請求済", "True"

    '売上伝票を「請求済」に更新し、「請求ID」を追記。
    If rst2.recordcount = 0 Then
        
        MsgBox "請求対象の伝票がありません。", vbCritical * vbOKOnly, "請求対象なし"
        'ロールバック
        cnn.Execute "rollback transaction;"

    Else
        Debug.Print "請求対象売上ID数:" & rst2.recordcount

        rst2.MoveLast

        Do Until rst2.BOF

            rst2!請求 = "false"
            rst2!請求済 = "true"
            rst2!請求ID = seikyu_id
            rst2.Update
            Debug.Print "請求ID付与:" & rst2!売上ID

            rst2.MovePrevious
            
        Loop

    'コミット
    cnn.Execute "commit transaction;"

    End If
                
'終了処理
rst1.Close: Set rst1 = Nothing
rst2.Close: Set rst2 = Nothing
cnn.Close: Set cnn = Nothing

End Sub

Debug.Printは2か所に使用しています。

最初はIf文のElseの後の「 Debug.Print “請求対象売上ID数:” & rst2.recordcount 」です。

これはよく使う方法で、If文で分岐させた際に、意図したルートを通っているかを確認するために使用します。
今回は、Elseに来た場合のレコードカウント(件数)をイミディエイトウィンドウに表示させています。

なお、Debug.Printで表示させる際は値( rst2.recordcount )だけを表示すると何の数字かわからなくなるので、テキストでラベルにあたるものも表示させるようにしています。

もう一つはrst2の更新処理中に記載した「 Debug.Print “請求ID付与:” & rst2!売上ID 」です。

これは処理対象の主キーを表示させているのですが、更新処理が適切に行われているかを主キー単位で確認するために記述しています。

テストデータでいくつかのパターンのデータを作成し、処理を実行した際に、主キーごとに想定した動作をしているか確認することができます。

このように、Debug.Printをうまく活用すればエラー箇所を早く特定することが可能です。

以上、Debug.Printの使い方をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。