コピペでOK!VBAでCSVファイルの行データを一次元配列に読み込む方法

CSVファイルをVBAで解析して読み込みたい!でも簡単にできない!どうしたらいいの!?

ググってみてSplit関数で読み込む方法が紹介されていたけど、うまくいかないことがある!なんて方は是非参考にされてください。

今回いろいろと調べてみたものの、意外とそのまま使える情報が見つからなかったので、関数を作ってみました。

Sponsored Link

前提条件

CSVファイルの区切り文字は「,」で文字列の引用符は「”」とします。

Split関数でうまくいく例

例えば、CSVファイルが以下のような内容だった場合は、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

まとめ

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

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

Sponsored Link

シェアする

  • このエントリーをはてなブックマークに追加

フォローする