#432 Excelセルへ個別出力する基本パターン VBA

Accessでは、エクスポートの機能やOffice Linksの機能を使うことによって、テーブルやクエリのデータをExcelのワークシートとして出力することができます。しかし、Excelの特定のセルをめがけてデータを当てはめていきたいときや、セルの書式設定などのExcel上の操作を行うには、VBAを使ってExcelオブジェクトを操作する必要があります。
ExcelにもVBAがあり、Excel上の細かな操作が可能となっています。そのExcel VBAのコードをAccess VBAから実行することによって、Accessから細かいExcelの操作が実現できます。

ここでは、そのもっとも基本的なパターンとして、テーブルのデータをそのままExcelのワークシート上に展開する方法を例示します。

以下のコードを実行することによって、Excelが起動され、新しいブックのワークシートにテーブルのフィールド名と全レコードのデータが出力されます。With xls〜End Withで囲まれた部分は基本的にExcel VBAのコードが中心となっています。ここにさまざまなExcel VBAのコードを応用していけば、より細かい処理も可能となります(セル書式の設定などは当然のことながら、ブック全体の保存などの処理も必要であればここに記述します)。

Dim dbs As Database
Dim rst As Recordset
Dim intRow As Integer
Dim intCell As Integer
Dim xls As Object

'仕入先テーブルを開く
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("仕入先")

'Excelオブジェクトを生成
Set xls = CreateObject("Excel.Application")
With xls
  '画面の再描画を抑止
  .ScreenUpdating = False
  '新しいブックを追加
  .workbooks.Add

  '1行目に列見出し(フィールド名)をExcelに出力
  intRow = 1
  For intCell = 1 To rst.Fields.Count
    .Cells(intRow, intCell).Value = rst.Fields(intCell - 1).Name
  Next intCell

  '各レコードをExcelに出力
  intRow = 2
  Do Until rst.EOF
    For intCell = 1 To rst.Fields.Count
      .Cells(intRow, intCell).Value = rst.Fields(intCell - 1)
    Next intCell
    intRow = intRow + 1
    rst.MoveNext
  Loop
  rst.Close

  '列幅のジャストフィット
  .Cells.Select
  .Cells.EntireColumn.AutoFit
  'A1セルだけを選択状態にする
  .Range("A1").Select
  '画面の再描画を元に戻す
  .ScreenUpdating = True
  'Excelを可視状態にする
  .Visible = True

End With
Set xls = Nothing


実行結果の例:
実行結果の例

注意事項:
  • AccessからExcelオブジェクトを生成しただけでは、Excelは目に見えない状態にあります。そのため、「.Visible = True」のコードを実行してExcelを可視状態にする必要があります。ただし、Accessのエクスポートのように、Excel自体を表示させる必要がなく、データ出力後にブックをそのまま保存して終了させたいような場合にはこのコードは不要です。
  • もし「.Visible = True」を先に実行したあとにセルへの出力を行うような手順の場合、「.ScreenUpdating = False」のコードを実行しないと、セルに1つ1つデータがはめ込まれていく様子がよく分かります。ただし、その都度画面の再描画が行われるため、非常に処理時間が延びてしまいます。
  • Excel VBAのマクロの記録などで作ったコードをここに応用する場合、Excel VBAのコードの前には必ず「.」を付けるよう注意します。たとえば、Excelでは「Cells.Select」というコードは、Access VBA上では「.Cells.Select」(実際にはWithを使っているので"xls.Cells.Select"という形)とします。
  • セルの番号は1から始まります。一方、テーブルのフィールド番号は0から始まります。「rst.Fields(intCell - 1)」などの配列内の添え字に留意してください。
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved