CSVファイルをExcel VBAで解析して読み込みたい(インポートしたい)!でも簡単にできない!どうしたらいいの!?
ググってみるとSplit関数で読み込む方法が紹介されているが、この方法ではうまくいかないことがある!なんて方は是非参考にされてください。
今回いろいろと調べてみたものの、意外とそのまま使える情報が見つからなかったので、Excel VBAでCSVファイルを読み込むときに使える関数を作ってみました。
クリックできる目次
VBAでCSVファイルを読み込む前提条件
CSVファイルの区切り文字は「,」で文字列の引用符は「”」とします。
VBAでCSVファイルを読み込む方法
Split関数でうまくいく例
例えば、CSVファイルが以下のような内容だった場合は、Excel VBAで以下のように記述すれば、Split関数でCSVファイルの行データの各要素を一次元配列に読み込むことができます。
“あ”,”い”,”う”
Sub Sample() Dim Vartmp As Variant Vartmp = Split("あ,い,う", ",") MsgBox Vartmp(0) ' "あ"が表示される MsgBox Vartmp(1) ' "い"が表示される MsgBox Vartmp(2) ' "う"が表示される End Sub
Split関数でうまくいかない例
次のような場合は、Split関数でCSVファイルの行データの各要素を一次元配列に読み込むことができません。
“あ”,”い”,”ABC,123″
この場合、「,」で区切ると、以下のようになってしまうのです。
Vartmp(0) = あ
Vartmp(1) = い
Vartmp(2) = ABC
Vartmp(3) = 123
Vartmp(1) = い
Vartmp(2) = ABC
Vartmp(3) = 123
CSVファイルの行データを1次元配列に読み込む関数
'----------------------------------------------------------------------------------- ' IN : CSVファイルの行データを格納した文字列 ' OUT : 文字列を要素毎に分解したデータを格納した一次元配列 '----------------------------------------------------------------------------------- Private Function SplitCsvColInfo(ByRef strCsvComInfo As String) As String() Dim strTmpCell(256) As String Dim strRec As String Dim strSplit() As String Dim j As Long, k As Long Dim lngQuate As Long Dim strCell As String j = 0 lngQuate = 0 strCell = "" For k = 1 To Len(strCsvComInfo) Select Case Mid(strCsvComInfo, k, 1) Case "," '「"」が偶数なら区切り、奇数ならただの文字 If lngQuate Mod 2 = 0 Then Call PutCell(j, strCell, lngQuate, strTmpCell) Else strCell = strCell & Mid(strCsvComInfo, k, 1) End If Case """" '「"」のカウントをとる lngQuate = lngQuate + 1 strCell = strCell & Mid(strCsvComInfo, k, 1) Case Else strCell = strCell & Mid(strCsvComInfo, k, 1) End Select Next '最終列の処理 Call PutCell(j, strCell, lngQuate, strTmpCell) ' 戻り値セット SplitCsvColInfo = strTmpCell End Function Sub PutCell(ByRef j As Long, ByRef strCell As String, ByRef lngQuate As Long, ByRef strTmpCell() As String) '前後の「"」を削除 strCell = Replace(strCell, """", "") strTmpCell(j) = strCell strCell = "" lngQuate = 0 j = j + 1 End Sub
先ほどSplit関数でうまくいかない例がこの関数を使うとどうなるか説明します。
“あ”,”い”,”ABC,123″
この場合、strTmpCell()の中身は以下のようになります。
strTmpCell(0) = あ
strTmpCell(1) = い
strTmpCell(2) = ABC,123
strTmpCell(1) = い
strTmpCell(2) = ABC,123
まとめ
今回はExcel VBAで、CSVファイルの行データを1次元配列に読み込む方法をご紹介しました。
ググっても意外と求める情報が出てきませんでしたので、お困りの方は是非試してみてくださいね。
この記事が皆様のお役に立ちましたら幸いです!