こんにちは、なかぜんです。AccessやExcelでの業務改善にVBAを活用している方も多いと思いますが、「Access VBAとExcel VBAの違いって何だろう?」と思ったことはありませんか?
どちらも同じ「VBA」ではあるものの、設計思想や得意分野が異なり、使い分けと連携によって業務効率は飛躍的に向上します。この記事ではその違いと連携手法について、やさしく・実践的に解説していきます。
Access VBAとExcel VBAの違いとは?
基本的な考え方の違い
- Excel VBA:表計算ベースで「セル」を扱うのが得意。個人や小規模業務に最適。
- Access VBA:リレーショナルデータベースを前提に設計されており、複雑なデータ構造の管理や検索に強い。
オブジェクトモデルの違い
Excel VBAは「セル(Range)」が中心なのに対し、Access VBAは「レコードセット(DAO/ADO)」を軸にしたデータ操作が主流です。
使いどころの目安
用途 | Excel VBA | Access VBA |
---|---|---|
定型レポートの自動作成 | ◎ | △ |
検索・抽出処理 | △ | ◎ |
大量データの管理 | △(不安定) | ◎(安定) |
連携の基本:AccessからExcelへ出力する方法
Access VBAからExcelを操作する方法をご紹介します。以下は、「クエリの結果をExcelファイルに書き出す」実用例です。
コード例:AccessからExcelに書き出す
' 参照設定:Microsoft Excel XX.X Object Library
Sub ExportQueryToExcel()
Dim xlApp As Object
Dim xlBook As Object
Dim rs As DAO.Recordset
Dim i As Integer
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set rs = CurrentDb.OpenRecordset("Q_売上集計") '←クエリ名を指定
' 見出しの出力
For i = 0 To rs.Fields.Count - 1
xlBook.Sheets(1).Cells(1, i + 1).Value = rs.Fields(i).Name
Next i
' データの出力
rs.MoveFirst
i = 2
Do Until rs.EOF
Dim j As Integer
For j = 0 To rs.Fields.Count - 1
xlBook.Sheets(1).Cells(i, j + 1).Value = rs.Fields(j).Value
Next j
rs.MoveNext
i = i + 1
Loop
xlApp.Visible = True
rs.Close
Set rs = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
End Sub
解説:このコードは、DAOでクエリ結果を取得し、CreateObjectでExcelを起動しつつセルに1行ずつ出力する基本的な構成です。
AccessにExcelからデータを取り込む方法
コード例:ExcelのデータをAccessテーブルにインポート
' 参照設定:Microsoft Excel XX.X Object Library
Sub ImportFromExcel()
Dim xlApp As Object
Dim xlBook As Object
Dim ws As Object
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Integer
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("C:\データ\売上.xlsx")
Set ws = xlBook.Sheets(1)
Set db = CurrentDb
Set rs = db.OpenRecordset("T_売上")
i = 2 ' 1行目は見出し
Do While ws.Cells(i, 1).Value <> ""
rs.AddNew
rs!売上日 = ws.Cells(i, 1).Value
rs!商品名 = ws.Cells(i, 2).Value
rs!数量 = ws.Cells(i, 3).Value
rs.Update
i = i + 1
Loop
xlBook.Close False
xlApp.Quit
Set rs = Nothing
Set db = Nothing
Set ws = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
End Sub
解説:Excelのワークシートからデータを読み込み、DAOでAccessテーブルに1件ずつ登録する構成です。
注意点とよくあるミス
- Excelがバックグラウンドで残る:Setオブジェクトを解放し忘れると、Excelが終了しない問題があります。
- 参照設定エラー:Access→Excel操作では「Excelオブジェクトライブラリ」が必要です(早期バインディングの場合)。
- 日本語の列名:Excelの列名が日本語の場合、スペースや全角記号がエラー原因になることも。
応用編:双方向でのデータ同期
Accessで更新されたらExcelも更新
更新ログテーブルを作成し、変更のたびに「更新済フラグ」を立てることで、Excel側で更新された内容だけを取り込み・書き出しできます。
Excelで入力された内容をAccessに蓄積
定型フォーマットのテンプレートを用意し、マクロボタンでAccessに自動送信する仕組みを組めば、現場での入力→DB一括管理が可能です。
API化やクラウド連携
さらに一歩進んで、Power AutomateやOffice Scriptと組み合わせることで「ボタン1つでAccess→Excel→メール送信」といったワークフローも実現できます。
まとめ:VBAの違いを知ることで広がる可能性
今回は「Excel VBAとAccess VBAの違い」と「連携テクニック」についてお伝えしました。
- Accessはデータベースとしての堅牢性・高速性が魅力
- Excelは見やすく、柔軟なUIとして優れている
- 両者を連携させることで業務効率は劇的に向上する
「なかぜん」からのおすすめは、よく使う帳票や月次報告の処理をAccessで集計→Excelに出力する仕組みから始めてみることです。
