閉じる

サンプル2(実用的)テーブルのデータをそのままExcelのワークシート上に展開する方法


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)」などの配列内の添え字に留意してください。 

'-------------------------------------------