Excel VBAでCSVファイルを読み込む方法をお探しですね。

広告

ExcelでCSVの日本語が文字化け!VBAで確実に読み込む方法を解説

CSVファイルをExcelで開いたら、日本語が「蟆城」「縺薙」みたいな謎の文字になってしまった経験、ありませんか?特に業務システムやWebサービスからダウンロードしたCSVでよく起こるトラブルです。

実はこれ、ファイルの文字コードが「UTF-8」なのに、Excelが別の読み方で開いてしまうのが原因なんです。

この記事では、Excel VBAを使ってCSVファイルを文字化けさせずに読み込む方法を、初心者の方にも分かりやすく解説します。

ただ開くだけじゃなく、項目の中にカンマや改行が含まれているような複雑なCSVにも対応できる、実用的なコードもご紹介しますね。

1. なぜCSVが文字化けするの?原因を知っておこう

CSVファイルが文字化けする一番の原因は、**文字コードの食い違い**です。

文字コードっていうのは、コンピューターが文字を扱うときのルールみたいなもの。

「UTF-8」「Shift-JIS」「UTF-16」など、いくつか種類があります。

最近のWebサービスやクラウドシステムは「UTF-8」で作られることが多いんですが、ExcelでCSVファイルをダブルクリックして開くと、環境によっては「Shift-JIS」として読み込もうとしちゃうんです。

そうすると、日本語の部分がぐちゃぐちゃになって表示されてしまいます。

ここで注意したいのが、**同じ「.csv」という拡張子でも、中身の文字コードはバラバラ**ということ。

システムAはUTF-8で出力するけど、システムBはShift-JISで出力する、なんてことは普通にあります。

さらに、UTF-8には「BOM付き」と「BOMなし」の2種類があります。

BOMっていうのは、ファイルの先頭に付いている目印みたいなもので、Excelが文字コードを判断するヒントになることもあります。

ただ、逆にBOMが原因で他のシステムに取り込めなくなることもあるので、ちょっと厄介なんですよね。

あと、文字コード以外にも注意点があります。

たとえば住所や商品名の中にカンマが入っている場合、CSVではその項目全体をダブルクォーテーション(“)で囲むルールになっています。

また、備考欄に改行が入っているCSVもよくあります。

こういうデータを単純に「カンマで区切る」「改行で区切る」だけの処理で読み込むと、データがバラバラになっちゃうんです。

実務でちゃんと使えるようにするには、UTF-8を正しく読むだけじゃなく、CSVのルールに沿った処理が必要になります。

2. Excel標準機能とVBA、どっちを使えばいい?

UTF-8のCSVを文字化けさせずに開くだけなら、実はExcelの標準機能でもできます。

「データ」タブから「テキストまたはCSVから」を選んで、文字コードを「65001: Unicode (UTF-8)」に設定すれば、ちゃんと日本語が表示されます。

この方法は画面を見ながら確認できるので、たまにしか使わないファイルを開くときには便利です。

区切り文字を「カンマ」にすれば、たいていのCSVは表形式でキレイに表示されます。

でも、**毎日同じCSVを処理する**、**複数のファイルをまとめて取り込む**、**取り込んだ後に集計まで自動化したい**といった場合は、VBAを使ったほうが断然ラクです。

VBAでCSVを読み込む方法はいくつかあって、用途に応じて使い分けるのがコツです。

**用途別の選び方はこんな感じ:**

– **たまに確認するだけ** → Excelの「テキストまたはCSVから」でUTF-8を指定
– **定期的に同じCSVを読み込む** → VBAのQueryTablesやOpenTextを使う
– **項目内のカンマや改行にもちゃんと対応したい** → ADODB.StreamでUTF-8として読んで、自前でCSVを解析する

比較的シンプルなCSVなら、QueryTablesを使うとサクッと取り込めます。

こんな感じのコードです:

“`vb
Sub ImportCsvByQueryTable()
Dim ws As Worksheet
Dim filePath As String

Set ws = ThisWorkbook.Worksheets(1)
filePath = “C:\work\sample.csv”

ws.Cells.Clear

With ws.QueryTables.Add(Connection:=”TEXT;” & filePath, Destination:=ws.Range(“A1”))
.TextFilePlatform = 65001 ‘←ここがポイント!UTF-8を指定
.TextFileCommaDelimiter = True
.TextFileParseType = xlDelimited
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
.Delete
End With
End Sub
“`

