導入文
Access VBAでExcelへデータを出力する際、
「特定のセル位置に書き込みたい」「行や列を指定して整理したい」
といった場面は非常に多くあります。
本記事では、Access VBAからExcelを操作し、セルを指定して値を書き込む方法をRange・Cellsの両方で解説します。
※サンプルではクエリ名を qrySample としています。実際に使う場合は、お使いのクエリ名/テーブル名に変更してください。
Access VBAでExcelへセル指定出力する基本
「セル指定」とは、ExcelのA1やB3のように、書き込む場所を決めて出力することです。
Access側のデータを「決まったレイアウト」に落とし込みたいとき、Range / Cells の指定がとても役立ちます。
Range(“A1”):直感的にセル番地で指定
Cells(行, 列):行番号・列番号で指定(ループ処理に強い)
Excelを起動してセルへ書き込む基本コード
まずは「Excelを起動 → セルに書き込み → 保存 → 終了」という基本の流れです。
Access VBAでExcelを操作する最小サンプルとして、そのままコピペで試せます。
コード①:最小(起動→書き込み→保存→終了)
Option Compare Database
Option Explicit
‘最小:Excelを起動してA1に書き込み、保存して終了
Public Sub Excel_Write_Minimum()
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim savePath As String
savePath = CurrentProject.Path & “\sample_cell_output.xlsx”
On Error GoTo EH
Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = True ‘動作確認後は False でもOK
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
‘Rangeでセル指定
xlSheet.Range(“A1”).Value = “Access VBA から Excel へ出力しました”
xlSheet.Range(“A2”).Value = Now
xlBook.SaveAs savePath
xlBook.Close SaveChanges:=False
xlApp.Quit
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
MsgBox “保存しました: ” & savePath, vbInformation
Exit Sub
EH:
MsgBox “エラー: ” & Err.Number & vbCrLf & Err.Description, vbExclamation
On Error Resume Next
If Not xlBook Is Nothing Then xlBook.Close SaveChanges:=False
If Not xlApp Is Nothing Then xlApp.Quit
End Sub
Range / Cellsでセルを指定して書き込む方法
Rangeは「A1」などのセル番地で指定できるので、レイアウトが決まっているExcelに出力するときに便利です。
コード②:Range / Cells の違いが分かる例
Option Compare Database
Option Explicit
‘RangeとCells:指定方法の違いが分かるサンプル
Public Sub Excel_Cell_Spec_Range_And_Cells()
Dim xlApp As Object
Dim xlBook As Object
Dim ws As Object
Dim i As Long
On Error GoTo EH
Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = True
Set xlBook = xlApp.Workbooks.Add
Set ws = xlBook.Worksheets(1)
‘【Range】文字列で直感的に指定(例:A1, B2)
ws.Range(“A1”).Value = “Rangeで指定”
ws.Range(“B1”).Value = “Cellsで指定”
ws.Range(“A2”).Value = “A2 は Range(“”A2″”)”
‘【Cells】行・列番号で指定(Cells(行, 列))
‘ 2行目2列目 = B2
ws.Cells(2, 2).Value = “B2 は Cells(2,2)”
‘ループで行を増やすならCellsが便利
For i = 1 To 10
ws.Cells(i + 3, 1).Value = “行 ” & (i + 3) & ” / 列 A”
ws.Cells(i + 3, 2).Value = “行 ” & (i + 3) & ” / 列 B”
Next i
MsgBox “Range/Cells の書き込み例を作成しました。”, vbInformation
Exit Sub
EH:
MsgBox “エラー: ” & Err.Number & vbCrLf & Err.Description, vbExclamation
End Sub
Cellsでセルを指定して書き込む方法
Cellsは、Cells(行, 列) という指定ができるので、Accessのデータを1行ずつ書き込む「表形式の出力」に向いています。
行番号を変えながら出力したい場合は Cells が特に便利です。
AccessのデータをExcelの指定セルへ出力する実例(Recordset)
ここからが実務で一番よく使う部分です。
Accessのクエリ/テーブルを読み込み、Excelの「開始セル」を決めて、見出し+明細を出力します。
※ サンプルでは qrySample を使用していますが、
実際には既存のクエリ名またはテーブル名に置き換えてください。
コード③:Access → Excelへセル指定で出力(見出し付き)
Option Compare Database
Option Explicit
‘Accessのクエリ/テーブルを、Excelへセル指定で出力(見出し+明細)
Public Sub Access_To_Excel_CellOutput()
Dim xlApp As Object
Dim xlBook As Object
Dim ws As Object
Dim rs As DAO.Recordset
Dim db As DAO.Database
Dim startRow As Long, startCol As Long
Dim r As Long, c As Long
Dim savePath As String
On Error GoTo EH
‘出力開始セル(ここを変えれば「セル指定」になる)
startRow = 3
startCol = 2 ‘B列
savePath = CurrentProject.Path & “\access_to_excel_cell_output.xlsx”
Set db = CurrentDb
Set rs = db.OpenRecordset(“qrySample”, dbOpenSnapshot) ‘←ここを変更(クエリ/テーブル名)
Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = True
Set xlBook = xlApp.Workbooks.Add
Set ws = xlBook.Worksheets(1)
‘タイトルなど(固定セルに出す例)
ws.Range(“A1”).Value = “AccessデータのExcel出力(セル指定)”
ws.Range(“A2”).Value = “出力日時: ” & Format(Now, “yyyy/mm/dd hh:nn:ss”)
‘見出し行(フィールド名)
c = 0
Dim f As DAO.Field
For Each f In rs.Fields
ws.Cells(startRow, startCol + c).Value = f.Name
c = c + 1
Next f
‘データ行
r = 1
Do Until rs.EOF
c = 0
For Each f In rs.Fields
ws.Cells(startRow + r, startCol + c).Value = Nz(f.Value, “”)
c = c + 1
Next f
r = r + 1
rs.MoveNext
Loop
‘見栄え(任意)
ws.Columns.AutoFit
xlBook.SaveAs savePath
xlBook.Close SaveChanges:=False
xlApp.Quit
rs.Close
Set rs = Nothing
Set db = Nothing
Set ws = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
MsgBox “保存しました: ” & savePath, vbInformation
Exit Sub
EH:
MsgBox “エラー: ” & Err.Number & vbCrLf & Err.Description, vbExclamation
On Error Resume Next
If Not rs Is Nothing Then rs.Close
If Not xlBook Is Nothing Then xlBook.Close SaveChanges:=False
If Not xlApp Is Nothing Then xlApp.Quit
End Sub
Excelファイルを保存して閉じる方法(ポイント)
コード①と③では、基本的に以下の流れで後処理をしています。
SaveAsで保存Closeでブックを閉じるQuitでExcelを終了
長時間使う処理ほど、「Excelが残ってしまう」問題が起きやすいので、エラー時にも終了処理が走るようにしておくのが重要です。
よくあるエラーと対処
クエリ名が存在しない:
qrySampleを実在するクエリ/テーブル名に変更Excelが残る:エラー時の
Quitが走るようにOn Error GoTo EHを維持保存先に権限がない:
CurrentProject.Pathを変更、または保存先フォルダを見直す
関連リンク(任意)
Accessでフォルダ内のファイル名を一覧取得し、Excelへ出力する方法【VBA】
Access VBA|Excelの列を選択してインポートできるフォームの作り方
まとめ
Access VBAを使えば、Excelを起動してセルを指定しながら柔軟にデータを書き出すことができます。
本記事では、Access VBAからExcelを操作し、Range・Cellsを使って指定したセル位置へ値を書き込む方法を解説しました。
ポイントは次の通りです。
Excel操作は「起動 → 書き込み → 保存 → 終了」が基本
Rangeはセル番地で指定したい場合に便利
Cellsは行番号を変えながら出力する処理に向いている
Accessのデータ(クエリ/テーブル)も指定セルから一覧出力できる
セル指定での出力を覚えておくと、帳票作成や一覧管理など、AccessとExcelを連携した作業の幅が大きく広がります。

