AccessからExcelを操作したいけれど、
・正しい書き方が分からない
・セルの書式や罫線をVBAでどう指定するか知らない
・独学でコードを書いていて不安
・Excelのバージョン違いでエラーになることがある
こういった悩みは、現場でもよく聞きます。
この記事では、Access VBA から Excel を操作する方法を
「遅延バインディング(CreateObject)」に統一して解説します。
遅延バインディングは Excel のバージョンに左右されないため、
実務では最も安定して動作する方法です。
また、Excel の書式設定(フォント、色、罫線、配置、表示形式)を
“辞典のように一気に確認できる” ようにまとめました。
すべてコピペで動く形になっています。
まずは基本の Excel 起動から始めて、最後は
「Access のデータを Excel にきれいな表で出力する」
ところまで習得できます。
この記事でできること
-
Access VBA から Excel を正しく操作する方法がわかる
-
Excel の書式・罫線・表示形式を VBA で指定する方法を辞典的に学べる
-
すべて「遅延バインディング」でコピペして動く
-
Excel のバージョン差によるトラブルを避けられる
-
実務で使いやすい“正しい書き方”が身につく
AccessとExcelの連携方法(早期バインド・遅延バインド)
早期バインド(参照設定あり)
「Microsoft Excel XX.0 Object Library」を参照設定し、
Excel.Application として宣言する方法です。
メリット
-
IntelliSense(入力補完)が効く
-
定数(xlCenter など)が使える
-
一部の処理はわずかに高速
デメリット
-
Excel のバージョンが違うとエラーになる
-
複数バージョンが混在する職場では不向き
遅延バインド(この記事の標準)
参照設定を行わず、Object として宣言します。
Dim xlApp As Object
Set xlApp = CreateObject(“Excel.Application”)
メリット
-
どのExcelバージョンでも動きやすい
-
配布して使う場合に最適
-
実務の現場で最も採用される
デメリット
-
定数が使えない(数値指定が必要)
-
入力補完が効かない
この記事では、すべて遅延バインディングで書きます。
遅延バインディングでは Excel の定数が使えないため、
値(-4108 など)を直接指定します。
定数と値の対応表は以下の記事よりダウンロードできます。
Excel VBA 定数を一瞬で検索できる一覧ツール【Access・PDF無料】
AccessからExcelを起動する基本(遅延バインド)
Excelを起動して新しいブックを作成
Private Sub コマンド1_Click()
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Set xlApp = CreateObject(“Excel.Application”)
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
xlApp.Visible = True
End Sub
既存のExcelファイルを開く
Set xlBook = xlApp.Workbooks.Open(“C:\test\sample.xlsx”)
Set xlSheet = xlBook.Worksheets(1)
Excelを非表示で操作する(実務向け)
xlApp.Visible = False
帳票作成や大量出力のときに高速化できます。
Excelを終了する正しい方法(メモリリーク対策)
xlBook.Close False
xlApp.Quit
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
Excelのセルに値を書き込む(基礎)
A1に文字を書く
xlSheet.Range(“A1”).Value = “テスト”
xlSheet.Cells(1, 1).Value = “テスト”
A1〜A4(縦方向)に「テスト」
Dim i As Long
For i = 1 To 4
xlSheet.Cells(i, 1).Value = “テスト”
Next i
A1〜D1(横方向)に「テスト」
Dim i As Long
For i = 1 To 4
xlSheet.Cells(1, i).Value = “テスト”
Next i
With構文で読みやすくする
With xlSheet
.Cells(1, 1).Value = “ABC”
.Cells(1, 2).Value = “DEF”
End With
セルの書式設定(フォント)
基本例
With xlSheet.Cells(1, 1)
.Font.Name = “MS 明朝”
.Font.Size = 16
.Font.Bold = True
.Font.Color = RGB(255, 0, 0)
End With
セルの書式設定(塗りつぶし)
色
xlSheet.Cells(1, 1).Interior.Color = RGB(255, 255, 0)
パターン
xlSheet.Cells(1, 1).Interior.Pattern = 1 ‘xlSolid
xlSheet.Cells(1, 1).Interior.Pattern = -4126 ‘Gray75
セルの書式設定(配置)
横方向
xlSheet.Cells(1, 1).HorizontalAlignment = -4108 ‘中央
縦方向
xlSheet.Cells(1, 1).VerticalAlignment = -4108 ‘中央
折り返し・縮小表示
xlSheet.Cells(1, 1).WrapText = True
xlSheet.Cells(1, 1).ShrinkToFit = True
セル結合
縦書き
表示形式(NumberFormatLocal)
数値のカンマ区切り
xlSheet.Cells(1, 1).NumberFormatLocal = “#,##0”
小数点
xlSheet.Cells(1, 1).NumberFormatLocal = “#,##0.00”
マイナス赤表示
xlSheet.Cells(1, 1).Value = Format(Now, “yyyy/mm/dd”)
時刻
xlSheet.Cells(1, 1).Value = Format(Now, “hh:nn:ss”)
列幅・行の高さ
xlSheet.Columns(“A:A”).ColumnWidth = 15
xlSheet.Rows(“1:3”).RowHeight = 20
罫線(Borders)完全ガイド
上側・下側・左・右
xlSheet.Cells(1, 1).Borders(8).LineStyle = 1 ‘上
xlSheet.Cells(1, 1).Borders(9).LineStyle = 1 ‘下
xlSheet.Cells(1, 1).Borders(7).LineStyle = 1 ‘左
xlSheet.Cells(1, 1).Borders(10).LineStyle = 1 ‘右
ボックス罫線
xlSheet.Range(“A1:H10”).Borders.LineStyle = 1
Range を Cells で柔軟に指定
xlSheet.Range(xlSheet.Cells(1, 1), xlSheet.Cells(10, 8)).Borders.LineStyle = 1
Access→Excel 表作成の完全サンプル(実務用)
Private Sub コマンド0_Click()
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim DAT(6, 2)
Dim i As Long
Set xlApp = CreateObject(“Excel.Application”)
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
xlApp.Visible = True
‘ サンプルデータ
DAT(1, 1) = “AA”: DAT(1, 2) = 15000
DAT(2, 1) = “AB”: DAT(2, 2) = 8000
DAT(3, 1) = “AC”: DAT(3, 2) = 12000
DAT(4, 1) = “BA”: DAT(4, 2) = 7500
DAT(5, 1) = “CA”: DAT(5, 2) = 24000
DAT(6, 1) = “CB”: DAT(6, 2) = 6500
‘ 列幅・行高
xlSheet.Range(“A:D”).ColumnWidth = 9
xlSheet.Rows(“1:7”).RowHeight = 15
‘ セル結合
xlSheet.Range(“A2:A4”).Merge
xlSheet.Range(“A6:A7”).Merge
xlSheet.Range(“D2:D4”).Merge
xlSheet.Range(“D6:D7”).Merge
‘ 見出し
With xlSheet
.Cells(1, 1) = “区分”
.Cells(1, 2) = “分類”
.Cells(1, 3) = “数量”
.Cells(1, 4) = “合計”
.Cells(2, 1) = “A”
.Cells(5, 1) = “B”
.Cells(6, 1) = “C”
End With
‘ データ
For i = 1 To 6
xlSheet.Cells(i + 1, 2).Value = DAT(i, 1)
xlSheet.Cells(i + 1, 3).Value = DAT(i, 2)
Next i
‘ 合計計算
xlSheet.Cells(2, 4).Value = DAT(1, 2) + DAT(2, 2) + DAT(3, 2)
xlSheet.Cells(5, 4).Value = DAT(4, 2)
xlSheet.Cells(6, 4).Value = DAT(5, 2) + DAT(6, 2)
‘ 罫線
xlSheet.Range(“A1:D7”).Borders.LineStyle = 1
End Sub
Accessのテーブル・クエリ → Excel出力(実務向け)
最も安定する方法:TransferSpreadsheet
DoCmd.TransferSpreadsheet _
TransferType:=acExport, _
SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
TableName:=”T_売上”, _
FileName:=”C:\test\売上.xlsx”, _
HasFieldNames:=True
クエリに加工してから出力(推奨)
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _
“Q_売上加工済”, “C:\test\売上.xlsx”, True
Recordset を使う方法(中級者向け)
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(“SELECT * FROM T_売上”)
Dim r As Long: r = 2
Do While Not rs.EOF
xlSheet.Cells(r, 1).Value = rs!売上日
xlSheet.Cells(r, 2).Value = rs!担当
xlSheet.Cells(r, 3).Value = rs!金額
r = r + 1
rs.MoveNext
Loop
rs.Close
Access×Excel VBA の使い分け早見表
| 目的 | 推奨方法 |
|---|---|
| テーブル・クエリをExcelへ出力 | TransferSpreadsheet |
| 書式のある帳票を作りたい | 遅延バインドで書式指定 |
| データを加工して出力 | クエリで加工してから出力 |
| 1行ずつ細かく制御したい | Recordset → Cells |
まとめ
Access と Excel の連携は多くの方法がありますが、
この記事のように体系化すると 迷わず書けるようになります。
実務で30年使って分かったこと
VBAは理屈より、実際に動くコードを作って感覚で覚える部分が多いです。
独学でも十分に使い物になりますし、
何より「作りたいものを作れること」が一番重要です。
関連リンク
この記事以外にも、Access VBAでよくあるトラブルと解決方法をまとめた記事があります。
👉 Access VBAでよくあるトラブルと解決方法まとめ