読者です 読者をやめる 読者になる 読者になる

みんなのちからになりたい

コピペでブログラムつくっていきたい

地獄のVBAデバッグを少しだけ楽にするクソコード書いた

どっかの誰かが作ったAccessVBAで、ありがちだけどコードにSQLが大量に記述されてしかもループや配列の中身を項目名にしてるSQLなもんだから、一見みただけだと変数だらけでなにやってるかまったく理解不能のSQLなのでDebug.Printで出さざるを得ない状態になったんだけど、ログに吐き出せないしDebug.Printって何度も書くの地獄だったので、ファイルにログ吐き出すクソコード書いた。

新しいモジュール作ってドバっとコピペすれば動く。

Const pDisable As Boolean = False

Public Sub p(ByVal vData As Variant, Optional indent As Integer = 0, Optional ByVal bFlg As Boolean = False)

    If pDisable = True Then Exit Sub

    Dim i As Integer
    Dim tabstr As String: tabstr = ""
    Do Until i >= indent
        tabstr = tabstr & vbTab
        i = i + 1
    Loop

    If bFlg = True Then
        Call WriteLog(tabstr & vData)
    Else
        Debug.Print tabstr & vData
    End If

End Sub

Private Sub WriteLog(ByVal vData As Variant)

    On Error GoTo Catch

    Dim fso As Object
    Dim fsoTxt As Object
    Dim bOpend As Boolean: bOpend = False
    Dim sLogFile As String: sLogFile = CurrentProject.Path & "\" & Environ("COMPUTERNAME") & "_" & Replace(Date, "/", "-") & ".txt"

    Const ForReading = 1, ForWriting = 2, ForAppending = 8

    Set fso = CreateObject("Scripting.FileSystemObject")

    Set fsoTxt = fso.OpenTextFile(sLogFile, ForAppending, True): bOpend = True
    fsoTxt.Writeline vData
    fsoTxt.Close: bOpend = False

Exit_WriteLog:
    If bOpend Then
        fsoTxt.Close
    End If
    Set fsoTxt = Nothing
    Set fso = Nothing
    Exit Sub
Catch:
    Resume Exit_WriteLog
End Sub

こんなコード書くと

p "START"
p "てすと", 1
p "てすと", 2
p "てすと", 3
p "END"

イミディエイトウィンドウにこんな感じで出る。

START
    てすと
        てすと
            てすと
END

最後の引数をTrueにすればログ吐くし、リリースするときいらなければpDisableをTrueにしとけば吐き出さない。
基本的にデバッグの時にしか使わないコードなのでデフォルトをPrintなのかファイルなのかは使う人がハードコーディングで好きに変えればいいと思う。

VBA、いい加減デバッグログの出力先を変えられるようになるかVSTOになって死滅してほしい。