CSVファイルは、
業務システム・他部署・外部サービスなど、あらゆる場面で受け渡しに使われます。
一方でExcelでCSVを扱うと、
- 文字化けする
- 列がずれる
- 勝手に日付や数値に変換される
- 保存し直したら形式が壊れた
といったトラブルが非常に起きやすいのも事実です。
VBAを使えばCSVの読み取り・保存は自動化できますが、
「動くコード」だけを書くと、実務では必ず後で詰まります。
この記事では、
- CSVをどう読み取るべきか
- どの方法を選ぶべきか
- 保存時に何を固定すべきか
を 設計視点 で整理しながら、
実務で壊れないCSV処理の書き方を解説します。
目次
✅ CSV処理で最初に理解すべき前提
CSVは単なる「テキストファイル」です。
Excel専用の形式ではありません。
この前提を理解せずに扱うと、
- Excelの都合で自動変換される
- 環境によって挙動が変わる
- 他システムと不整合が起きる
といった問題が起こります。
特に実務では、
- CSVは 受信データ であることが多い
- 中身の仕様をこちらが完全にコントロールできない
という点が重要です。
そのためCSV処理では、
「Excelに任せる」のではなく
VBA側で読み取りルールを明示する設計 が必要になります。
✅ CSVを読み取る方法の選択肢と考え方
Excel VBAでCSVを扱う方法はいくつかありますが、
目的によって使い分けることが重要 です。
・主な方法
- Workbooks.Open
- QueryTables(外部データとして読み込み)
- TextStream(FileSystemObject)
それぞれにメリット・デメリットがあります。
| 方法 | 特徴 | 向いているケース |
|---|---|---|
| Workbooks.Open | 手軽・簡単 | 一時的な確認 |
| QueryTables | 列型制御が可能 | 実務データ処理 |
| TextStream | 完全制御 | 高度な加工 |
この記事では、
実務で最も安定する QueryTables を中心 に解説します。
✅ QueryTablesでCSVを安全に読み取る基本設計
QueryTablesは、
「CSVを外部データとして取り込む」仕組みです。
最大のメリットは、
- 区切り文字を明示できる
- 列のデータ型を指定できる
- 自動変換を抑制できる
という点にあります。
・基本構文(最小構成)
Option Explicit
Public Sub ImportCsv_Basic()
Dim csvPath As String
csvPath = "C:\Temp\data.csv"
With ActiveSheet.QueryTables.Add( _
Connection:="TEXT;" & csvPath, _
Destination:=Range("A1"))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.Refresh BackgroundQuery:=False
.Delete
End With
End Sub
なぜこの書き方か
TEXT;を明示してCSVとして扱う- 背景更新をオフにして処理を安定させる
- 読み込み後に QueryTable を削除して後処理を軽くする
「読み取ったら役目終了」
という設計が、実務では扱いやすくなります。
QueryTablesは、
CSVを安全に読み取るための有効な手段ですが、
実務では
「なぜこの設定が必要なのか」
「他の外部データ取得と何が違うのか」
を理解しておくことが重要です。
QueryTables.Addの基本構造や、
外部データ取得全体の考え方については、
次の記事で詳しく解説しています。
👉 【VBA】外部データを自動取得する方法|QueryTables.Add入門
✅ 列のデータ型を指定して事故を防ぐ
CSVトラブルの多くは、
Excelによる 自動変換 が原因です。
- IDが数値に変換される
- 先頭ゼロが消える
- 日付が勝手に変換される
これを防ぐには、
列ごとに型を指定する設計 が必要です。
・列型を指定する例
.TextFileColumnDataTypes = Array( _
xlTextFormat, _
xlTextFormat, _
xlGeneralFormat _
)
設計上の考え方
- ID・コード類 → 常に文字列
- 数値計算しない列 → 文字列
- 集計対象だけ数値
「全部General」は一番危険です。
✅ 文字コードを意識した読み取り設計
CSVは環境によって文字コードが異なります。
- Shift-JIS
- UTF-8(BOMあり/なし)
QueryTablesでは、
TextFilePlatform を指定できます。
.TextFilePlatform = 65001 ' UTF-8
文字化けが起きる場合は、
- CSVの生成元
- 文字コード
を必ず確認し、
コードで明示する のが実務的です。
QueryTablesで文字コードを指定しても、
CSVの生成元やExcelの既定設定によっては、
文字化けが完全に防げないケースがあります。
こうした場合は、
VBAの設定だけでなく
Excel側の既定文字コードの扱い も理解しておくと、
トラブルを未然に防ぎやすくなります。
Excelの既定文字コードをUTF-8に対応させる考え方や設定方法は、
次の記事で詳しく解説しています。
👉 【Excel】既定の文字コードを変更する方法(上級者向け)|UTF-8対応でCSV文字化けを防ぐ
✅ CSVを加工後に保存する考え方
CSVを読み取ったあとは、
- 加工する
- 別名で保存する
- Excel形式に変換する
といった処理が続くことが多くなります。
ここで重要なのは、
「CSVとして保存するのか」
「Excelファイルとして保存するのか」
を 明確に分けること です。
✅ CSVとして保存する場合の注意点
CSV保存は SaveAs を使いますが、
Excel形式とは設計がまったく違います。
ActiveWorkbook.SaveAs _
Filename:="C:\Temp\output.csv", _
FileFormat:=xlCSV
実務で注意すべき点
- アクティブシートのみ保存される
- 書式・数式は失われる
- 文字コードはExcel依存
CSVは
「受け渡し用フォーマット」
として割り切るのが安全です。
✅ Excel形式で保存する方が安全なケース
実務では、
- 後工程でExcel加工する
- 人が開いて確認する
- 数式や書式を保持したい
こうした場合、
CSVに戻さず xlsx / xlsm で保存 した方が安定します。
ActiveWorkbook.SaveAs _
Filename:="C:\Temp\output.xlsx", _
FileFormat:=xlOpenXMLWorkbook
CSV → Excel変換は、
一度Excelに取り込んだ時点で完結させる
という設計がおすすめです。
✅ CSV処理を関数化して再利用する設計
CSV処理は繰り返し使われます。
そのため、
- パス
- 列型
- 保存形式
を引数で受け取る形にすると、
保守性が一気に上がります。
Public Sub ImportCsv(ByVal csvPath As String, ByVal targetCell As Range)
With targetCell.Worksheet.QueryTables.Add( _
Connection:="TEXT;" & csvPath, _
Destination:=targetCell)
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFileColumnDataTypes = Array(xlTextFormat)
.Refresh BackgroundQuery:=False
.Delete
End With
End Sub
✅ 実務でよくある失敗パターン
- Workbooks.Open だけで済ませる
- 列型を指定しない
- CSV保存を多用する
- 文字コードを考えない
これらは
最初は動くが、後で必ず問題になる
典型例です。
CSVは
「Excelが得意な形式」ではない
という前提を忘れないことが重要です。
✅ 応用:CSV処理は自動化判断の分岐点
CSV処理が増えてくると、
- VBAで続けるべきか
- RPAや他ツールに任せるべきか
という判断が必要になります。
CSVは
自動化の入口であり、分岐点
になりやすい処理です。
CSV処理を自動化できるようになると、
次に考えるべきなのは
「この業務はどこまでExcelで続けるべきか」
「これ以上の自動化が本当に必要か」
という判断です。
自動化を進めることで逆に負担が増えるケースや、
あえて手作業を残した方がよい場面については、
次の記事で整理しています。
👉 Excel業務改善をやめるべきタイミングと続けるべきケース
✅ まとめ:CSV処理は「操作」ではなく「設計」
- CSVはテキストデータである
- Excelに任せず、VBAでルールを明示する
- QueryTablesは実務で最も安定する
- 列型・文字コードは必ず指定する
- CSV保存は用途を限定する
CSVを正しく扱えるようになると、
Excel業務の自動化レベルは一段上がります。
「とりあえず開く」から
「壊れない形で取り込む」 へ。
ぜひ、いま使っているCSV処理を
一度見直してみてください。