カンマ区切りのテキストファイル、CSV形式のファイルをVBAを使用してエクセルファイルのシートに取り込む方法について紹介します。文字コードはShiftJis(SJIS)形式でもUTF-8形式でもどちらも取込み可能です。
テキストデータをエクセルへ読み込む方法は色々なパターンがあり、書き方もいろいろあります。
いくつかの方法を書いていますので↓の見出しからクリックしてご覧ください。
取込み用CSVファイルのデータについて
サンプルで用意した取り込み用のCSVファイルはこのようなデータになっています。
(CSVファイルをExcelで開いた状態です。)
商品、分類、販売数の列があり、データが9行あります。
![](https://learningpgm.com/wp-content/uploads/2024/07/CSV取り込み_CSVデータ.jpg)
今回は異なる文字コードでSJIS形式のファイルと、UTF-8形式のファイルの2つを用意しておきます。
▽1個目のファイル(メモ帳アプリで開いた状態)
「ANSI」でShift-JIS形式であることを表しています。改行コードは「CRLF」形式です。
![](https://learningpgm.com/wp-content/uploads/2024/07/CSV取り込み_CSVデータ(メモで開く)_SJIS.jpg)
▽2個目のファイル(メモ帳アプリで開いた状態)
こちらは文字コードがUTF-8になっています。
![](https://learningpgm.com/wp-content/uploads/2024/07/CSV取り込み_CSVデータ(メモで開く)_UTF-8.jpg)
VBAコードについて
まずCSVファイルのパスを変数に格納します。
filePath = “C:\Users\~~\data_UTF8.csv”
※黄色いファイルパスの部分はご自身の環境に書き換えてください。
文字コードは「TextFilePlatform」の部分で指定します。
.TextFilePlatform = 65001
・S-JIS形式ファイルの場合は値を「932」に指定します。
・UTF-8形式の場合は「65001」と指定します。
※シート名は指定せず、1つ目のシートに出力するようにしています。(適宜変更ください。)
▽VBAコードはこちら
Sub Sample()
Dim filePath As String
filePath = "C:\Users\~~\data_UTF8.csv"
With Sheets(1).QueryTables.Add(Connection:="text;" & filePath, Destination:=Sheets(1).Range("A1"))
.TextFilePlatform = 65001
.AdjustColumnWidth = False
.TextFileCommaDelimiter = True
.Refresh BackgroundQuery:=False
.Delete
End With
End Sub
マクロ実行前→実行後のイメージ
▽マクロ実行前
何も書かれていないシート「Sheet1」があります。
ここに取り込んだデータを表示させたいと思います。
![](https://learningpgm.com/wp-content/uploads/2024/07/CSV取り込み_取込み前.jpg)
▽マクロ実行後
CSVファイルの内容がシートに読み込まれたことがわかります。
![](https://learningpgm.com/wp-content/uploads/2024/07/CSV取り込み_取込み後-1.jpg)
CSVファイルを取り込む方法はいくつもあるのですが、文字コードによって使用できない場合があったり、改行コードの種類によっても書き方が変わってくることがあるので意外とうまくいかなくて時間がかかってしまうことがあります。
上記の方法は文字コードの部分を数字で指定できて変更可能なので使いやすく、取り込みにかかる時間も短いので便利です。
ただ、改行コードがLFの場合は上記の方法ではうまくいかなかったので、その場合は↓を参考にしてください。
補足:他の取り込み方法(S-JIS形式)
CSVファイルのインポート方法は色々あり、オーソドックスな書き方だと↓のような書き方でも取り込めます。だたこちらの方法では文字コードがUTF-8形式の場合は使用できないので、この次に紹介している方法を使用してください。
Sub Sample_SJIS()
Dim obj1, file1 As Object
Dim buf, filePath As String
Dim tmp1, tmp2 As Variant
Dim i, j As Long
filePath = "C:\~~\data_S-JIS_CRLF.csv"
Set obj1 = CreateObject("Scripting.FileSystemObject")
Set file1 = obj1.GetFile(filePath).OpenAsTextStream
buf = file1.ReadAll
file1.Close
tmp1 = Split(buf, vbCrLf)
For i = 0 To UBound(tmp1)
tmp2 = Split(tmp1(i), ",")
j = j + 1
Range(Cells(j, 1), Cells(j, 3)) = tmp2
Next i
End Sub
改行コードがLFの場合には「vbCrLf」の部分を「vbLf」に変えて使用ください。
補足:他の取り込み方法(UTF-8形式)
文字コードがUTF-8の場合はADOという仕組みを使用します。
※ADOとは「ActiveX Database Object」の略でADODBのStreamオブジェクトを使用するとテキストファイルの読み書きが可能になります。
※文字コードがUTF-8以外の場合は「UTF-8」の部分を書き換えて使用してください。
Withで囲った部分でADOを使用してCSVファイルを変数「buf」に読み込んでいます。
変数「buf」をカンマで区切ってシートに出力する部分は上で書いた例と同じ書き方をしています。
Sub Sample()
Dim buf As String
Dim filePath As String
Dim tmp1, tmp2 As Variant
filePath ="C:\~~\data_UTF8.csv"
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile filePath
buf = .ReadText
.Close
End With
tmp1 = Split(buf, vbCrLf)
For i = 0 To UBound(tmp1)
tmp2 = Split(tmp1(i), ",")
j = j + 1
Range(Cells(j, 1), Cells(j, 3)) = tmp2
Next i
End Sub
※コードのコピー利用について
・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。