Excel VBA 逆引き集 | テキストに書き込み

Excel VBA
スポンサーリンク

テキストに書き込み

「ログ出力」「CSV/TSV作成」「設定ファイル生成」など、テキスト書き込みは業務でよく使います。初心者でも安心して使えるように、最短コードから安全テンプレ、文字コード対応までを丁寧にまとめました。


基本の書き込み(Open + Print / Write)

'最短:1行ずつ自由な文字列を書き込み(改行あり)
Sub TextWrite_PrintBasic()
    Dim fn As Integer
    fn = FreeFile
    Open "C:\Data\out.txt" For Output As #fn  '新規作成 or 上書き
    Print #fn, "こんにちは"
    Print #fn, "2行目です"
    Close #fn
End Sub

'CSV向け:Write は自動でカンマ区切り+文字列にダブルクォート
Sub TextWrite_WriteCsvLike()
    Dim fn As Integer
    fn = FreeFile
    Open "C:\Data\out.csv" For Output As #fn
    Write #fn, "田中", 30, "東京"   '→ "田中",30,"東京"
    Write #fn, "佐藤", 25, "大阪"
    Close #fn
End Sub
VB
  • ポイント:
    • Print: 自由な書式で文字列を書ける。行末に改行が入る。
    • Write: CSV風に自動整形(文字列にダブルクォート、要素間にカンマ)。手早いが書式の自由度は低い。
    • Outputモード: 新規作成または上書き。追記は Append を使う。

安全テンプレ(存在確認・エラー復帰・追記)

Sub TextWrite_SafeTemplate()
    Dim path As String, fn As Integer
    path = ThisWorkbook.Path & "\log.txt"

    On Error GoTo Fail
    fn = FreeFile
    Open path For Append As #fn          '追記モード(既存末尾に書く)
    Print #fn, Now & " 開始"
    '…出力…
    Print #fn, Now & " 正常終了"
    Close #fn
    Exit Sub

Fail:
    If fn <> 0 Then Close #fn            'エラーでも確実にクローズ
    MsgBox "書き込み失敗: " & Err.Description, vbCritical
End Sub
VB
  • ポイント:
    • Append: 既存ファイルの末尾に追記。ログに最適。
    • FreeFile→Open→Close: ファイル番号を衝突なく扱う基本パターン。
    • On Error: 失敗時も必ず Close で後始末する。

範囲をCSV/TSV文字列にして厳密出力(エスケープ対応)

