▶ Windows 11情報をお求めの方はこちらをクリック

Excel VBAでCSVファイルの行データをSplit以外で一次元配列に読み込む方法

1 min

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

 

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

 

まとめ

今回はExcel VBAで、CSVファイルの行データを1次元配列に読み込む方法をご紹介しました。

ググっても意外と求める情報が出てきませんでしたので、お困りの方は是非試してみてくださいね。

この記事が皆様のお役に立ちましたら幸いです!

SEパパ

SEパパ

外資系IT企業SE職で2児の父ちゃん!職業柄かリサーチ&問題解決が好き。

幅広いジャンルで「お悩み解決」記事を執筆中。月間最高24万PV。雑誌掲載。

読者様に役立つ情報提供を心がけています。

カテゴリー:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA