【VBAリファレンス】VBAでCSVを高速・柔軟に操る!ジャグ配列を用いた実務直結型データ読み込み完全ガイド

スポンサーリンク

概要:なぜ今「ジャグ配列」によるCSV読み込みなのか

Excel VBAで外部のCSVデータを扱う際、多くの初心者が陥る罠が「セルへの直接転記」です。1行ずつ、あるいは1セルずつワークシートに値を書き込む処理は、データ件数が増えるにつれて指数関数的に実行速度が低下します。かといって、すべてのデータを固定長の2次元配列で受け取ろうとすると、CSV特有の「行によって列数が異なる(あるいは可変である)」という仕様に対応できず、エラーに悩まされることになります。

そこで登場するのが「ジャグ配列(Jagged Array)」です。ジャグ配列とは、配列の中にさらに配列を格納する「配列の配列」のことです。この構造を活用することで、CSVの各行を独立した配列としてメモリ上に保持し、行ごとに列数が異なっても柔軟に、かつメモリ効率よくデータを処理することが可能になります。本記事では、実務で即戦力となるジャグ配列を用いたCSV読み込み手法を、コードの最適化テクニックを交えて徹底解説します。

詳細解説:ジャグ配列の仕組みとメリット

一般的な2次元配列(Array(row, col))は、全ての行が同じ列数を持つ「矩形」である必要があります。しかし、実務で扱うCSVは、ヘッダー行とデータ行で列数が微妙にずれていたり、途中でデータが欠損していたりすることが珍しくありません。

ジャグ配列の最大の特徴は、Variant型の要素を持つ配列を用意し、その各要素の中に「その行のデータのみを格納した1次元配列」を放り込むという点です。

1. メモリ効率:行ごとに必要なメモリだけを確保するため、無駄な領域が発生しません。
2. 柔軟性:Split関数で分割した結果をそのまま格納できるため、列数の不一致によるエラーを回避できます。
3. 処理速度:セルへの書き込みを一度の配列展開(Rangeへの一括代入)に集約させることで、圧倒的な高速化を実現します。

この手法をマスターすることで、数万行のCSVデータであっても、数秒以内に読み込み・加工・出力までを完了させることが可能になります。

サンプルコード:ジャグ配列を用いたCSV読み込み実装

以下のコードは、FileSystemObjectを使用してファイルを読み込み、ジャグ配列にデータを格納した後、最終的にワークシートへ高速転記する実務テンプレートです。


Option Explicit

Sub ImportCsvToJaggedArray()
    Dim fso As Object
    Dim ts As Object
    Dim filePath As String
    Dim fileContent As String
    Dim lines As Variant
    Dim jaggedArray() As Variant
    Dim i As Long, lineCount As Long
    
    ' CSVファイルのパスを指定
    filePath = ThisWorkbook.Path & "\data.csv"
    
    ' FileSystemObjectでファイル読み込み
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.OpenTextFile(filePath, 1, False)
    fileContent = ts.ReadAll
    ts.Close
    
    ' 改行コードで分割して配列化
    lines = Split(fileContent, vbCrLf)
    lineCount = UBound(lines)
    
    ' ジャグ配列のサイズを定義
    ReDim jaggedArray(0 To lineCount)
    
    ' 各行をSplitで分割し、ジャグ配列に格納
    For i = 0 To lineCount
        If Len(lines(i)) > 0 Then
            jaggedArray(i) = Split(lines(i), ",")
        End If
    Next i
    
    ' ワークシートへの転記(高速化のため一度配列を整理する例)
    ' ※実務ではここから必要なデータのみを抽出し、別の2次元配列に再構築して出力します
    Call OutputToSheet(jaggedArray)
    
    MsgBox "CSVの読み込みが完了しました。", vbInformation
End Sub

Sub OutputToSheet(dataArray As Variant)
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(1)
    
    ' ジャグ配列はそのままではRangeに貼り付けられないため、
    ' 必要な範囲を特定して転記します
    Dim r As Long
    For r = LBound(dataArray) To UBound(dataArray)
        If IsArray(dataArray(r)) Then
            ws.Cells(r + 1, 1).Resize(1, UBound(dataArray(r)) + 1).Value = dataArray(r)
        End If
    Next r
End Sub

実務アドバイス:更なる最適化と注意点

ジャグ配列は強力ですが、単に使うだけでは不十分です。実務でさらにパフォーマンスを上げるためのヒントを3点伝授します。

1. 文字コードの壁を突破する:
 上記コードは「Shift-JIS」を前提としています。もし「UTF-8」のCSVを扱う場合、ADODB.Streamオブジェクトを使用し、Charsetを「UTF-8」に指定して読み込む必要があります。FileSystemObjectだけでは文字化けするため、必ずADODB.Streamを組み合わせるのがプロの流儀です。

2. 配列の再構築:
 ジャグ配列に格納したままでは、Excelのセルへ「一括で」書き込むことができません。最終的にシートへ出力する際は、データ件数が確定しているなら、一度ReDimで2次元配列(Array(row, col))を作成し、そこに値を転記してからRange.Valueに代入してください。この「転記」の手間を惜しまないことが、数百万セルを扱う際の鍵です。

3. エラー処理の徹底:
 CSVには予期せぬ改行や、カンマが含まれたデータ(ダブルクォーテーションで囲まれたデータ)が存在します。Split関数で単純に分割すると、これらが崩れてしまいます。データの整合性が重要な場合は、正規表現(RegExp)を活用してCSVの構文解析を行うか、あるいはDAOのTextStreamを使用して、より堅牢なパーサーを構築することを検討してください。

まとめ:VBAエンジニアとしてのステップアップ

ジャグ配列によるCSV処理は、VBAを「自動化ツール」から「データ処理エンジン」へと進化させるための登竜門です。単にセルを操作するだけのコードから脱却し、メモリ上でデータを自在に操る感覚を身につければ、Excelの限界を超えるような大規模なデータ分析や業務改善が可能になります。

今回のコードをベースに、ご自身の業務で頻繁に発生する「列の入れ替え」や「特定の条件に基づくフィルタリング」を組み込んでみてください。VBAにおける配列操作の習熟度は、そのままあなたの開発効率に直結します。ぜひ、このテクニックを武器に、よりスマートで高速なVBAライフを送ってください。皆さんのVBA開発が、より高度で快適なものになることを応援しています。

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