Excel VBA | CSVをADOで高速に読み込む方法 + 郵便番号から都道府県だけ抽出する高速版

Excel VBA VBA
スポンサーリンク

大量の郵便番号データ(日本郵便公式の KEN_ALL.CSV など)を扱う場合、
FileSystemObject で1行ずつ読む方法は遅くなりがちです。
そこで ADO(ActiveX Data Objects) を使うと、CSVを「データベースのテーブル」として高速に読み込めます。


例1:CSVをADOで高速に読み込む

Sub ReadCSVWithADO()
    Dim conn As Object, rs As Object
    Dim filePath As String
    
    ' CSVファイルのパス
    filePath = "C:\data\KEN_ALL.CSV"
    
    ' ADO接続を作成
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & Left(filePath, InStrRev(filePath, "\")) & ";" & _
              "Extended Properties=""text;HDR=No;FMT=Delimited"""
    
    ' レコードセットを取得
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open "SELECT * FROM [" & Mid(filePath, InStrRev(filePath, "\") + 1) & "]", conn
    
    ' データをExcelに書き込み(例:A列に郵便番号、B列に住所)
    Dim row As Long
    row = 1
    Do Until rs.EOF
        Cells(row, 1).Value = rs.Fields(2).Value   ' 郵便番号
        Cells(row, 2).Value = rs.Fields(6).Value & rs.Fields(7).Value & rs.Fields(8).Value ' 住所
        row = row + 1
        rs.MoveNext
    Loop
    
    rs.Close
    conn.Close
End Sub
VB

ポイント

  • Jet OLEDB Provider を使ってCSVを「テーブル」として扱う
  • SELECT * FROM [KEN_ALL.CSV] でSQLクエリを実行できる
  • 大量データでも高速に読み込める

例2:郵便番号から都道府県だけ抽出する高速版

Sub PostalCodeToPrefectureFast()
    Dim conn As Object, rs As Object
    Dim filePath As String, code As String
    
    filePath = "C:\data\KEN_ALL.CSV"
    
    ' ADO接続
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & Left(filePath, InStrRev(filePath, "\")) & ";" & _
              "Extended Properties=""text;HDR=No;FMT=Delimited"""
    
    ' A列の郵便番号を判定してB列に都道府県を出力
    Dim lastRow As Long, i As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 1 To lastRow
        code = Replace(Cells(i, 1).Value, "-", "")
        
        ' SQLで郵便番号を検索(KEN_ALL.CSVの仕様:fields(2)=郵便番号, fields(6)=都道府県)
        Set rs = conn.Execute("SELECT F6 FROM [KEN_ALL.CSV] WHERE F3='" & code & "'")
        
        If Not rs.EOF Then
            Cells(i, 2).Value = rs.Fields(0).Value
        Else
            Cells(i, 2).Value = "不明"
        End If
        rs.Close
    Next i
    
    conn.Close
End Sub
VB

ポイント

  • SQLで直接検索 → 郵便番号から都道府県を即座に抽出
  • 大量データでも高速 → ループ+SQLで効率的に処理
  • 住所全体ではなく都道府県だけ → 集計や地域分析に最適

実行イメージ

A列(郵便番号)B列(都道府県)
1000001東京都
1500002東京都
2200012神奈川県
5300001大阪府
8100003福岡県
9999999不明

実務での応用

  • 顧客リストの郵便番号から都道府県別に集計
  • 配送ラベル作成 → 郵便番号から住所を補完
  • マーケティング分析 → 地域別売上や顧客分布を高速に算出

💡 ADOを使うと「CSVをデータベースのように扱える」ので、郵便番号辞書のような大規模データ処理に非常に有効です。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました