Excel VBAで業務を自動化できるようになると、次にぶつかりやすいのが「Excelそのものの限界」です。
「データが数十万件まで増えて、ファイルを開くだけで重い」「集計マクロを実行すると何分も待たされる」「複数人で同じExcelファイルを編集していたら競合や破損が起きた」――こうした問題は、VBAの書き方だけを改善しても解決できない場合があります。
そこで次のステップとして身につけたいのが、Excel VBA × SQL × データベースという組み合わせです。
これまで身につけてきたVBAを捨てる必要はありません。Excelは入力・帳票・分析画面としてそのまま活用しながら、重いデータの保存・検索・集計だけをAccessやSQL Serverなどのデータベース側へ任せることで、より大規模で安定した業務システムへ発展させられます。
この記事では、VBAからデータベースへ接続するためのADO(ActiveX Data Objects)を使い、SQLを発行して必要なデータだけをExcelへ取得する基本形を、参照設定不要のLate Binding方式で解説します。
「Excel VBAは使えるようになった。その次に何を学べばよいのか?」と考えている方にとって、この記事がAccess・SQL実践編へ進むためのロードマップになります。
なぜ「Excel VBA × SQL/DB」が現場で強力なのか?
ExcelとVBAだけでも、多くの定型業務を自動化できます。しかし、扱うデータ量や利用人数が増えるほど、Excel単体で無理をするよりもデータベースと役割分担したほうが圧倒的に扱いやすくなる場面が増えてきます。
1. Excelの約104万行という上限を超えられる
Excelワークシートには、1シートあたり1,048,576行という上限があります。
実務では上限に達する前でも、数十万行のデータに数式・書式・ピボット・VBA処理などが重なると、ファイルサイズの肥大化や処理速度の低下が目立ち始めます。
一方、データベースは大量データを保存・検索することを前提に設計されています。環境や製品、テーブル設計、インデックス、ハードウェアなどの条件にも左右されますが、Excelよりはるかに大規模なデータを扱えるため、「元データを全部Excelへ置く」という発想から脱却できます。
数百万件、さらに環境次第では数千万件規模のデータを扱う業務でも、必要な部分だけをSQLで絞り込んでExcelへ取り出す設計が可能です。
2. 必要なデータだけをSELECT文で取り出せる
データベースを使う大きなメリットは、全件をExcelへ読み込んでからVBAで探す必要がないことです。
たとえば100万件の売上明細から「2026年度の東京支店だけ」を確認したい場合、Excel側へ100万件すべてを読み込む必要はありません。
SQLのSELECT文とWHERE句を使い、データベース側で条件に合う行だけを抽出してからExcelへ渡せます。
つまり、Excel側のメモリ消費を抑えながら、通信量や後続処理も減らせます。大量データを扱うほど、この考え方が重要になります。
3. 複数人で利用するデータを一元管理しやすい
Excelファイルを共有フォルダへ置き、複数人が同じファイルへ入力する運用では、競合・上書き・ファイル破損などの問題が起きやすくなります。
データベースを利用すれば、データを一か所へ集約し、複数のExcelファイルや業務ツールから同じデータへアクセスする構成を作れます。
特にSQL Serverなどのサーバー型データベースは、複数ユーザーによる同時アクセスやトランザクション管理を前提として設計されています。
なお、AccessもExcelよりデータ管理に向いている場面は多いものの、ファイル型データベースであるため、利用人数や通信環境、データ量が大きくなった場合はSQL Serverなどへの移行も視野に入れる必要があります。
Excelとデータベースの使い分け
| 比較項目 | Excel | Access / SQL Serverなど |
|---|---|---|
| 主な役割 | 入力、帳票、分析、グラフ、ユーザー操作画面 | 大量データの保存、検索、更新、集計 |
| データ量 | 1シート最大1,048,576行。大量データでは動作が重くなりやすい | 製品・設計・環境次第で、Excelを大きく超えるデータを扱える |
| 検索・抽出 | 関数、フィルター、VBAなどで処理 | SQLで必要な行・列だけを抽出 |
| 集計 | SUMIFS、ピボット、VBAなど | GROUP BY、SUM、COUNTなどを利用 |
| 複数人利用 | 共有方法によって競合や上書きに注意 | 特にサーバー型DBは同時利用を前提に設計 |
| 得意分野 | 人が見て操作する「表」の処理 | 大量データを機械的に処理する「データ基盤」 |
重要なのは、Excelとデータベースのどちらか一方を選ぶことではありません。
「ユーザーが操作する画面はExcel」「大量データを管理する裏側はデータベース」と役割分担することで、それぞれの長所を活かせます。
【結論】実務でそのまま使える!VBAからAccessへSQLを発行する基本コード
ここからは、VBAからAccessデータベースへ接続し、SQLを実行して結果をExcelへ書き出す基本コードを紹介します。
今回はLate Binding(遅延バインディング)を使うため、VBEの「ツール」→「参照設定」からADOライブラリを追加する必要はありません。
コードを使う前に、次の3点だけ実際の環境に合わせて変更してください。
- DB_FILE_PATH:Accessファイルのフルパス
- TABLE_NAME:抽出対象のテーブル名
- 出力先シート名:今回は「SQL抽出結果」
'============================================================
' 機能:
' AccessデータベースへADOで接続し、SQLを実行して
' 抽出結果をExcelシートへ一括出力する基本テンプレート
'
' 特徴:
' ・Late Binding方式なのでADOの参照設定は不要
' ・ACCDB / MDBの両方を想定
' ・CopyFromRecordsetで高速に一括書き込み
' ・エラー時もConnection / Recordsetを確実に閉じる
'============================================================
Option Explicit
Sub GetDataFromAccess()
'--------------------------------------------------------
' 実際の環境に合わせて変更する設定値
'--------------------------------------------------------
Const DB_FILE_PATH As String = "C:\Data\SalesData.accdb"
Const TABLE_NAME As String = "売上明細"
Const OUTPUT_SHEET_NAME As String = "SQL抽出結果"
' ADOオブジェクトを格納する変数
' Late BindingなのでObject型で宣言する
Dim cn As Object
Dim rs As Object
' Excel側で使用する変数
Dim ws As Worksheet
Dim sql As String
Dim connectionString As String
Dim fileExtension As String
Dim i As Long
' エラーが発生した場合はErrorHandlerへ移動する
On Error GoTo ErrorHandler
'--------------------------------------------------------
' 1. Accessファイルが存在するか確認
'--------------------------------------------------------
If Dir(DB_FILE_PATH) = "" Then
MsgBox "Accessファイルが見つかりません。" & vbCrLf & _
DB_FILE_PATH, vbExclamation
Exit Sub
End If
'--------------------------------------------------------
' 2. 出力先シートを取得
'--------------------------------------------------------
Set ws = ThisWorkbook.Worksheets(OUTPUT_SHEET_NAME)
' 前回の抽出結果を削除する
ws.Cells.ClearContents
'--------------------------------------------------------
' 3. ADOオブジェクトを作成
'--------------------------------------------------------
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
'--------------------------------------------------------
' 4. Accessファイルの拡張子を取得
'--------------------------------------------------------
fileExtension = LCase$(Mid$(DB_FILE_PATH, InStrRev(DB_FILE_PATH, ".") + 1))
' ACCDB / MDBのどちらでもACE OLEDBプロバイダーで接続する
If fileExtension = "accdb" Or fileExtension = "mdb" Then
connectionString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & DB_FILE_PATH & ";"
Else
Err.Raise vbObjectError + 1000, _
"GetDataFromAccess", _
"対応していないデータベースファイル形式です。"
End If
'--------------------------------------------------------
' 5. データベースへ接続
'--------------------------------------------------------
cn.Open connectionString
'--------------------------------------------------------
' 6. 実行するSQLを作成
' 今回はテーブルの全列を取得する基本例
'--------------------------------------------------------
sql = "SELECT * FROM [" & TABLE_NAME & "];"
'--------------------------------------------------------
' 7. SQLを実行してRecordsetへ結果を取得
'--------------------------------------------------------
rs.Open sql, cn
'--------------------------------------------------------
' 8. フィールド名を1行目へ出力
'--------------------------------------------------------
For i = 0 To rs.Fields.Count - 1
ws.Cells(1, i + 1).Value = rs.Fields(i).Name
Next i
'--------------------------------------------------------
' 9. データが存在する場合だけ2行目以降へ一括出力
' CopyFromRecordsetを使うので1行ずつループする必要がない
'--------------------------------------------------------
If Not rs.EOF Then
ws.Range("A2").CopyFromRecordset rs
End If
' 見やすいように列幅を自動調整する
ws.Columns.AutoFit
'--------------------------------------------------------
' 10. 正常終了時の後処理
'--------------------------------------------------------
If rs.State <> 0 Then
rs.Close
End If
If cn.State <> 0 Then
cn.Close
End If
Set rs = Nothing
Set cn = Nothing
Set ws = Nothing
MsgBox "データベースからの抽出が完了しました。", vbInformation
Exit Sub
'------------------------------------------------------------
' エラー発生時の処理
'------------------------------------------------------------
ErrorHandler:
' 後処理中に別のエラーが発生しても停止しないようにする
On Error Resume Next
' Recordsetが開いている場合は閉じる
If Not rs Is Nothing Then
If rs.State <> 0 Then
rs.Close
End If
End If
' Connectionが開いている場合は閉じる
If Not cn Is Nothing Then
If cn.State <> 0 Then
cn.Close
End If
End If
' オブジェクトを解放する
Set rs = Nothing
Set cn = Nothing
Set ws = Nothing
MsgBox "データベース処理中にエラーが発生しました。" & vbCrLf & _
"エラー番号:" & Err.Number & vbCrLf & _
"内容:" & Err.Description, _
vbCritical
End Sub
このコードの基本的な流れは、とてもシンプルです。
- Accessファイルの存在を確認する
- ADODB.Connectionを作成する
- Accessデータベースへ接続する
- SQL文を作成する
- ADODB.Recordsetへ検索結果を取得する
- CopyFromRecordsetでExcelへ一括出力する
- RecordsetとConnectionを閉じる
- オブジェクトを解放する
これが、VBAからSQLを扱ううえで最初に覚えておきたい「接続 → SQL実行 → 結果取得 → Excel出力 → 切断」という基本パターンです。
コードの詳しい解説
1. ADODB.Connectionでデータベースへ接続する
データベースとの通信窓口になるのがADODB.Connectionです。
今回のコードでは参照設定を不要にするため、次のようにCreateObjectを使っています。
Set cn = CreateObject("ADODB.Connection")
これは、実行時にADOのConnectionオブジェクトを生成するLate Bindingという方法です。
Early Bindingのように「Microsoft ActiveX Data Objects ○○ Library」を参照設定する必要がないため、他のPCへマクロを配布する場合にも扱いやすいのがメリットです。
ただし、接続先へアクセスするためのOLE DBプロバイダーやODBCドライバー自体はPC側に必要です。
2. ConnectionStringとは?
データベースへ接続するときには、「どの仕組みを使い、どのデータベースへ接続するのか」という情報が必要です。
それを表すのがConnectionString(接続文字列)です。
今回のAccess用コードでは、次の形になっています。
connectionString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & DB_FILE_PATH & ";"
cn.Open connectionString
- Provider:データベースと通信するOLE DBプロバイダーを指定します。
- Data Source:接続するAccessファイルのパスを指定します。
- Open:Connectionオブジェクトを使って実際に接続を開始します。
SQL Serverや他のデータベースへ接続する場合も基本的な考え方は同じですが、サーバー名、データベース名、認証方式、ドライバーなどに応じて接続文字列が変わります。
つまり、今後AccessからSQL Serverへ進んでも、VBA側の基本構造は大きく変わりません。
3. ADODB.RecordsetにSQLの検索結果を格納する
ADODB.Recordsetは、SELECT文を実行して返ってきた表形式の結果を扱うためのオブジェクトです。
今回のコードでは、次の2行が重要です。
sql = "SELECT * FROM [" & TABLE_NAME & "];"
rs.Open sql, cn
rs.Openの主な意味は次のとおりです。
- 第1引数 sql:実行するSQL文を指定します。
- 第2引数 cn:どのConnectionを使ってSQLを実行するか指定します。
SQLを実行すると、その結果をRecordset経由でExcel側から扱えるようになります。
RecordsetにはFieldsコレクションも用意されているため、今回のサンプルではSQLの結果だけでなく列名も自動取得しています。
For i = 0 To rs.Fields.Count - 1
ws.Cells(1, i + 1).Value = rs.Fields(i).Name
Next i
Fields.Countは取得した列数、Fields(i).Nameは各列のフィールド名を表します。
4. Range.CopyFromRecordsetが高速な理由
VBAで大量データをExcelへ書き込むとき、初心者がやりがちなのが次のような1セルずつのループ処理です。
' 大量データでは遅くなりやすい考え方
For i = 1 To 100000
Cells(i, 1).Value = "データ"
Next i
Excelでは、セルへのアクセス回数が増えるほどVBAとのやり取りが増え、処理速度が低下しやすくなります。
そこで使えるのがRange.CopyFromRecordsetです。
ws.Range("A2").CopyFromRecordset rs
この1行で、Recordsetに入っている複数行・複数列のデータをExcelへまとめて展開できます。
つまり、「1件ずつRecordsetを読み、1セルずつ書き込む」ループが不要です。
実務で大量データを扱うなら、CopyFromRecordsetはぜひ覚えておきたいメソッドです。
5. EOFプロパティでデータの有無を確認する
今回のコードでは、CopyFromRecordsetを実行する前に次の確認を入れています。
If Not rs.EOF Then
ws.Range("A2").CopyFromRecordset rs
End If
EOFは「End Of File」の略で、Recordsetの終端に到達しているかどうかを示します。
SELECT文の結果が0件だった場合、Recordsetはデータ行を持っていません。そのため、Not rs.EOFでデータが存在することを確認してから書き出しています。
6. CloseとSet Nothingによる後処理が重要
データベースとの接続は、開いたまま放置するべきではありません。
処理が終わったら、RecordsetとConnectionをCloseします。
If rs.State <> 0 Then
rs.Close
End If
If cn.State <> 0 Then
cn.Close
End If
その後、変数が保持しているオブジェクトへの参照も解放します。
Set rs = Nothing
Set cn = Nothing
CloseとSet Nothingは似ていますが、役割が異なります。
- Close:データベース接続やRecordsetを閉じます。
- Set … = Nothing:VBA変数が保持しているオブジェクトへの参照を解放します。
特にデータベース処理では、正常終了時だけでなくエラー発生時にも確実に接続を閉じることが重要です。
そのため今回のサンプルでは、On Error GoTo ErrorHandlerを使って後処理まで含めた完全な形にしています。
使用している主要なオブジェクト・メソッド一覧
| オブジェクト・メソッド | 役割 | 注意点 |
|---|---|---|
| CreateObject | 実行時にADOオブジェクトを生成する | Late BindingではObject型で受け取る |
| ADODB.Connection | データベースとの接続を管理する | 接続文字列がDB製品や認証方法によって異なる |
| Connection.Open | データベースへの接続を開始する | プロバイダー未導入、パス間違い、権限不足などでエラーになる |
| ADODB.Recordset | SELECT文などの結果を表形式で扱う | 使用後はCloseする |
| Recordset.Open | SQLを実行し、結果をRecordsetとして取得する | SQLの文法やテーブル名・列名の間違いに注意する |
| Fields | Recordset内の各列へアクセスする | インデックスは0から始まる |
| EOF | Recordsetの終端かどうかを判定する | 0件判定にも利用できる |
| Range.CopyFromRecordset | RecordsetのデータをExcelへ一括転記する | 見出し行は自動出力されないため、必要ならFieldsから別途書き込む |
| Close | RecordsetやConnectionを閉じる | エラー時にも実行できるよう後処理を設計する |
実務でまず覚えるべき基本のSQL構文3選
VBAからデータベースへ接続できたら、次に必要になるのがSQLです。
SQLと聞くと難しそうに感じるかもしれませんが、最初から複雑な構文をすべて覚える必要はありません。
まずは次の3つを扱えるようになるだけでも、Excel VBAのデータ処理能力は大きく広がります。
1. SELECT ~ FROM ~ WHERE:必要なデータだけ抽出する
最初に覚えるべきSQLがSELECT文です。
SELECT 商品名, 売上金額
FROM 売上明細
WHERE 支店名 = '東京';
それぞれの意味は次のとおりです。
- SELECT:取得する列を指定します。
- FROM:取得元となるテーブルを指定します。
- WHERE:取得する行の条件を指定します。
Excel VBAだけで同じことをしようとすれば、最終行を取得し、Forループで1行ずつ確認し、条件に一致した行を別シートへ転記する、といった処理を書くことになります。
SQLでは「条件に合う行だけ取得する」こと自体がSQLの役割なので、VBA側へ大量のループを書く必要がありません。
2. ORDER BY:抽出結果を並び替える
並び順を指定するときはORDER BYを使います。
SELECT 商品名, 売上金額
FROM 売上明細
ORDER BY 売上金額 DESC;
- ASC:昇順で並び替えます。
- DESC:降順で並び替えます。
たとえば売上金額の大きい順でExcelへ取得したいなら、SQL側でORDER BYを指定しておけば、取得後にExcel VBAでSortを実行し直す必要がなくなります。
3. GROUP BY + SUM・COUNT:データベース側で集計する
SQLが特に威力を発揮するのが集計処理です。
たとえば支店別の売上金額を集計するなら、次のように書けます。
SELECT
支店名,
SUM(売上金額) AS 売上合計
FROM 売上明細
GROUP BY 支店名;
件数を数えたいならCOUNTを使えます。
SELECT
支店名,
COUNT(*) AS 取引件数
FROM 売上明細
GROUP BY 支店名;
Excel VBAで同じ集計を行う場合、Dictionaryや配列を用意してループを回すコードを書くことがあります。
もちろん、それらの技術はExcel内部の処理では非常に重要です。しかし、元データがすでにデータベースにあるなら、データベースが得意な集計はSQL側へ任せたほうがシンプルです。
SQLなら、VBAで何十行も必要だった処理を数行のSELECT文へ置き換えられることがあります。
VBAとSQLは「どちらが速いか」ではなく役割分担で考える
ここで重要なのは、「これからはVBAを使わず、全部SQLにすればよい」わけではないということです。
VBAとSQLには、それぞれ得意分野があります。
| 処理 | 向いている技術 |
|---|---|
| 大量データから条件に合う行だけ取得する | SQL |
| 大量データをグループ別に集計する | SQL |
| Excelのセル、シート、ブックを操作する | VBA |
| 帳票を作成する | Excel + VBA |
| ボタンからSQLを実行する | VBA + SQL |
| 検索結果をExcel帳票へ反映する | SQL + VBA |
たとえば、100万件のデータから対象となる5,000件だけをSQLで抽出し、その5,000件をVBAで帳票へ加工する。
このように、大量データの処理はSQL、Excel固有の操作はVBAと分担すると、コードも処理負荷も大幅に整理しやすくなります。
実務で使う際の注意点・エラー対策
1. 「プロバイダーが見つかりません」と表示される
Accessへ接続するときに代表的なのが、ACE OLE DBプロバイダー関連のエラーです。
今回のコードでは、次のプロバイダーを指定しています。
"Provider=Microsoft.ACE.OLEDB.12.0;"
PCに必要なAccess Database Engineが存在しない場合や、Officeとの32bit・64bit構成などが関係する環境では、接続できないことがあります。
「参照設定不要」=「ADOやAccess用ドライバーが一切不要」という意味ではありません。Late Bindingで不要になるのは、VBAプロジェクト側でのADOライブラリ参照設定です。
2. Accessファイルのパスを固定すると他のPCで動かない
サンプルでは分かりやすさを優先し、次のような絶対パスを使っています。
Const DB_FILE_PATH As String = "C:\Data\SalesData.accdb"
しかし、複数PCで利用する場合はCドライブ内のフォルダ構成が異なる可能性があります。
ExcelファイルとAccessファイルを同じフォルダへ置く運用なら、ThisWorkbook.Pathを利用して相対的にパスを組み立てる設計も有効です。
3. テーブル名・列名に日本語や空白がある場合
Accessでは、日本語や空白を含むテーブル名・フィールド名を利用できます。
その場合は、次のように[ ]で囲んでおくと安全です。
SELECT [商品名], [売上 金額]
FROM [売上 明細];
予約語と同じ名前のフィールドが存在する場合にも、角括弧を付けることで意図を明確にできます。
4. SQLを文字列連結するときは値の種類に注意する
VBAからWHERE句を作るようになると、文字列・数値・日付によってSQLの書き方が変わります。
特にAccessでは、文字列条件にはシングルクォート、日付条件にはAccess SQL特有の記述が必要になる場面があります。
また、ユーザー入力をそのままSQL文字列へ連結する設計は、値に引用符が含まれた場合のエラーや、システム構成によってはSQLインジェクション対策の観点でも問題になります。
実務システムへ発展させる段階では、パラメータクエリも重要なテーマになります。
5. SQLで絞れるものはExcelへ持ってくる前に絞る
データベースを使っているのに、次のようなSQLを書いて毎回全件取得してしまうと、SQLのメリットを十分に活かせません。
SELECT *
FROM 売上明細;
本番運用では、必要に応じて列を限定し、WHERE句で行を限定することが重要です。
SELECT 売上日, 商品名, 売上金額
FROM 売上明細
WHERE 支店名 = '東京';
「データベースから何件取得するか」を意識することが、大量データ処理では非常に重要です。
Excel VBAを学んだ次にSQLを学ぶと理解しやすい理由
SQLはVBAとは文法が異なりますが、VBAでデータ処理を経験している人ほど理解しやすい部分があります。
たとえば、これまでVBAで次のような処理を書いてきたのではないでしょうか。
- 最終行までForループする
- If文で条件判定する
- 一致したデータだけ別シートへ転記する
- Dictionaryでキーごとに集計する
- Sortで結果を並び替える
SQLでは、これらの多くをSELECT・WHERE・GROUP BY・ORDER BYといった命令へ置き換えられます。
つまり、VBAでデータ処理の考え方を理解していれば、SQLを学ぶときにも「このVBA処理をSQLならどう書くか?」という視点で学習できます。
これまで積み重ねてきたVBAの知識は無駄になりません。むしろ、SQLを覚えることでVBAを使うべき場所と、使わなくてよい場所が分かるようになるのです。
ここまでのVBAスキルもSQL連携でさらに活きる
データベースへ進んだからといって、これまで学んだExcel VBAのテクニックが不要になるわけではありません。
むしろ、SQLで取得したデータをExcelで加工・出力するときには、これまでのVBAスキルがそのまま活躍します。
-
VBAで最終行・最終列を取得する4つの方法
SQLで取得したデータを既存表へ追記する場合など、Excel側のデータ範囲を正しく取得する技術は引き続き重要です。 -
【VBA】転記処理の決定版!別シート・別ブックへデータを高速コピーする自動化コード
データベースから取得した結果を帳票や別ブックへ展開するときに、そのまま応用できます。 -
【VBA】フォルダ内の複数Excelファイルを一括結合!Dir関数で高速自動集約する決定版コード
複数ファイルをExcelへまとめるだけでなく、将来的には集約データをAccessやSQL Serverへ登録する仕組みへ発展させられます。 -
【VBA】VLOOKUPより100倍速い!配列とDictionary(連想配列)で大量データを一瞬で突合する決定版コード
Excel内部の高速処理ではDictionaryが強力です。一方、データベース同士の大量データ突合ではSQLのJOINが大きな武器になります。 -
【VBA】マクロが途中で止まらない!現場で必須のエラー処理(On Error)とデバッグ完全ガイド
データベース接続では、ファイル不存在・接続失敗・SQLエラーなどが発生するため、エラー処理の重要性はさらに高まります。
これから学ぶ「Access・SQL実践編」のロードマップ
今回のコードで、VBAからデータベースを操作する入口には立てました。
ここから先は、次のような知識を順番に身につけることで、本格的な業務データベースを扱えるようになります。
- Accessのテーブル設計を理解する
- 主キー・データ型の考え方を理解する
- SELECT・WHEREで条件抽出する
- ORDER BYで並び替える
- GROUP BY・SUM・COUNTで集計する
- JOINで複数テーブルを結合する
- INSERTでVBAからデータを追加する
- UPDATEで既存データを更新する
- DELETEで不要データを削除する
- パラメータクエリやトランザクションを使い、より安全な実務処理へ発展させる
特にJOINを使えるようになると、VLOOKUPやXLOOKUP、Dictionaryで行っていた「別テーブルとの突合」という処理を、データベース側で実行できるようになります。
ここからが、Excel VBAで培ったデータ処理力をさらに一段上へ引き上げるフェーズです。
まとめ
Excel VBAは、現場の業務自動化において非常に強力な武器です。
しかし、データ量が数十万件へ増え、複数人で利用し、処理内容も複雑になってくると、Excelだけですべてを抱える設計には限界が見えてきます。
そこで重要になるのが、Excelは操作画面、データ処理の裏側はSQL・データベースという考え方です。
今回覚えておきたいポイントは次のとおりです。
- Excelには1シート約104万行という上限があり、大量データでは処理負荷も大きくなる
- データベースなら、Excelを大きく超えるデータを管理できる
- SQLのSELECT文を使えば、必要なデータだけをExcelへ取得できる
- VBAからADOを使えば、Accessなどのデータベースへ接続できる
- Late BindingならADOの参照設定なしでコードを作成できる
- Recordsetで取得したデータはCopyFromRecordsetで高速にExcelへ展開できる
- WHERE・ORDER BY・GROUP BYを覚えるだけでも、大量のVBAループ処理をSQLへ置き換えられる
- ConnectionとRecordsetは使用後にCloseし、オブジェクトも適切に解放する
そして何より重要なのは、SQLを覚えることはVBAを卒業することではないという点です。
VBAでExcelを自在に操作し、SQLで大量データを高速に処理する。
この2つを組み合わせられるようになると、「Excelファイルを自動化できる人」から、業務データ全体の流れを設計・自動化できる人へとスキルの幅が大きく広がります。
VBAを身につけた次の武器は、SQLです。
次回からはいよいよ「Access活用・本格SQL実践シリーズ」をスタートします。
Excelの中だけでデータを処理する世界から一歩踏み出し、Accessのテーブル設計、SELECT文、WHERE句、GROUP BY、JOIN、さらにVBAからの追加・更新処理まで、実務で使える形で順番に身につけていきましょう。
Excelの限界が見え始めたときこそ、次のステージへ進むタイミングです。
Excel VBA × SQL × データベースを武器にして、より速く、壊れにくく、拡張しやすい業務自動化へ進んでいきましょう。
