VBA×SQL接続(自分用メモ)|CSVをDB化して爆速処理する方法

仕事

VBA×SQL接続まとめ|CSVもDB化して爆速データ処理する方法

VBAで大量データを扱っていると、「処理が遅い」「コードが長い」「メンテが大変」…こんな悩み、出てきますよね。
実はこれ、SQLを組み合わせるだけで一気に解決できます。

特にポイントなのが、CSVをデータベースとして扱うという考え方。
これができると、VBAのループ処理が不要になり、処理速度も保守性もかなり向上します。

この記事では、VBAとSQLの接続から、実務で使える構成、CSV×SQLの応用までまとめて解説します。


■ VBA×SQLの基本構造

まずは全体像です。

  • 接続(Open)
  • 実行(SELECT / INSERT / UPDATE)
  • トランザクション(任意)
  • 終了(Close)

この4つだけ覚えればOKです。


■ 最適構成(シンプル設計)

実務では、以下の構成が一番バランスが良いです。

  • SQL文 → 文字列 or 関数
  • DB処理 → クラス化

過剰にクラスを分ける必要はありません。
「接続・実行・終了・トランザクション」だけに絞るのがポイントです。


■ クラステンプレ(そのまま使える)

Option Explicit

Private conn As Object

' 接続
Public Sub Open()

    Set conn = CreateObject("ADODB.Connection")
    
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
              "Data Source=C:\CSVフォルダ;" & _
              "Extended Properties=""text;HDR=Yes;FMT=Delimited"""

End Sub

' SELECT
Public Function ExecuteSelect(ByVal sql As String) As Object

    Dim rs As Object
    Set rs = CreateObject("ADODB.Recordset")
    
    rs.Open sql, conn
    
    Set ExecuteSelect = rs

End Function

' 更新系
Public Sub ExecuteNonQuery(ByVal sql As String)
    conn.Execute sql
End Sub

' トランザクション
Public Sub BeginTrans()
    conn.BeginTrans
End Sub

Public Sub Commit()
    conn.CommitTrans
End Sub

Public Sub Rollback()
    conn.RollbackTrans
End Sub

' 終了
Public Sub Close()

    If Not conn Is Nothing Then
        If conn.State = 1 Then conn.Close
    End If
    
    Set conn = Nothing

End Sub

■ 使用例(基本パターン)

Sub 実行()

    Dim db As New clsDB
    Dim rs As Object
    
    On Error GoTo ErrHandler
    
    db.Open
    
    ' SELECT
    Set rs = db.ExecuteSelect("SELECT * FROM [users.csv]")
    Sheet1.Range("A1").CopyFromRecordset rs
    
    ' 更新
    db.BeginTrans
    db.ExecuteNonQuery "UPDATE users SET name = 'test'"
    db.Commit
    
    db.Close
    Exit Sub

ErrHandler:
    db.Rollback
    db.Close
    MsgBox Err.Description

End Sub

■ CSVをSQLで扱う方法(超重要)

CSVはフォルダ単位でデータベースとして扱えます。

接続先:

Data Source = CSVフォルダ

SQL:

SELECT * FROM [file.csv]

※ファイル名は必ず[]で囲みます。


■ CSV同士をJOINする(実務で最強)

SELECT u.ID, u.Name, o.OrderDate
FROM [users.csv] u
INNER JOIN [orders.csv] o
ON u.ID = o.UserID

これだけで複数CSVの突合が可能です。
VBAでのループ処理は不要になります。


■ よく使うSQLパターン

▼ 抽出

SELECT * FROM [file.csv]

▼ 条件

WHERE ID = 1

▼ 集計

SELECT COUNT(*) FROM [file.csv]

▼ 結合

INNER JOIN

■ 実務での使い方(おすすめ)

  1. 各処理でCSVを出力
  2. SQLでJOIN・集計
  3. Excelへ出力

この流れにすると、処理がかなり軽くなります。


■ メリットまとめ

  • ループ処理削減
  • 処理速度向上
  • コード短縮
  • 保守性アップ

■ 注意点

  • 接続文字列ミスが多い
  • CSVは[file.csv]で指定
  • 型のズレ(数値・文字)
  • トランザクション管理忘れ

■ まとめ

VBA×SQLの本質はシンプルです。

「VBAは実行役、SQLが処理の本体」

この構成にするだけで、今のCSV処理やファイル処理は一気に効率化できます。

特におすすめなのが、

「CSVをデータベースとして扱う」

この考え方を取り入れるだけで、VBAの世界が変わります。


■ 次のステップ

  • 複数CSVのUNION
  • schema.iniで型固定
  • Access連携で高速化
  • パラメータ化SQL

ここまでできれば、実務でもかなり強いです。

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