'CSVの厳密書き出し(カンマ・改行・ダブルクォート対応)
Sub SaveRange_AsCsvStrict()
    Dim rg As Range: Set rg = Range("A1").CurrentRegion
    Dim fn As Integer: fn = FreeFile
    Open ThisWorkbook.Path & "\export.csv" For Output As #fn

    Dim r As Long, c As Long
    For r = 1 To rg.Rows.Count
        Dim parts() As String
        ReDim parts(1 To rg.Columns.Count)
        For c = 1 To rg.Columns.Count
            Dim s As String: s = CStr(rg.Cells(r, c).Value)
            s = Replace(s, """", """""")            'ダブルクォートを二重化
            If InStr(s, ",") Or InStr(s, vbCr) Or InStr(s, vbLf) Then
                s = """" & s & """"
            End If
            parts(c) = s
        Next
        Print #fn, Join(parts, ",")
    Next
    Close #fn
End Sub

'TSV(タブ区切り)の書き出し
Sub SaveRange_AsTsv()
    Dim rg As Range: Set rg = Range("A1").CurrentRegion
    Dim fn As Integer: fn = FreeFile
    Open ThisWorkbook.Path & "\export.tsv" For Output As #fn
    Dim r As Long, c As Long
    For r = 1 To rg.Rows.Count
        Dim parts() As String
        ReDim parts(1 To rg.Columns.Count)
        For c = 1 To rg.Columns.Count
            Dim s As String: s = CStr(rg.Cells(r, c).Value)
            s = Replace(s, vbTab, " ")             'タブは置換推奨
            parts(c) = s
        Next
        Print #fn, Join(parts, vbTab)
    Next
    Close #fn
End Sub
VB
  • ポイント:
    • 厳密CSV: フィールド内のダブルクォートは二重化、カンマ/改行があればダブルクォートで囲う。
    • TSV: 区切りは vbTab。フィールド内タブは別記号へ置換しておくと安全。

UTF-8で書き出し(日本語の文字化け対策)

'UTF-8(BOMなし)で出力:ADODB.Streamを使用
Sub TextWrite_UTF8()
    Dim sb As String
    sb = "1行目" & vbCrLf & "2行目" & vbCrLf

    Dim st As Object: Set st = CreateObject("ADODB.Stream")
    st.Type = 2                 'adTypeText
    st.Charset = "UTF-8"        '文字コード指定
    st.Open
    st.WriteText sb
    st.SaveToFile ThisWorkbook.Path & "\out_utf8.txt", 2  '2=上書き
    st.Close
End Sub

'UTF-8 BOM付きで出力(BOMを書いてから本文)
Sub TextWrite_UTF8_BOM()
    Dim st As Object, bin As Object
    Set st = CreateObject("ADODB.Stream")
    Set bin = CreateObject("ADODB.Stream")

    'テキスト→UTF-8(BOMなし)に変換
    st.Type = 2: st.Charset = "UTF-8": st.Open
    st.WriteText "こんにちは" & vbCrLf & "BOM付きです"
    st.Position = 0

    'バイナリへBOMを書いてからテキストを連結
    bin.Type = 1: bin.Open                'adTypeBinary
    bin.Write ChrB(&HEF) & ChrB(&HBB) & ChrB(&HBF) 'EF BB BF
    st.CopyTo bin
    bin.SaveToFile ThisWorkbook.Path & "\out_utf8_bom.txt", 2
    bin.Close: st.Close
End Sub
VB
  • ポイント:
    • ADODB.Stream: 文字コードを明示できるためUTF-8で安定出力。
    • BOM付きが必要な受け側: 先にバイナリで BOM を書き込んでからテキストを連結。

FileSystemObjectで書く(可読性・追記が簡単)

Sub TextWrite_FSO()
    Dim fso As Object, ts As Object, p As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    p = ThisWorkbook.Path & "\fso_log.txt"
    Set ts = fso.OpenTextFile(p, 8, True)  '8=ForAppending、新規作成可
    ts.WriteLine Format(Now, "yyyy-mm-dd HH:MM:SS") & " - 開始"
    ts.WriteLine "処理メッセージA"
    ts.WriteLine "処理メッセージB"
    ts.Close
End Sub
VB
  • ポイント:
    • WriteLine: 改行付きで行追加。Append指定がシンプル。
    • 存在チェックやフォルダ操作: FSOは周辺機能が豊富。

例題で練習

'例題1:選択範囲をそのままテキスト(タブ区切り)で保存
Sub Example_SaveSelection_TSV()
    If TypeName(Selection) <> "Range" Then Exit Sub
    Dim rg As Range: Set rg = Selection
    Dim fn As Integer: fn = FreeFile
    Open ThisWorkbook.Path & "\selection.tsv" For Output As #fn
    Dim r As Long, c As Long
    For r = 1 To rg.Rows.Count
        Dim parts() As String: ReDim parts(1 To rg.Columns.Count)
        For c = 1 To rg.Columns.Count
            parts(c) = CStr(rg.Cells(r, c).Value)
        Next
        Print #fn, Join(parts, vbTab)
    Next
    Close #fn
End Sub

'例題2:処理ログを日付別ファイルへ追記
Sub Example_DailyLog()
    Dim path As String: path = ThisWorkbook.Path & "\log_" & Format(Date, "yyyymmdd") & ".txt"
    Dim fn As Integer: fn = FreeFile
    Open path For Append As #fn
    Print #fn, Format(Now, "yyyy-mm-dd HH:MM:SS") & " 受注集計開始"
    Print #fn, "件数=" & 12345
    Close #fn
End Sub

'例題3:UTF-8でCSVを安全に保存(厳密エスケープ)
Sub Example_SaveCsv_UTF8()
    Dim rg As Range: Set rg = Range("A1").CurrentRegion
    Dim r As Long, c As Long, sb As String
    For r = 1 To rg.Rows.Count
        Dim parts() As String: ReDim parts(1 To rg.Columns.Count)
        For c = 1 To rg.Columns.Count
            Dim s As String: s = CStr(rg.Cells(r, c).Value)
            s = Replace(s, """", """""")
            If InStr(s, ",") Or InStr(s, vbCr) Or InStr(s, vbLf) Then s = """" & s & """"
            parts(c) = s
        Next
        sb = sb & Join(parts, ",") & vbCrLf
    Next
    Dim st As Object: Set st = CreateObject("ADODB.Stream")
    st.Type = 2: st.Charset = "UTF-8": st.Open
    st.WriteText sb
    st.SaveToFile ThisWorkbook.Path & "\export_utf8.csv", 2
    st.Close
End Sub
VB

実務の落とし穴と対策

  • 上書き・追記の混乱:
    • 対策: 新規/上書きは Output、追記は Append。目的に合わせて使い分ける。
  • 改行や区切りの崩れ:
    • 対策: CSVはダブルクォートで囲い、内部のダブルクォートは二重化。TSVはフィールド内タブに注意。
  • 文字コード問題(UTF-8/SJIS):
    • 対策: 受け側仕様を確認。UTF-8が必要なら ADODB.Stream を使う。BOM有無の要件も確認。
  • ファイルクローズ忘れ:
    • 対策: 例のようにエラー時も必ず Close するテンプレを使用。
  • 長大テキストの性能:
    • 対策: 文字列の連結は都度 Write/Print で出力するか、最後にまとめ出力する。巨大データはまとめ出力が速い。
タイトルとURLをコピーしました