昨日投稿しました "「debug.print」の内容を外部テキストファイルへ出力 " について、出力ファイル名に関する処理に少し手を加えました。
ファイル名に禁止文字が含まれていた場合、ファイル名全体を全角化して新ファイル名として出力するようになっていましたが、その部分の処理を、ファイル名の禁止文字のみ全角化するように変更しました。
例えば、ファイル名に「Now」関数を使用した場合、以下のような違いがあります。
--- 昨日版 ---
(指定したファイル名) 2020/06/03 20:27:28.txt
(出力したファイル名) 2020/06/03 20:27:28.txt.txt
文字全部を全角化しているので、ファイル名が長くなります。
--- 本日版 ---
(指定したファイル名) 2020/06/04 18:17:12.txt
(出力したファイル名) 2020/06/04 18:17:12.txt
「/」と「:」のみ全角化しています。
******************
昨日版からのコード変更箇所は、特定文字を全角化する関数を追加しました。
ERROR_TRAP: の中で、以下の自作関数を呼び出しています。
Function ProhibitedCharactersNarrowToWide(chkName As String)
「禁止文字を半角から全角へ」という、英単語を並べただけの長いプロシージャ名になってしまいました。
実行方法は昨日と同じです。マクロコード中に以下の書式で記述します。
PrintData2 出力したい文字列 , ファイル名 , 出力フォルダフルパス
(ファイル名と出力パスは省略可能です。
プロシージャ名は、 PrintData から PrintData2 へ変更しています。
Sub PrintData2(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 = Trim(fileName)
If fileName = "" Then
outputFileName = defFileName
End If
If Right(LCase(outputFileName), 4) <> ".txt" Then
outputFileName = outputFileName & ".txt"
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 = ProhibitedCharactersNarrowToWide(outputFileName)
errCount = errCount + 1
Resume
Else
On Error GoTo 0
Debug.Print "★ PrintDATAの出力中止(指定ファイル名異常)"
GoTo PrintEnd
End If
End Sub
Function ProhibitedCharactersNarrowToWide(chkName As String)
Dim changeName As String
changeName = chkName
Dim prohibitChara As Variant
prohibitChara = Array("\", "/", ":", "*", "?", "<", ">", "|", """")
Dim chara As Variant
For Each chara In prohibitChara
If InStr(chkName, chara) > 0 Then
changeName = Replace(changeName, chara, StrConv(chara, vbWide))
End If
Next chara
ProhibitedCharactersNarrowToWide = changeName
End Function
動作確認
出力先は指定していませんので、このマクロコードが実行されたExcelブックと同じフォルダに出力しています。
Sub TEST_PrintData2()
PrintData2 "test1 *** ファイル名指定無し。 " & Now
PrintData2 "test2 *** ファイル名に日時を指定。" & Now, Now & ".txt"
PrintData2 "test3 *** ファイル名に日時を指定。" & Now, Now & ".txt"
PrintData2 "test4 *** ファイル名指定無し。 " & Now
PrintData2 "test5 *** ファイル名指定。" & Now, "書き込みテスト.txt"
PrintData2 "test6 *** ファイル名指定。" & Now, "書き込みテスト.txt"
End Sub
★2021/3/6 追記。
ファイル名を指定する際、拡張子".txt" をつけ忘れた場合に、末尾に".txt"を付加するコードを追加しました。
Dim outputFileName As String
outputFileName = Trim(fileName)
If fileName = "" Then
outputFileName = defFileName
End If
If Right(LCase(outputFileName), 4) <> ".txt" Then
outputFileName = outputFileName & ".txt"
End If