記事ID: 072
タイトル: 【VBA】CSVファイルをExcelに正しく取り込む方法(コピペOK)
カテゴリ: ファイル操作
一次キーワード: VBA CSV 読み込み 取り込み
想定読者: CSVをExcelで開くと文字化け・先頭ゼロ消失で困っている事務・管理職
検索意図: VBAでCSVファイルを文字化けなし・先頭ゼロ保持のまま正しく取り込みたい
読者の悩み(1文): CSVをExcelで開くと電話番号の先頭0が消えたり住所が文字化けしたりして困る
読了後にできること(1文): VBAでCSVを文字化けなし・先頭ゼロ保持のまま正しくExcelに取り込める
前提条件:
- Excel版: Excel 2016以降 / Microsoft 365
- OS: Windows 10/11
- 保存形式: .xlsm(マクロ有効ブック)
- 貼り付け場所: 標準モジュール
- 実行方法: マクロ実行(F5)またはボタン割り当て
更新日: 2026-03-11
Contents
この記事でわかること
VBAでCSVファイルをExcelに正しく取り込む方法を、コピペで動くコード付きで解説します。
- 対象:CSVをExcelで開くと文字化けや先頭ゼロ消失で困っている人
- 所要時間:コピペ → 実行まで3分
完成イメージ
実行前(CSVファイルの中身):
社員番号,氏名,電話番号,住所
001,田中太郎,0120-123-456,東京都千代田区
002,鈴木花子,090-1234-5678,大阪府大阪市中央区
003,佐藤一郎,03-1234-5678,"横浜市中区,山下町1-2"
実行後(Excelシートに取り込まれた状態):
| A | B | C | D |
|---|---|---|---|
| 社員番号 | 氏名 | 電話番号 | 住所 |
| 001 | 田中太郎 | 0120-123-456 | 東京都千代田区 |
| 002 | 鈴木花子 | 090-1234-5678 | 大阪府大阪市中央区 |
| 003 | 佐藤一郎 | 03-1234-5678 | 横浜市中区,山下町1-2 |
先頭ゼロが「001」「0120」のまま保持され、文字化けもありません。
さらに実務版では、フォルダ内のCSVファイルをまとめて一括取り込みできます。
自分も基幹システムからCSVを出力してExcelで開いたら、電話番号の先頭0が消えて「120-123-456」になったり、住所が文字化けして読めなくなったりしたことがあります。正直あれは焦りました。
VBAでCSVを正しく取り込むようにしてからは、文字化けもゼロ消失もまったく起きなくなりました。毎日のCSV取り込み作業がストレスフリーです。
同じようにCSVの取り込みで困っている人が、この記事でサクッと解決できるようになればうれしいです。CSVの書き出し側についてはデータをCSVファイルに書き出す方法で解説しています。
方法1:Open文で読み込む(Shift_JIS・基本)
最もシンプルな方法です。Shift_JIS(日本語Windows標準)のCSVファイルを1行ずつ読み込んでシートに転記します。
Sub CSV取り込み_Open文()
Dim filePath As String
Dim buf As String
Dim fields() As String
Dim r As Long
Dim i As Long
Dim fn As Integer
' --- 取り込むCSVファイルのパスを指定 ---
filePath = "C:\Data\sample.csv"
' --- ファイルの存在チェック ---
If Dir(filePath) = "" Then
MsgBox "ファイルが見つかりません: " & filePath, vbExclamation
Exit Sub
End If
' --- 取り込み先のシートをクリア ---
Sheets("Sheet1").Cells.Clear
r = 1
' --- CSVファイルを開いて1行ずつ読み込み ---
fn = FreeFile
Open filePath For Input As #fn
Do Until EOF(fn)
Line Input #fn, buf
fields = Split(buf, ",")
For i = 0 To UBound(fields)
Sheets("Sheet1").Cells(r, i + 1).Value = fields(i)
Next i
r = r + 1
Loop
Close #fn
MsgBox "取り込み完了(" & (r - 1) & "行)", vbInformation
End Sub
ポイント:
FreeFileでファイル番号を自動取得。複数ファイルを扱うときも安全ですLine Inputで1行ずつ読み込み、Split(buf, ",")でカンマ区切りに分割します- この方法はShift_JIS専用です。UTF-8のCSVでは文字化けします(方法2で対応)
テキストファイルの読み込み全般についてはテキストファイル読み込みの方法も参考になります。
方法2:ADODB.Streamで読み込む(UTF-8対応)
最近のシステムではCSVがUTF-8で出力されることが増えています。UTF-8のCSVをOpen文で読むと文字化けするため、ADODB.Streamを使います。
自分もUTF-8のCSVをOpen文で読み込んで盛大に文字化けしたことがあります。ADODB.Streamを知ってからは文字化けとは無縁になりました。
Sub CSV取り込み_UTF8()
Dim filePath As String
Dim adoSt As Object
Dim allText As String
Dim lines() As String
Dim fields() As String
Dim r As Long
Dim i As Long
' --- 取り込むCSVファイルのパスを指定 ---
filePath = "C:\Data\sample_utf8.csv"
' --- ファイルの存在チェック ---
If Dir(filePath) = "" Then
MsgBox "ファイルが見つかりません: " & filePath, vbExclamation
Exit Sub
End If
' --- ADODB.StreamでUTF-8として読み込み ---
Set adoSt = CreateObject("ADODB.Stream")
adoSt.Charset = "UTF-8"
adoSt.Open
adoSt.LoadFromFile filePath
allText = adoSt.ReadText
adoSt.Close
Set adoSt = Nothing
' --- BOM(先頭のゴミ文字)を除去 ---
If Left(allText, 1) = Chr(65279) Then
allText = Mid(allText, 2)
End If
' --- 改行コードをLFに統一(CrLf/CR/LFすべてに対応) ---
allText = Replace(allText, vbCrLf, vbLf)
allText = Replace(allText, vbCr, vbLf)
' --- 取り込み先のシートをクリア ---
Sheets("Sheet1").Cells.Clear
' --- 行ごとに分割してシートに転記 ---
lines = Split(allText, vbLf)
r = 0
For i = 0 To UBound(lines)
If lines(i) <> "" Then
r = r + 1
fields = Split(lines(i), ",")
Dim c As Long
For c = 0 To UBound(fields)
Sheets("Sheet1").Cells(r, c + 1).Value = fields(c)
Next c
End If
Next i
MsgBox "取り込み完了(" & r & "行)", vbInformation
End Sub
ポイント:
CreateObject("ADODB.Stream")なので参照設定は不要です.Charset = "UTF-8"でUTF-8として読み込みます- BOM(バイトオーダーマーク)付きCSVの場合、先頭に不要な文字(Chr(65279))が付くことがあるので除去しています
- 改行コードをLFに統一してから分割するため、Windows(CrLf)でもMac/Linux(LF)のCSVでも正しく処理できます
方法3:QueryTablesで読み込む(大量データ・型指定)
数万行以上のCSVや、列ごとに型を指定したい場合はQueryTables.Addが便利です。
Sub CSV取り込み_QueryTables()
Dim filePath As String
Dim ws As Worksheet
' --- 取り込むCSVファイルのパスを指定 ---
filePath = "C:\Data\sample.csv"
' --- ファイルの存在チェック ---
If Dir(filePath) = "" Then
MsgBox "ファイルが見つかりません: " & filePath, vbExclamation
Exit Sub
End If
' --- 取り込み先のシートをクリア ---
Set ws = Sheets("Sheet1")
ws.Cells.Clear
' --- QueryTablesで取り込み ---
With ws.QueryTables.Add( _
Connection:="TEXT;" & filePath, _
Destination:=ws.Range("A1"))
.TextFileCommaDelimiter = True ' カンマ区切り
.TextFilePlatform = 932 ' 932=Shift_JIS, 65001=UTF-8
.TextFileParseType = xlDelimited ' 区切り文字方式
.TextFileTextQualifier = xlTextQualifierDoubleQuote ' ダブルクォーテーション対応
.AdjustColumnWidth = False ' 列幅の自動調整OFF
' 列ごとに型を指定(2=文字列, 1=標準)
' A列=社員番号(文字列), B列=氏名(標準), C列=電話番号(文字列), D列=住所(標準)
.TextFileColumnDataTypes = Array(2, 1, 2, 1)
.Refresh BackgroundQuery:=False ' 取り込み実行
.Delete ' 外部データ接続を削除(残すとブック保存時に警告が出る)
End With
MsgBox "取り込み完了", vbInformation
End Sub
ポイント:
TextFileColumnDataTypesで列ごとに型を指定できます。2(xlTextFormat)を指定した列は文字列として取り込まれるため、先頭ゼロも保持されますTextFilePlatformで文字コードを指定。932がShift_JIS、65001がUTF-8ですTextFileTextQualifierを設定すれば、カンマを含むフィールド(ダブルクォーテーションで囲まれたもの)も正しく処理されます.Deleteで接続情報を削除しないと、ブック保存時に「外部データ接続」の警告が出ますTextFileColumnDataTypesの配列要素数はCSVの列数と合わせてください。列数が不明な場合はこの行を省略すれば自動判定されます
3つの方法の使い分け:
– Shift_JISで数百行程度 → 方法1(Open文) がシンプル
– UTF-8のCSV → 方法2(ADODB.Stream) で文字化け対策
– 大量データ or カンマ含むデータ or 列ごとの型指定 → 方法3(QueryTables) が安全・高速
先頭ゼロが消える問題の対策
CSVの取り込みで最もよくあるトラブルが「先頭ゼロの消失」です。
| 元データ | Excelに取り込んだ結果 | 原因 |
|---|---|---|
| 001 | 1 | 数値として解釈された |
| 0120-123-456 | 120-123-456 | 先頭の0が除去された |
| 0001234 | 1234 | 数値として解釈された |
対策は、セルの表示形式を「文字列」にしてから値を入れることです。
Sub CSV取り込み_ゼロ保持()
Dim filePath As String
Dim buf As String
Dim fields() As String
Dim r As Long
Dim i As Long
Dim fn As Integer
filePath = "C:\Data\sample.csv"
If Dir(filePath) = "" Then
MsgBox "ファイルが見つかりません: " & filePath, vbExclamation
Exit Sub
End If
Sheets("Sheet1").Cells.Clear
' --- 先頭ゼロを保持したい列の表示形式を文字列に設定 ---
' 例:A列(社員番号)とC列(電話番号)を文字列に
Sheets("Sheet1").Columns("A").NumberFormat = "@"
Sheets("Sheet1").Columns("C").NumberFormat = "@"
r = 1
fn = FreeFile
Open filePath For Input As #fn
Do Until EOF(fn)
Line Input #fn, buf
fields = Split(buf, ",")
For i = 0 To UBound(fields)
Sheets("Sheet1").Cells(r, i + 1).Value = fields(i)
Next i
r = r + 1
Loop
Close #fn
MsgBox "取り込み完了(" & (r - 1) & "行)", vbInformation
End Sub
ポイント:
NumberFormat = "@"は、値を入れる前に設定してください。後から変えても、既に数値に変換されたデータは元に戻りません- すべての列を文字列にしたい場合は
Sheets("Sheet1").Cells.NumberFormat = "@"でまとめて設定できます - QueryTablesの場合は
TextFileColumnDataTypes = Array(2, 2, 2, 2)で全列を文字列にできます
取り込み先の最終行を正確に取得する方法を組み合わせれば、既存データの下に追記することもできます。
実務版:フォルダ内のCSVを一括取り込みする
※ 実行前にブックを上書き保存しておくと安心です。
毎朝基幹システムのCSVを自動取り込みするマクロを作ってからは、始業直後にデータが揃っている状態になりました。毎朝自動で揃っているのは本当にラクです。
Sub CSV一括取り込み_UTF8対応()
Dim folderPath As String
Dim fileName As String
Dim filePath As String
Dim adoSt As Object
Dim allText As String
Dim lines() As String
Dim fields() As String
Dim ws As Worksheet
Dim r As Long
Dim i As Long
Dim j As Long
Dim c As Long
Dim fileCount As Long
' --- CSVファイルが入っているフォルダを指定 ---
folderPath = "C:\Data\CSV\"
' --- フォルダの存在チェック ---
If Dir(folderPath, vbDirectory) = "" Then
MsgBox "フォルダが見つかりません: " & folderPath, vbExclamation
Exit Sub
End If
' --- 取り込み先のシートを準備 ---
Set ws = Sheets("Sheet1")
ws.Cells.Clear
ws.Cells.NumberFormat = "@" ' 全セルを文字列に(先頭ゼロ保持)
r = 1
fileCount = 0
' --- フォルダ内のCSVファイルを順に処理 ---
fileName = Dir(folderPath & "*.csv")
Do While fileName <> ""
filePath = folderPath & fileName
fileCount = fileCount + 1
' --- ADODB.StreamでUTF-8として読み込み ---
Set adoSt = CreateObject("ADODB.Stream")
adoSt.Charset = "UTF-8"
adoSt.Open
adoSt.LoadFromFile filePath
allText = adoSt.ReadText
adoSt.Close
Set adoSt = Nothing
' --- BOM除去 ---
If Left(allText, 1) = Chr(65279) Then
allText = Mid(allText, 2)
End If
' --- 改行コードをLFに統一 ---
allText = Replace(allText, vbCrLf, vbLf)
allText = Replace(allText, vbCr, vbLf)
' --- 行ごとに分割してシートに転記 ---
lines = Split(allText, vbLf)
For j = 0 To UBound(lines)
If lines(j) <> "" Then
' 2ファイル目以降はヘッダー行(1行目)をスキップ
If fileCount > 1 And j = 0 Then
' ヘッダー行なのでスキップ
Else
fields = Split(lines(j), ",")
For c = 0 To UBound(fields)
ws.Cells(r, c + 1).Value = fields(c)
Next c
r = r + 1
End If
End If
Next j
' --- 次のCSVファイルへ(Dir関数の状態を継続) ---
fileName = Dir()
Loop
If fileCount = 0 Then
MsgBox "CSVファイルが見つかりませんでした", vbExclamation
Else
MsgBox fileCount & "ファイル、" & (r - 1) & "行を取り込みました", vbInformation
End If
End Sub
ポイント:
Dir(folderPath & "*.csv")でフォルダ内のCSVファイルを列挙します。フォルダ内ファイル一覧を自動取得する方法も参考になります- 2ファイル目以降はヘッダー行(1行目)をスキップして、データだけを追記します
ws.Cells.NumberFormat = "@"で全セルを文字列にし、先頭ゼロを保持します- 改行コードをLFに統一してから分割するため、異なる環境で作成されたCSVでも正しく処理できます
- 複数Excelファイルを1つに統合する方法と組み合わせれば、さらに柔軟な統合処理が可能です
- ファイルが見つからない場合のエラー処理も参考にしてください
落とし穴
落とし穴1:UTF-8のCSVをOpen文で読むと文字化けする
Open文はShift_JIS(ANSI)しか対応していません。UTF-8のCSVをOpen文で読むと日本語が文字化けします。
対策: UTF-8のCSVにはADODB.Stream(Charset=”UTF-8″)またはQueryTables(TextFilePlatform=65001)を使ってください。
落とし穴2:NumberFormatを後から変えても先頭ゼロは戻らない
先にセルに値を入れてしまうと、「001」は「1」に変換されます。その後でNumberFormat = “@”に変えても、「1」のままです。
対策: NumberFormat = "@" は必ず値を入れる前に設定してください。
落とし穴3:Split(“,”)ではカンマを含むフィールドを正しく分割できない
CSVの仕様では、カンマを含むフィールドはダブルクォーテーション(")で囲みます。しかしSplit(“,”)はクォーテーション内のカンマも区切り文字として扱うため、データがずれます。
対策: カンマを含むデータがあるCSVにはQueryTablesを使ってください。TextFileTextQualifier = xlTextQualifierDoubleQuote でダブルクォーテーションを自動処理してくれます。
落とし穴4:QueryTablesの接続情報が残ってブック保存時に警告が出る
QueryTablesで取り込んだ後、.Deleteをしないと外部データ接続が残ります。ブックを保存するときに「このブックには外部データ接続があります」という警告が出ます。
対策: .Refresh BackgroundQuery:=False の後に .Delete を入れてください。
落とし穴5:改行コードがLFだけ(Unix形式)の場合、Split(vbCrLf)で分割できない
CSVファイルの改行コードは環境によって異なります(Windows: CrLf、Mac/Linux: LF)。LFだけのCSVをSplit(vbCrLf)で分割すると、全体が1行として扱われます。
対策: 先にCrLfとCRをLFに統一してからSplit(vbLf)で分割してください。本記事の方法2・実務版のコードではこの正規化処理を入れています。
FAQ
Q1: CSVの文字コードがShift_JISかUTF-8かわからない場合は?
メモ帳でCSVファイルを開いて「名前を付けて保存」を選ぶと、画面下部に文字コード(エンコード)が表示されます。「UTF-8」と表示されれば方法2(ADODB.Stream)、「ANSI」と表示されれば方法1(Open文)を使ってください。
Q2: タブ区切り(TSV)のファイルも同じ方法で読める?
はい。Split(buf, ",") を Split(buf, vbTab) に変えれば読めます。QueryTablesの場合は .TextFileCommaDelimiter = False にして .TextFileTabDelimiter = True に変更してください。
Q3: ヘッダー行(1行目)を飛ばして読み込むには?
Open文/ADODB.Streamの場合、ループの最初の1行を読み捨てればOKです。QueryTablesの場合は .TextFileStartRow = 2 を追加すれば2行目からの取り込みになります。
Q4: 取り込むときにダイアログでCSVファイルを選びたい場合は?
Application.GetOpenFilename を使えば、ファイル選択ダイアログが開きます。戻り値はVariant型で、キャンセル時にはFalseが返ります。
Dim filePath As Variant
filePath = Application.GetOpenFilename("CSVファイル,*.csv")
If filePath = False Then Exit Sub ' キャンセルされた場合
Q5: ADODB.Streamで「オブジェクトを作成できません」エラーが出る
社内PCのセキュリティポリシーでActiveXの使用が制限されている場合に発生します。IT部門に確認するか、代替手段としてQueryTables(TextFilePlatform=65001)を使ってください。
まとめ
VBAでCSVファイルをExcelに正しく取り込む方法を3つ紹介しました。
| 方法 | 文字コード | 速度 | カンマ対応 | 型指定 |
|---|---|---|---|---|
| Open文 | Shift_JIS | 中 | Split後に個別対応 | NumberFormatで個別対応 |
| ADODB.Stream | UTF-8 | 中 | Split後に個別対応 | NumberFormatで個別対応 |
| QueryTables | 両対応 | 高速 | 自動(ダブルクォーテーション処理) | 列単位で指定可能 |
- 先頭ゼロを保持するには
NumberFormat = "@"を値を入れる前に設定 - UTF-8のCSVには
ADODB.StreamまたはQueryTablesを使う - カンマを含むデータがあるCSVには
QueryTablesが安全
フォルダ内のCSVファイルを列挙する方法はフォルダ内ファイル一覧を自動取得する方法、CSVへの書き出しはデータをCSVファイルに書き出す方法も参考にしてください。
次にやりたくなること
- データをCSVファイルに書き出す方法 — 読み込みの逆。VBAでCSVを出力する方法
- 複数Excelファイルを1つに統合する方法 — 複数のCSV・Excelファイルをまとめて1つにする


コメント