テキストに書き込み
「ログ出力」「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 で出力するか、最後にまとめ出力する。巨大データはまとめ出力が速い。
