読者です 読者をやめる 読者になる 読者になる

アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

CSVを読み込み二次元配列に格納するプロシージャ

CSVファイルを読み込み、その内容を二次元配列に格納して返すプロシージャ。


<2016-09-06 追記>
この記事のコードは「レコード中にカンマや改行が含まれていない、Shift-JIS固定」という前提で作られています。
以下に改良版を置きましたので、必要に応じてこちらもご参照ください。
honey8823.hateblo.jp
</追記>

変数にファイルの内容を全部突っ込んでから処理するので、
一行ごとに読み込むよりは処理速度が上がるはず。(詳細は未検証)

尚、一行ごとに読み込みたい場合のコードは以下のサイトなどを参考に。

参考:CSVファイルの読み込み@Excel マクロ・VBA - Excelマクロ・VBAのお勉強
http://www.cocoaliz.com/excelVBA/index.php/30/

'*
'* CSVを読み込み二次元配列に格納
'*
'* in  sCsvFile  CSVファイルまでのフルパス
'* out CsvRead() CSVの中身(二次元配列)
'*
Public Function CsvRead(ByVal sCsvFile As String) As String()

    Dim lColNum As Long
    Dim lDatNum As Long
    
    Dim sTmp As String
    Dim sLine() As String
    Dim sDat() As String
    Dim sRet() As String
    
    Dim i As Long
    Dim j As Long
    
    dim sDel as String
    
    '区切り文字
    sDel = ","

    '一度CSVの中身をすべて変数に移す
    sTmp = CreateObject("Scripting.FileSystemObject").OpenTextFile(sCsvFile).ReadAll

    '改行コードを統一
    sTmp = Replace(sTmp, vbCrLf, vbLf)
    sTmp = Replace(sTmp, vbCr, vbLf)

    '一行ごとに配列に移す
    sLine = Split(sTmp, vbLf)
    
    'カラム数を求める
    lColNum = StrCount(sLine(0), sDel) + 1
    
    'データ数を求める(最後の行が空行の場合はカウントしない)
    If sLine(UBound(sLine)) = "" Then
        lDatNum = UBound(sLine)
    Else
        lDatNum = UBound(sLine) + 1
    End If
    
    '戻り値の枠をつくる
    ReDim sRet(1 To lDatNum, 1 To lColNum)
    
    '一行をカンマ区切りにして
    For i = 0 To lDatNum - 1
        '一行をカンマ区切りにして配列に移す
        sDat = Split(sLine(i), ",")
        For j = 0 To lColNum - 1
            '戻り値枠に放り込む
            sRet(i + 1, j + 1) = sDat(j)
        Next
    Next
    
    CsvRead = sRet

End Function

(初出:旧ブログ 2011-12-07 16:59)