PR

【Excel VBA】CSVファイルをエクセルに取り込む方法 ※文字コードSJIS・UTF-8対応

その他

カンマ区切りのテキストファイル、CSV形式のファイルをエクセルファイルのシートに取り込む方法について紹介します。文字コードはShiftJis(SJIS)形式でもUTF-8形式でもどちらも取込み可能です。

テキストデータをエクセルへ読み込む方法は色々なパターンがあり、書き方もいろいろあります。
いくつかの方法を書いていますので↓の見出しからクリックしてご覧ください。

スポンサーリンク

取込み用CSVファイルのデータについて

サンプルで用意した取り込み用のCSVファイルはこのようなデータになっています。
(CSVファイルをExcelで開いた状態です。)

商品、分類、販売数の列があり、データが9行あります。

ExcelVBA-取込み用CSVファイルのデータイメージ

今回は異なる文字コードでSJIS形式のファイルと、UTF-8形式のファイルの2つを用意しておきます。

▽1個目のファイル(メモ帳アプリで開いた状態)
「ANSI」でShift-JIS形式であることを表しています。改行コードは「CRLF」形式です。

ExcelVBA-取込み用CSVファイルをメモ帳で開いた状態-CRLF

▽2個目のファイル(メモ帳アプリで開いた状態)
 こちらは文字コードがUTF-8になっています。

ExcelVBA-取込み用CSVファイルをメモ帳で開いた状態-UTF-8
スポンサーリンク

VBAコードについて

まずCSVファイルのパスを変数に格納します。
filePath = “C:\Users\~~\data_UTF8.csv”
※黄色いファイルパスの部分はご自身の環境に書き換えてください。

文字コードは「TextFilePlatform」の部分で指定します。
.TextFilePlatform = 65001
S-JIS形式ファイルの場合は値を「932」に指定します。
・UTF-8形式の場合は「65001」と指定します。


▽VBAコードはこちら

※シート名は指定せず、1つ目のシートに出力するようにしています。(適宜変更ください。)

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」があります。
ここに取り込んだデータを表示させたいと思います。

ExcelVBA-CSVファイルの取り込み-取込み前のシートの状態

▽マクロ実行後
CSVファイルの内容がシートに読み込まれたことがわかります。

ExcelVBA-CSVファイルの取り込み-取込み後のシートの状態

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
スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。

タイトルとURLをコピーしました