Excel VBAとAccess VBAの違いとは?業務効率を高める連携テクニックも解説!

Access

こんにちは、なかぜんです。AccessやExcelでの業務改善にVBAを活用している方も多いと思いますが、「Access VBAとExcel VBAの違いって何だろう?」と思ったことはありませんか?

どちらも同じ「VBA」ではあるものの、設計思想や得意分野が異なり、使い分けと連携によって業務効率は飛躍的に向上します。この記事ではその違いと連携手法について、やさしく・実践的に解説していきます。

Access VBAとExcel VBAの違いとは?

基本的な考え方の違い

  • Excel VBA:表計算ベースで「セル」を扱うのが得意。個人や小規模業務に最適。
  • Access VBA:リレーショナルデータベースを前提に設計されており、複雑なデータ構造の管理や検索に強い

オブジェクトモデルの違い

Excel VBAは「セル(Range)」が中心なのに対し、Access VBAは「レコードセット(DAO/ADO)」を軸にしたデータ操作が主流です。

使いどころの目安

用途Excel VBAAccess 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に出力する仕組みから始めてみることです。