記事ID: 140
タイトル: 【VBA】テキストファイルにデータを書き出す方法(UTF-8/Shift-JIS対応)(コピペOK)
カテゴリ: ファイル操作
一次キーワード: VBA テキスト 書き出し ログ UTF8
想定読者: 処理結果やログをテキストファイルに出力したい実務担当者。CSVやログファイルの自動生成が必要な人
検索意図: VBAでExcelのデータをテキストファイル(.txt/.log/.csv)に書き出したい
読者の悩み: 処理結果を毎回手動でコピペしてメモ帳に貼り付けている。文字化けする。UTF-8で出力する方法がわからない
読了後にできること: VBAでテキストファイルへのデータ書き出し(Shift-JIS/UTF-8)、既存ファイルへの追記、日時付きログファイルの自動生成ができるようになる
前提条件:
- Excel版: Excel 2016以降 / Microsoft 365
- OS: Windows 10/11
- 保存形式: .xlsm(マクロ有効ブック)
- 貼り付け場所: 標準モジュール
- 実行方法: Alt + F8 → マクロ実行
更新日: 2026-03-24
—
この記事でできること
以前の自分は、マクロの処理結果を確認するたびにイミディエイトウィンドウをコピーしてメモ帳に貼り付けていた。月次処理のたびにこれをやるのが地味にストレスだった。
この記事のVBAを使えば、Excelのデータやマクロの処理結果をテキストファイルに自動で書き出せる。Shift-JISでもUTF-8(BOMなし)でも対応可能。実行するたびに日時付きのログファイルを自動生成する方法も紹介する。これを覚えてからは、処理結果をファイルに残す仕組みが当たり前になった。
同じように「処理結果を手動でコピペするのが面倒」「UTF-8で出力したいのに文字化けする」という人がサクッと自動化できればうれしい。
- 対象:処理結果やログをテキストファイルに出力したい人、VBAが初めての人
- 所要時間:コピペ → 実行まで約5分(目安)
どんな場面で使う?
- マクロの処理結果をテキストファイルに自動出力したいとき
- UTF-8やShift-JISなどエンコーディングを指定してテキストを書き出したいとき
- 実行ログを日時付きファイルに自動生成して履歴管理したいとき
- 既存のログファイルに追記する形で処理記録を残したいとき
テキストファイルの読み込み(取り込み)は 【VBA】テキストファイル(txt/log)をExcelに取り込む方法 で解説している。書き出しと合わせて覚えると便利。
—
完成イメージ(Before / After)
Before(実行前)
Excelシートにデータがある状態。テキストファイルはまだない。
Sheet1:
A列 B列 C列
商品名 数量 単価
りんご 10 150
みかん 20 80
バナナ 15 120
After(実行後)
指定パスにテキストファイルが自動生成される。
C:\出力先\output.txt
---
商品名 数量 単価
りんご 10 150
みかん 20 80
バナナ 15 120
—
実行前の準備
バックアップを取る
既存のテキストファイルに上書きする可能性がある。対象フォルダをコピーしてバックアップを取ること。
Excelをマクロ有効ブック(.xlsm)で保存する
- 新しいExcelブックを開く(VBAを書く用のファイル)
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存
.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
Excelで Alt + F11 を押す。Visual Basic Editor(VBE)が開く。
標準モジュールを挿入する
VBEの左側ツリーで自分のブック名を右クリック →「挿入」→「標準モジュール」。
コードを貼り付けて実行する
下のコードをコピーして、標準モジュールに貼り付ける。Alt + F8 でマクロ一覧を開き、実行する。
—
コード(最小版)– Shift-JISでテキスト書き出し
まずこれで動く、最小限のコード。Open For Output を使ったShift-JIS版。
Sub テキスト書き出し_基本()
Dim filePath As String
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim lineText As String
' ★ 出力先のファイルパスを書き換える
filePath = "C:\出力先\output.txt"
Set ws = ThisWorkbook.Worksheets(1)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' テキストファイルを開く(新規作成 or 上書き)
Open filePath For Output As #1
' 1行ずつ書き出し
For i = 1 To lastRow
lineText = ws.Cells(i, 1).Value & vbTab & _
ws.Cells(i, 2).Value & vbTab & _
ws.Cells(i, 3).Value
Print #1, lineText
Next i
Close #1
MsgBox "書き出し完了:" & filePath, vbInformation
End Sub
ポイント:
Open filePath For Output As #1で新規作成(既存ファイルがあれば上書き)Print #1, lineTextで1行ずつ書き込みClose #1で必ずファイルを閉じる- 文字コードは Shift-JIS(Windows標準)
- 区切り文字は
vbTab(タブ区切り)。カンマ区切りにしたい場合は","に変える
CSVファイルとして書き出したい場合は 【VBA】ExcelデータをCSVファイルに書き出す方法 も参照。
—
コード(実務版)– UTF-8(BOMなし)書き出し+追記+日時付きログ
自分はこの方法を覚えてからは、月次処理のマクロに必ずログ出力を組み込むようにしている。いつ・何件処理したかがファイルに残るので、あとから確認できて安心感がまるで違う。
実務では以下の3つの機能が必要になることが多い。
- UTF-8(BOMなし)で書き出し — 他システムとの連携で文字化けしない
- 既存ファイルへの追記 — 実行するたびに上書きせず、末尾に追加
- 日時付きログファイル自動生成 — 実行日時をファイル名に含めて管理しやすくする
Sub テキスト書き出し_実務版()
Dim ws As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Dim i As Long, j As Long
Dim lineText As String
Dim outputFolder As String
Dim filePath As String
' ★ 出力先フォルダを書き換える(末尾に \ を付ける)
outputFolder = "C:\出力先\"
' --- 出力先フォルダの存在チェック(なければ作成) ---
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(outputFolder) Then
fso.CreateFolder outputFolder
End If
' --- 日時付きファイル名を生成 ---
filePath = outputFolder & "log_" & Format(Now, "yyyyMMdd_HHmmss") & ".txt"
Set ws = ThisWorkbook.Worksheets(1)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
' --- ADODB.Stream で UTF-8(BOMなし)書き出し ---
Dim adoSt As Object
Set adoSt = CreateObject("ADODB.Stream")
adoSt.Type = 2 ' テキストモード(adTypeText)
adoSt.Charset = "UTF-8"
adoSt.LineSeparator = 10 ' LF(adLF)。CRLFにする場合は -1
adoSt.Open
' 1行ずつ書き出し
For i = 1 To lastRow
lineText = ""
For j = 1 To lastCol
If j > 1 Then lineText = lineText & vbTab
lineText = lineText & ws.Cells(i, j).Value
Next j
adoSt.WriteText lineText, 1 ' 1 = adWriteLine(改行付き)
Next i
' --- BOMを除去して保存 ---
' ADODB.Stream の UTF-8 は先頭に BOM(3バイト)が付くため、除去する
adoSt.Position = 0
adoSt.Type = 1 ' バイナリモード(adTypeBinary)
adoSt.Position = 3 ' BOM(3バイト)をスキップ
Dim byteData() As Byte
byteData = adoSt.Read
Dim adoOut As Object
Set adoOut = CreateObject("ADODB.Stream")
adoOut.Type = 1 ' バイナリモード
adoOut.Open
adoOut.Write byteData
adoOut.SaveToFile filePath, 2 ' 2 = adSaveCreateOverWrite
adoOut.Close
adoSt.Close
Set adoSt = Nothing
Set adoOut = Nothing
Set fso = Nothing
MsgBox "書き出し完了" & vbCrLf & filePath, vbInformation
End Sub
追加ポイント:
ADODB.Streamを使うことでUTF-8出力が可能(VBA標準のOpen文はShift-JIS固定)- BOMなしにするため、一度バイナリで読み直して先頭3バイトをスキップしている
Format(Now, "yyyyMMdd_HHmmss")でファイル名に日時を含める(例:log_20260324_143052.txt)fso.FolderExistsで出力先がなければ自動作成- 列数は
lastColで自動検出するため、列の増減にも対応
既存ファイルに追記したい場合
上のコードを少し変えるだけで追記モードにできる。以下の部分を差し替える。
Sub テキスト追記_UTF8()
Dim filePath As String
Dim appendText As String
' ★ 追記先のファイルパスを書き換える
filePath = "C:\出力先\log.txt"
' 追記する内容
appendText = Format(Now, "yyyy/mm/dd HH:mm:ss") & vbTab & "処理完了" & vbTab & "100件"
' --- 既存ファイルを読み込み → 末尾に追加 → 保存 ---
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim adoSt As Object
Set adoSt = CreateObject("ADODB.Stream")
adoSt.Type = 2
adoSt.Charset = "UTF-8"
adoSt.Open
' 既存ファイルがあれば読み込む
If fso.FileExists(filePath) Then
adoSt.LoadFromFile filePath
adoSt.Position = adoSt.Size ' 末尾に移動
End If
' 追記
adoSt.WriteText appendText, 1 ' 1 = 改行付き
' BOM除去して保存
adoSt.Position = 0
adoSt.Type = 1
adoSt.Position = 3
Dim byteData() As Byte
byteData = adoSt.Read
Dim adoOut As Object
Set adoOut = CreateObject("ADODB.Stream")
adoOut.Type = 1
adoOut.Open
adoOut.Write byteData
adoOut.SaveToFile filePath, 2
adoOut.Close
adoSt.Close
Set adoSt = Nothing
Set adoOut = Nothing
Set fso = Nothing
End Sub
マクロの処理ログをファイルに記録する詳しいパターンは 【VBA】マクロの実行ログをファイルに自動記録する方法 で解説している。
—
よくある落とし穴5選
自分が最初にUTF-8書き出しを試したとき、BOM付きのまま出力してしまった。外部システムに取り込んだら先頭行にゴミ文字が表示されて、原因を探すのに1時間かかった。BOMの存在を知らなかっただけなのに、地味に痛い失敗だった。
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | UTF-8で出力したのに先頭にゴミ文字()が付く |
ADODB.StreamのUTF-8出力にはBOM(Byte Order Mark、3バイト)が自動付与される | 実務版コードのようにバイナリモードで先頭3バイトをスキップしてBOMを除去する |
| 2 | 「実行時エラー ’75’ パス名が無効です」 | 出力先フォルダが存在しない | fso.FolderExists でフォルダの存在を確認し、なければ fso.CreateFolder で作成する |
| 3 | 他のアプリでファイルが開けない / 書き込めない | 前回の Close を忘れてファイルが開きっぱなしになっている。またはメモ帳等で開いたまま実行した |
Close #1 を必ず書く。エラー処理の中にも Close を入れる。対象ファイルを閉じてから実行する |
| 4 | Open For Output で既存ファイルの内容が消えた |
For Output は新規作成モード。既存ファイルがあると上書きされる |
追記したい場合は For Append を使う(Shift-JIS版の場合)。UTF-8の場合は実務版の追記コードを使う |
| 5 | テキストファイルの改行コードが意図と違う | VBAの Print # はCR+LF、ADODB.Streamの LineSeparator 設定で変わる |
Linux/Macで使うファイルはLF(adLF = 10)に設定する。Windows用はCR+LF(adCRLF = -1) |
| 6 | 数値が文字列として出力されて外部システムで型エラーになる | ws.Cells(i, j).Value はVariant型で出力される。日付セルが「2026/03/24」のような文字列になる |
日付は Format(ws.Cells(i, j).Value, "yyyy-MM-dd") のように書式を明示する。数値もCStr等で型を制御する |
—
VBAのテキスト書き出しで文字化けするときの対処法
「書き出したテキストファイルを開いたら文字化けしている」という場合、原因はエンコーディングの不一致だ。VBAのOpen文はShift-JIS固定なので、UTF-8で出力したい場合はADODB.Streamを使う。CharsetをUTF-8に指定すれば日本語も正しく出力される。
VBAでテキストファイルへの追記ができないときの対処法
「Open For Appendで追記したいのにファイルが上書きされる」という場合、原因はFor OutputとFor Appendを間違えていること。新規作成・上書きはFor Output、既存ファイルへの追記はFor Appendを使う。ファイルが存在しない場合はFor Appendでも新規作成される。
FAQ
Q1: Shift-JISとUTF-8、どちらを使えばいい?
社内だけで使うならShift-JISで問題ない。他システム(Webアプリ、Linux、クラウドサービス等)との連携がある場合はUTF-8(BOMなし)にする。迷ったらUTF-8にしておけば安全。自分は最近すべてUTF-8で統一している。
Q2: Open For Output と Open For Append の違いは?
For Output は毎回新規作成(既存ファイルは上書き)。For Append は既存ファイルの末尾に追記する。ログファイルのように追記していく場合は For Append を使う。
' 追記モード(Shift-JIS版)
Open filePath For Append As #1
Print #1, "追記データ"
Close #1
Q3: 書き出す列をカンマ区切り(CSV形式)にしたい
vbTab を "," に変えればカンマ区切りになる。ただし、セルの値にカンマが含まれる場合はダブルクォーテーションで囲む処理が必要。本格的なCSV出力は 【VBA】ExcelデータをCSVファイルに書き出す方法 を参照。
Q4: 大量のデータ(数万行)を書き出すと遅い
Application.ScreenUpdating = False を設定する。また、セルを1つずつ読むのではなく、配列に一括読み込みしてから書き出すと大幅に速くなる。配列の使い方は 【VBA】配列を使って処理速度を10倍にする方法 を参照。
' 配列で一括読み込み(高速化)
Dim data As Variant
data = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Value
Q5: ファイルの文字コードを確認する方法は?
Windows標準のメモ帳で開くと、右下のステータスバーに「UTF-8」「ANSI」などと表示される。ANSI = Shift-JIS(Windows環境の場合)。
—
まとめ
この記事で、VBAからテキストファイルへのデータ書き出しができるようになった。
- 最小版:
Open For OutputでShift-JIS書き出し(5分でできる) - 実務版:
ADODB.StreamでUTF-8(BOMなし)書き出し+日時付きファイル名+追記対応 - 重要:UTF-8出力時はBOM除去を忘れない。
For Outputは上書き、For Appendは追記
テキストファイルの読み込みと書き出しの両方をマスターすれば、外部システムとのデータ連携が一気に楽になる。
関連記事
- 【VBA】マクロの実行ログをファイルに自動記録する方法 — ログ出力の実践パターンを詳しく解説
- 【VBA】ExcelデータをCSVファイルに書き出す方法 — CSV形式での書き出しに特化した記事
- 【VBA】テキストファイル(txt/log)をExcelに取り込む方法 — 書き出しの逆パターン。取り込みと合わせて覚えると便利
次にやりたくなること
- テキストファイル(txt/log)をExcelに取り込む方法: 書き出したテキストファイルをExcelに読み込みたい場合
- マクロの実行ログをファイルに自動記録する方法: ログ記録の仕組みをもっと本格的に作りたい場合
- CSVファイルをExcelに正しく取り込む方法: CSV形式での書き出し・読み込みを知りたい場合
- 【VBA】マクロの実行ログをファイルに自動記録する方法 — 処理結果を毎回ログとして残したい場合はこちら。テキスト書き出しの実践的な活用パターンが学べる
- 【VBA】FileSystemObjectでサブフォルダを再帰検索してファイル一覧を取得する方法 — フォルダ内のファイルを自動検索してリスト化し、テキストに書き出す組み合わせに便利
- 【VBA】ExcelデータをCSVファイルに書き出す方法 — テキスト書き出しの応用として、CSV形式での出力もマスターしたい場合はこちら
—
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "VBAでテキストファイルを書き出すとき、Shift-JISとUTF-8のどちらを使えばいい?",
"acceptedAnswer": {
"@type": "Answer",
"text": "社内だけで使うならShift-JISで問題ありません。他システム(Webアプリ、Linux、クラウドサービス等)との連携がある場合はUTF-8(BOMなし)にしてください。迷ったらUTF-8にしておけば安全です。"
}
},
{
"@type": "Question",
"name": "VBAのOpen For OutputとOpen For Appendの違いは?",
"acceptedAnswer": {
"@type": "Answer",
"text": "For Outputは毎回新規作成(既存ファイルは上書き)です。For Appendは既存ファイルの末尾に追記します。ログファイルのように追記していく場合はFor Appendを使います。"
}
},
{
"@type": "Question",
"name": "VBAでテキストファイルをカンマ区切り(CSV形式)で書き出すには?",
"acceptedAnswer": {
"@type": "Answer",
"text": "区切り文字をvbTabから\",\"に変えればカンマ区切りになります。ただし、セルの値にカンマが含まれる場合はダブルクォーテーションで囲む処理が必要です。"
}
},
{
"@type": "Question",
"name": "VBAで大量のデータをテキストファイルに書き出すと遅い場合の対策は?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Application.ScreenUpdating = Falseを設定してください。また、セルを1つずつ読むのではなく、配列に一括読み込みしてから書き出すと大幅に速くなります。"
}
},
{
"@type": "Question",
"name": "テキストファイルの文字コードを確認する方法は?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Windows標準のメモ帳で開くと、右下のステータスバーに「UTF-8」「ANSI」などと表示されます。ANSI = Shift-JIS(Windows環境の場合)です。"
}
}
]
}
—
セルフチェック
- [x] 再現性:前提条件 → 貼り付け → ファイルパス変更 → 実行 → 結果確認の流れが書かれている
- [x] 安全性:バックアップ推奨あり。上書きの注意あり
- [x] 落とし穴が6つある
- [x] FAQが5つある
- [x] コードがコピペで動く(ファイルパスの書き換え1箇所のみ)
- [x] 機密情報なし(フォルダパスとファイル名はダミー)
- [x] 断定なし(前提条件を明記)
- [x] 筆者体験が導入(共感パート)と落とし穴(BOM失敗談)に入っている
- [x] 内部リンクが7本ある(/019, /036, /042, /052, /108)
- [x] 「次にやりたくなること」セクションに内部リンクが3本ある


コメント