エクセルVBAでダブルクォーテーションで囲まれているCSVファイルを取り込む


double dogs

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでCSVファイルを取り込む方法シリーズです。

前回はCSVファイルの改行コードがLFの場合にエクセルVBAで上手にデータを取り込む方法についてお伝えしました。

エクセルVBAでCSV取込み~改行がされないパターンの対処法
エクセルVBAでCSVファイルを取り込む方法シリーズ。今回は、CSVをワークシートに取り込んだときに改行されずに一行になってしまうパターンについてどう回避するかについてお伝えしたいと思います。

さて、CSV

本来、色々なソフトウェアでデータを簡単にやりとりをするためのフォーマットなのですが、けっこう色々なパターンが存在しちゃっているんですね…。

今回はまた別の例として、データがダブルクォーテーションで囲まれているパターンのCSVをエクセルVBAで取り込む方法についてお伝えしたいと思います。

では、行ってみましょう!

スポンサーリンク

一般的なCSVファイルを取り込むプログラムのおさらい

まずは一般的なCSVファイルを取り込むプログラムについて、おさらいをしておきたいと思います。

Sub getCSV()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)

Dim strPath As String
strPath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-csv\test\ラーメン店アンケート_dq.csv"

Dim i, j As Long
Dim strLine As String
Dim arrLine As Variant 'カンマでsplitして格納

Open strPath For Input As #1 'csvファイルをオープン

i = 1
Do Until EOF(1)

    Line Input #1, strLine
    arrLine = Split(strLine, ",") 'strLineをカンマで区切りarrLineに格納

    For j = 0 To UBound(arrLine)

        ws.Cells(i, j + 1).Value = arrLine(j)

    Next j
    i = i + 1
Loop

Close #1

End Sub

CSVのレコードを1行ずつ取り込んで、Splitでカンマで分割して配列に格納。
配列に格納した要素をワークシートのセルに書き込んでいく、というプログラムです。

詳しくはこちらの記事で紹介しています。

エクセルVBAでCSVデータをカンマで区切ってワークシートに取り込む方法
エクセルVBAでCSVを取り込む方法です。今回は、Splitという命令と配列を使ってCSVのレコードをカンマで区切ってワークシートに転記をしていく方法について解説をしていきます。

データがダブルクォーテーションで囲われているパターン

例えばこのようなCSVファイルが存在します。

ダブルクォーテーションつきのCSVファイル

データがダブルクォーテーションで囲まれていますね。

実はこのケースは結構出くわすパターンです。

例えばデータ要素にカンマや改行(LFやCR)が含まれているときは、そのままでは取り扱えなくなってしまいます。

そんなときのため、データ要素をダブルクォーテーションで囲うことで取り扱えるようにするわけですね。

しかしながら、このタイプのCSVファイルを上記のgetCSVで取り込むと

ダブルクォーテーションつきのCSVファイルを取り込んだ

当然こうなります。

これでは数値の集計はできませんね…。

では、対応するプログラムを作っていきましょう。

ダブルクォーテーションを含むCSVを取り込むプログラム

ダブルクォーテーションを削除しつつCSVデータを取り込むプログラムはこちらです。

'CSVファイルの取り込み 一行ずつ取得しカンマでスプリットする最も定番なパターン
Sub getCSV()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)

Dim strPath As String
strPath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-csv\test\ラーメン店アンケート_dq.csv"

Dim i, j As Long
Dim strLine As String
Dim arrLine As Variant 'カンマでsplitして格納

Open strPath For Input As #1 'csvファイルをオープン

i = 1
Do Until EOF(1)

    Line Input #1, strLine
    arrLine = Split(Replace(strLine, """", ""), ",") 'strLineをカンマで区切りarrLineに格納

    For j = 0 To UBound(arrLine)

        ws.Cells(i, j + 1).Value = arrLine(j)

    Next j
    i = i + 1
Loop

Close #1

End Sub

…どこを変えたかわかりますか?

なんと変更したのは一行だけです。

20行目ですね。

ダブルクォーテーションをReplaceで削除する

Replace(文字列,置換前文字列,置換後文字列)

とすることで、文字列内の任意の文字列を置換することができます。

今回は

Replace(strLine, """", "")

としています。

VBAの場合、ダブルクォーテーションはエスケープ文字で””””とダブルクォーテーション4つ分で表現します。これが置換前の文字列。

置換後の文字列は””のダブルクォーテーションが2つですが、これはNullつまり長さゼロの文字列ですね。したがってNullで置換するということは削除するというのと同じことです。

こちらで実行した結果はこうなります。

エクセルVBAでCSVファイルを取り込んだ

バッチリですね。

まとめ

以上、データがダブルクォーテーションで囲まれているCSVファイルをエクセルVBAで取り込む方法でした。

わかってみたら何てことないですね。

しかしながら、まだいくつか手ごわいパターンが残っています。

次はデータ内にカンマが使われてしまっているパターンです。

エクセルVBAでデータにカンマが含まれてしまっているCSVを取り込む
エクセルVBAで様々なタイプのCSVを取り込んでいきます。今回は、意外と多いパターンであるデータの中にカンマが含まれている場合のCSVをエクセルVBAで取り込む方法についてお伝えしていきます。

全てのCSVを取り込めるようにしたいと思いますので、ドシドシ紹介したいと思います。

連載目次:エクセルVBAで色々なCSVファイルを取り扱う

様々なソフトウェア間のデータ交換の際に一般的に多く活用されているCSVファイル。エクセルで取り込んで集計や加工することもたくさんあることと思います。このシリーズでは、CSVファイルをエクセルVBAで取り込むためのテクニックについてお伝えしています。
  1. CSVとは何か?そしてエクセルでCSVファイルを扱うときの注意点
  2. エクセルVBAでCSVを読み取る初心者向けの最も簡単なプログラム
  3. エクセルVBAでCSVデータをカンマで区切ってワークシートに取り込む方法
  4. エクセルVBAでCSV取込み~改行がされないパターンの対処法
  5. エクセルVBAでダブルクォーテーションで囲まれているCSVファイルを取り込む
  6. エクセルVBAでデータにカンマが含まれてしまっているCSVを取り込む
  7. 文字化けよさようなら!エクセルVBAでUTF-8のCSVを読み込む方法

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