このコードは短くて分かりやすいんですが、複雑なCSVだと列の分割位置がずれたり、先頭のゼロが消えちゃったりすることがあります。

顧客番号や郵便番号みたいに「文字列として扱いたい」列がある場合は、取り込んだ後にちゃんと確認しましょう。

3. 文字化けしない!実用的なVBAコードを紹介

もっと確実にUTF-8のCSVを読み込むなら、**ADODB.Stream**を使う方法がおすすめです。

これを使うと、ファイル全体をUTF-8の文字列としてそのまま読み込めます。

次のコードは、UTF-8のCSVを読み込んで、ダブルクォーテーションで囲まれた項目内のカンマや改行にもちゃんと対応して、ワークシートに出力する例です。

実務でよくある「備考欄に改行が入ってる」「商品名にカンマが入ってる」みたいなCSVでも、単純なSplitより安全に取り込めますよ。

“`vb
Option Explicit

Sub ImportCsvUtf8()
Dim filePath As String
Dim text As String
Dim data As Variant
Dim ws As Worksheet

filePath = “C:\work\sample.csv”
Set ws = ThisWorkbook.Worksheets(1)

‘①UTF-8でファイル全体を読み込む
text = ReadTextUtf8(filePath)

‘②CSVのルールに沿って解析
data = ParseCsvToArray(text, “,”)

ws.Cells.Clear
ws.Cells.NumberFormat = “@” ‘文字列形式で出力

If IsArray(data) Then
ws.Range(“A1”).Resize(UBound(data, 1), UBound(data, 2)).Value = data
End If
End Sub

‘UTF-8でテキストファイルを読み込む関数
Private Function ReadTextUtf8(ByVal filePath As String) As String
Dim st As Object

Set st = CreateObject(“ADODB.Stream”)

With st
.Type = 2 ‘テキストモード
.Charset = “UTF-8” ‘UTF-8を指定
.Open
.LoadFromFile filePath
ReadTextUtf8 = .ReadText(-1) ‘全部読み込む
.Close
End With
End Function

‘CSVを配列に変換する関数(カンマ・改行・ダブルクォーテーションに対応)
Private Function ParseCsvToArray(ByVal text As String, ByVal delimiter As String) As Variant
Dim rows As Collection
Dim fields As Collection
Dim field As String
Dim inQuotes As Boolean ‘ダブルクォーテーションの中かどうか
Dim i As Long
Dim ch As String
Dim nextCh As String

Set rows = New Collection
Set fields = New Collection

‘1文字ずつチェックしていく
For i = 1 To Len(text)
ch = Mid$(text, i, 1)

If inQuotes Then
‘ダブルクォーテーションの中の処理
If ch = “””” Then
If i < Len(text) Then nextCh = Mid$(text, i + 1, 1) Else nextCh = "" End If '""は"1つとして扱う If nextCh = """" Then field = field & """" i = i + 1 Else inQuotes = False 'ダブルクォーテーション終了 End If Else field = field & ch End If Else 'ダブルクォーテーションの外の処理 Select Case ch Case """" inQuotes = True 'ダブルクォーテーション開始 Case delimiter 'カンマで区切る fields.Add field field = "" Case vbCr, vbLf '改行で行を確定 fields.Add field rows.Add CollectionToArray(fields) field = "" Set fields = New Collection 'CRLFの場合はLFをスキップ If ch = vbCr And i < Len(text) Then If Mid$(text, i + 1, 1) = vbLf Then i = i + 1 End If Case Else field = field & ch End Select End If Next i '最後の項目を追加 If field <> “” Or fields.Count > 0 Then
fields.Add field
rows.Add CollectionToArray(fields)
End If

ParseCsvToArray = RowsTo2DArray(rows)
End Function

‘Collectionを1次元配列に変換
Private Function CollectionToArray(ByVal fields As Collection) As Variant
Dim arr() As Variant
Dim i As Long

ReDim arr(1 To fields.Count)

For i = 1 To fields.Count
arr(i) = fields(i)
Next i

CollectionToArray = arr
End Function

‘行のCollectionを2次元配列に変換
Private Function RowsTo2DArray(ByVal rows As Collection) As Variant
Dim r As Long
Dim c As Long
Dim maxCols As Long
Dim rowArr As Variant
Dim result() As Variant

If rows.Count = 0 Then Exit Function

‘最大列数を取得
For r = 1 To rows.Count
rowArr = rows(r)
If UBound(rowArr) > maxCols Then maxCols = UBound(rowArr)
Next r

ReDim result(1 To rows.Count, 1 To maxCols)

‘2次元配列に格納
For r = 1 To rows.Count
rowArr = rows(r)
For c = 1 To UBound(rowArr)
result(r, c) = rowArr(c)
Next c
Next r

RowsTo2DArray = result
End Function
“`

