Excelのマクロ コードに「debug.print」 コマンドを入れておくと、マクロ実行中の変数の内容や、処理の途中経過を、VBE(Visual Basic Editor)のイミディエイトウィンドゥへ出力してくれます。
とても便利なのですが、出力文字数が大きすぎると最初に表示されたものから順に消されていきます。そのため、WEBページのソースコードなど、大量の文字列を表示しようとすると、一部表示しきれない行が出てきます。また、イミディエイトウィンドゥは、表示エリアが小さいので 一覧性に欠けます。
ということで、debug.printで、ある程度まとまった文字列を表示しようとすると、どうしても外部ファイルへ出力して、改めてテキストエディタ等にて確認することになります。
Excel VBA では、OpenコマンドとPrintコマンドを使用して、外部ファイルへの出力をするのですが、私は今まで、T'sWare(ティーズウェア)さんのサイトで紹介されている「Debug.Printの内容をファイルに出力するサンプルプロシージャ」を利用させてもらっていました。
トップページの上部右側のメニュー群の中から、「Tips」を選択すると、Microsoft Access に関する大量のサンプルプログラムが紹介されています。
その中で、「#546 Debug.Printの内容をファイルに出力するサンプルプロシージャ」が、シンプルで使いやすいです。
Access のVBAに関するプログラムですが、Excel VBAでも問題なく動きます。
tsware.jp
このサイトで紹介されているコードでは、出力ファイル名、出力先フォルダは、固定であったため、それらが変更できるように、自分でも作成してみましたので紹介します。
Sub PrintData(prtDATA As Variant, _
Optional fileName As String = "", _
Optional dirPath As String = "")
【" & Left(prtDATA, 30) & "】"
【" & fileName & "】"
【" & dirPath & "】"
【" & Dir(dirPath, vbDirectory) & "】"
Dim defFileName As String
defFileName = "VBAdebugPrint.txt"
Dim defDirPath As String
defDirPath = ThisWorkbook.Path & "\"
Dim outputFileName As String
outputFileName = fileName
If fileName = "" Then
outputFileName = defFileName
End If
Dim dirCheck As String
dirCheck = Dir(dirPath, vbDirectory)
Dim outputPath As String
If dirCheck = "." Or dirCheck = "" Then
outputPath = defDirPath
Else
outputPath = Trim(dirPath)
If Right(outputPath, 1) <> "\" Then
outputPath = outputPath & "\"
End If
End If
Dim fileNo As Byte
fileNo = FreeFile
Dim errCount As Byte
errCount = 0
On Error GoTo ERROR_TRAP
Open outputPath & outputFileName For Append As #fileNo
On Error GoTo 0
Print #fileNo, prtDATA
Close #fileNo
PrintEnd:
Debug.Print prtDATA
Exit Sub
ERROR_TRAP:
If errCount = 0 Then
outputFileName = StrConv(outputFileName, vbWide) & ".txt"
errCount = errCount + 1
Debug.Print "★ PrintDataのファイル名不正のため、ファイル名を全角に変換。"
Debug.Print "★ → " & outputFileName
Resume
Else
On Error GoTo 0
Debug.Print "★ PrintDATAの出力中止"
GoTo PrintEnd
End If
End Sub
動作テスト
Sub TEST_PrintData()
PrintData "test1 *** " & Now
PrintData "test2 *** " & Now, Date & ".txt"
PrintData "test3 *** " & Now, "書き込みテスト.txt"
PrintData "test4 *** " & Now
PrintData "test5 *** " & Now, Date & ".txt"
PrintData "test6 *** " & Now, "書き込みテスト.txt"
End Sub