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

B-Teck!

お仕事からゲームまで幅広く

【VBA】debug.print時にファイルに書き出すプロシージャ

VBA

結構な件数のデータを一度にデバッグで吐き出したかったけどイミディエイトウインドウの制限に引っかかって出力しきれなかったのでファイルに書き出したりするやつを用意した。

'/**
' * OutputLog
' * デバッグログをファイルに出力する
' * @param varData              : 出力対象のデータ
' * @param Optional strFileNm   :(出力ファイル名を指定する場合)ファイル名
' * @param Optional lngDebugFLG :(0=デバッグ・ファイル出力,1=デバッグのみ出力,2=ファイルのみ出力)
' */
Public Sub OutputLog(ByVal varData As Variant, _
                     Optional ByVal lngDebugFLG As Long = 1, _
                     Optional ByVal strFileNm As String = "")
    
    Dim lngFileNum As Long
    Dim strLogFile As String
      
    'ファイル出力対象の場合
    If lngDebugFLG = 0 Or lngDebugFLG = 2 Then
        ' ファイル名の指定がない場合、現在の年月日をファイル名とする
        ' 引数のファイル名に拡張子が存在しない場合、拡張子を付加する
        If strFileNm = "" Then
          strFileNm = Format(Now(), "yyyymmdd") & ".txt"
        ElseIf InStr(strFileNm, ".txt") = 0 Then
          strFileNm = strFileNm & ".txt"
        End If
        
        ' 出力先ファイル設定
        ' Accessで利用する場合はCurrentProjectオブジェクトを使う
        ' strLogFile = CurrentProject.Path & "\" & strFileNm
        strLogFile = ActiveWorkbook.Path & "\" & strFileNm
        lngFileNum = FreeFile()
        Open strLogFile For Append As #lngFileNum
        Print #lngFileNum, varData
        Close #lngFileNum
    End If
    
    'デバッグログ出力対象の場合
    If lngDebugFLG = 0 Or lngDebugFLG = 1 Then
        Debug.Print varData
    End If     

End Sub

使用例

Sub test()
    OutputLog "test"                  'イミディエイトウィンドウにのみ出力
    OutputLog "test1", 0, "testfile1" 'ファイル・イミディエイトウインドウに出力
    OutputLog "test2", 1, "testfile2" 'ファイル名が指定されているがイミディエイトウインドウのみ
    OutputLog "test3", 2, "testfile3" '指定されたファイルのみ出力
End Sub

実際に使うときは、第二引数を定数かなんかで管理しとくと一括でテスト用に置き換えられていいかも。