Access

AccessからVBAでEXCELへ帳票出力する

AccessからExcelへ
記事内に商品プロモーションを含む場合があります

Accessから帳票を出力する一番一般的な方法は、Accessのレポートを使う方法です。

この方法の弱点はレポートの細かい編集が面倒だという点と、出力した形で保存できないという点です。(PDF形式で出力すれば保存は可能ですが・・・)

このため、AccessからExcelファイル形式で帳票を出力したいというニーズはかなり多くあります。

今日はAccessからVBAを使ってExcelファイルへ帳票ファイルを出力する方法をご紹介します。

個人の環境下で検証しておりますのでお使いの環境やデータによって正常に動作しない恐れもあります。サンプルはご自由にお使いいただいて結構ですが自己責任でご利用をお願いいたします。

AccessからExcelへファイルを出力する方法

VBAを使ってACCESSからEXCELにファイル出力する方法はいくつかあります。
用途に応じて使い分けて使ってください。

  • Accessのエクスポートを利用して出力する
  • レコードセットを新しいEXCELファイルに貼り付ける
  • 体裁を整えたテンプレートファイルへレコードセットを出力する
  • 1行ずつデータを加工しながら出力する

スポンサーリンク

Accessのエクスポートを利用して出力する

一番簡単な方法です。
ACCESSのエクスポート機能を使って所定のファイルに出力します。

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, テーブル名(クエリー名), 出力ファイル名(フルパス), True, “”

第5引数 ヘッダーを出力する場合はTrue, 不要の場合はFalse
第6引数 インポートのときのみシート名を指定します。エクスポート時は指定不要

ただし、エクスポートする対象として指定できるのは、テーブル名またはクエリー名です。
このため、何らかの条件を指定してエクスポートしたい場合は、予めクエリーに条件値をセットしておく必要があります。

※一旦ワークテーブルに出力してからエクスポートする方法もあります。

また、ただ出力するだけなのでファイルの体裁を整えるような細かな制御はできません。

スポンサーリンク

レコードセットをEXCELファイルに貼り付ける

こちらは取得したレコードセットの値をEXCELファイルに貼り付ける方法です。

データをまとめて一覧形式で出力する場合はこの方法が便利です。

レコードセットをEXCELに出力するサンプルコード

サンプルコードの解説

処理の概要

ADOのレコードセットをADOのCopyFromRecordsetメソッドを利用し、ワークシートの指定されたセルに貼り付けます。

今回のサンプルプログラムはあらかじめ決められたファイル名でEXCELファイルを保存して終了します。

出力先ファイル名

ファイルのフォルダや先頭の文字列はcsOutPutFileNameとして事前に定義してあります。

(例)Private Const csOutPutFileName = “C:\work\EXCEL出力”

これにアンダーバー+今日の日付を追加する設定です。

出力先:C:\work\EXCEL出力_yyyymmdd.xlsx

フィールド名(見出し)出力

CopyFromRecordsetメソッドはデータを出力するメソッドなので見出し行は含まれません。

このため、見出し行は別途出力する必要があります。

レコードセットのカラム数分ループしながら1行目に見出しとしてフィールド名をセットします。

列幅自動調整

おまけです。

ただ出力すると全項目の列幅が規定値になってしまい見づらいので、一気に列幅を調整できるEntireColumn.AutoFitを実行しています。

スポンサーリンク

体裁を整えたテンプレートファイルへデータを出力する

新しいEXCELファイルではなく、あらかじめ用意したEXCELの雛形(テンプレート)にデータを出力することもできます。

この方法の利点は体裁を整えた形に出力するので、出力後加工なしでお客様に提出したり印刷したりできる点です。

Excelの雛形はできればテンプレート形式をおすすめします。(xltx, xltmなど)

テンプレート形式は通常のファイルとは異なり、開く操作をすると自分自身ではなく、そのコピーを開くようになっています。

コピーされたファイル名には「テンプレート名1」や「テンプレート名2」といった形で自動的に数字が付き、そのまま保存操作をしても元のテンプレートに上書きしてしまうことがありません。

つまり、ひな形であるファイルをうっかり上書きしてしまうといったミスを防ぐことができます。

テンプレートファイルを作る

まず「テンプレート.xltx(または.xltm)」ファイルを作成しましょう。(保存する際の拡張子を.xltxまたは.xltmにしてください。)

デザインは自由に作成してください。

テンプレートファイルに出力するサンプルプログラム

サンプルコードの解説

処理の概要

先の「レコードセットをEXCELに貼り付ける」と異なる点は、出力先があらかじめ用意したEXCELのテンプレートファイルであるという点です。

テンプレートはAccessファイルがあるフォルダと同じフォルダに用意しEXCEL起動時にテンプレートファイルを指定します。

ヘッダーをテンプレートに記述しておけるのでレコードセットデータを貼り付けるだけです。

テンプレートファイル名

テンプレートファイル名はcsOutputTemplateとして事前に定義してあります。

(例)Private Const csOutputTemplate= “テンプレート.xltx”

Accessファイルのカレントフォルダ(Application.CurrentProject.Path)にテンプレートファイルが存在しない場合はエラーとなります。

フィールド名(見出し)

今回はテンプレートの1行目に見出しを記述していますので、2行目からデータを貼り付けます。

レコードセットの取得フィールドとテンプレートの見出しフィールドは完全一致している必要があります。

CopyFromRecordsetメソッドを利用する場合はレコードセットを取得する際にテンプレートと合わせて置きましょう。

スポンサーリンク

1行ずつデータを加工しながら出力する

これまでCopyFromRecordsetメソッドを使ってレコードセットの全てのデータを所定の位置に出力する方法をご紹介してきました。

実際はレコードセットのデータによって出力を出し分けたり、もっと細かい処理が必要な場合もあります。

そういった場合は、以下のようにレコードセットを1行ずつ処理しながら所定のセルに値をセットすることもできます。

'1行ずつ処理
If Not myRs.EOF Then
    myRs.MoveFirst
    Dim rowcnt As Integer
    rowcnt = 2
    While Not myRs.EOF
        '1列目にフィールドA
        .Cells(rowcnt, 1) = myRs.Fields("フィールドA")
        '2列目にフィールドB
        .Cells(rowcnt, 2) = myRs.Fields("フィールドB")
        rowcnt = rowcnt + 1
        myRs.MoveNext
    Wend
End If

\逆引き辞書があると便利です/
[itemlink post_id=”1386″]

ABOUT ME
アズビーパートナーズ
プログラマー→社内SE→SIerのお仕事をしています。 メーカー勤務を経て、中小企業の社内SE、フリーランスなど様々な形態で働いてきました。 業務上生まれた困った…を解決してきたTipsを備忘録も兼ねて公開しています。 困っている誰かのお役に立てれば幸いです。