このコードのポイントは、**ファイルを読む部分とCSVを分解する部分を分けている**ことです。

まず`ReadTextUtf8`関数でCSV全体をUTF-8として読み込んで、文字化けを防ぎます。

その後、`ParseCsvToArray`関数で1文字ずつチェックしながら、カンマ、改行、ダブルクォーテーションを判定していきます。

ちょっと長いコードに見えるかもしれませんが、CSVの構造を無視してSplitするよりも、データが崩れにくい書き方になっています。

また、出力前に`ws.Cells.NumberFormat = “@”`としているのは、**Excelの自動変換を防ぐため**です。

CSV内の「00123」というコードが数値として扱われると「123」になっちゃいますし、日付っぽい文字列が勝手に日付型に変換されることもあります。

取り込んだデータをそのまま保ちたい場合は、文字列形式で出力したほうが安全です。

もし後で数値計算したい列があれば、取り込んだ後に必要な列だけ数値に変換すればOKです。

4. 取り込んだ後もチェック!失敗しないための注意点

VBAでCSVを取り込めたからといって、それで終わりじゃありません。

実務では「文字化けしなかったから完璧!」とはいかないんです。

**取り込み後に確認したいポイント:**

– 日本語がちゃんと表示されているか
– すべての行で列数が合っているか
– 商品コードや郵便番号の先頭ゼロが消えてないか
– 備考欄の改行が1レコードとして扱われているか
– 他のシステムに渡す場合、文字コードやBOMが相手の仕様に合っているか

CSVの行数がめちゃくちゃ多い場合は、処理速度やExcelの行数制限にも注意が必要です。

Excelのワークシートには100万行ちょっとの上限があるので、それを超えるCSVはそのまま1シートに入りきりません。

また、1文字ずつチェックするVBAコードは柔軟性が高い反面、巨大なファイルだと時間がかかることもあります。

大量データを扱うなら、Power QueryやAccess、データベース、Pythonなど別の手段も検討してみてください。

エラー対策としては、ファイルが存在するかチェックしたり、読み込み中に問題が起きたらメッセージを表示したりする処理を追加しておくと安心です。

たとえば、こんなケースが考えられます:

– 指定したCSVファイルが存在しない
– 他のアプリでファイルが開かれていてロックされている
– 想定外の文字コードだった
– ダブルクォーテーションの数がおかしい

業務用のマクロとして配布するなら、ただエラーで止まるんじゃなくて、「どのファイルで、どの処理に失敗したか」が分かるようにしておくと、後々のメンテナンスがラクになりますよ。

まとめ

Excel VBAでCSVファイルを読み込む方法は、CSVの複雑さによって使い分けるのが基本です。

シンプルなUTF-8 CSVならQueryTablesで十分ですが、文字化け対策に加えて、ダブルクォーテーション内のカンマや改行まで正確に扱いたいなら、ADODB.StreamでUTF-8として読み込んで、CSVのルールに沿って解析する方法がおすすめです。

取り込んだ後のデータ型や、保存するときの文字コードにも気を配れば、Excelを使ったCSV処理をもっと安定して自動化できますよ。

この記事が、日々のCSV処理の手助けになれば嬉しいです!

広告