Excelへのデータ転送メソッドの作成
最初に、クエリ結果の全レコードを一気にExcelに転送するプロシージャToExcel
を作成します。これは、引数を持たないSubプロシージャで宣言します。
Public Sub ToExcel() End Sub
Excelのインスタンスを作成する
まず、冒頭に、Excel
オブジェクトを格納する変数を宣言します。
Dim ex As Excel.Application
そして、CreateObject
関数でExcel
のインスタンスを作成します。引数のプログラムIDは「excel.Application」になります。
関数が無事Excel
のインスタンスを作成すると、オブジェクトへの参照を返してきますので、Setステートメントでオブジェクト変数ex
に格納します。これで、変数ex
を使ってExcelのすべてのオブジェクトをAccessから操作できるようになります。
Set ex = CreateObject("excel.Application")
CreateObject
関数はExcel
のインスタンスを作成するだけなので、Application
オブジェクトのVisible
プロパティにTrue
をセットして、Excel
を表示させます。
ex.Visible = True
クエリを実行するコードの作成
次に、プロパティQryName
設定されているクエリを実行します。この操作は、DoCmd
オブジェクトのOpenQuery
メソッドを使用します。
DoCmd
オブジェクトは、Accessのアクションを担当するオブジェクトで、アクションの実行はこのオブジェクトのメソッドで提供されています。
OpenQuery
メソッドは、そのアクションの1つ「クエリを開く」操作を実行するメソッドです。3つの引数を持ち、第1引数に実行するクエリ名、第2引数にクエリの実行形態を、第3引数に編集モードを指定します。ここでは、開くクエリ名にプロパティQryName
をあてて、実行時にクエリ名をセットするようにしています。また、このクラスはデータの取得を目的にしていますので、編集モードはacReadOnly
をセットし読み出し専用で開くようにします。
DoCmd.OpenQuery QryName, , acReadOnly
このメソッドを実行すると、クエリを開き、選択クエリの場合にはクエリ結果を表示します。
クエリ結果をExcelに転送する
クエリ結果をExcelに転送するには、DoCmd
オブジェクトのRunCommand
メソッドを使用します。このメソッドは、Accessに組み込まれているメニュー、またはツールバーのコマンドを実行します。引数に実行したいコマンド名を定数でセットします。
Accessの[ツール]メニューには、[Office Links]-[Excelに出力]というコマンドがあり、これを使うとクエリ結果をそのまますべてExcelに転送できます。
このコマンドを担当するのが、定数acCmdOutputToExcel
です。この値をRunCommand
メソッドの引数にセットしメソッドを実行すると、Excelに新しいブックを追加しクエリの結果セットをコピーします。
DoCmd.RunCommand acCmdOutputToExcel
Excelへの転送が終われば、クエリを閉じます。これは、RunCommand
メソッドの引数に定数acCmdClose
をセットして実行します。これは、Accessメニューの[ファイル]-[閉じる]と同じ働きを実行します。
DoCmd.RunCommand acCmdClose
これで、Excelへのデータ転送を実行するクラスのメソッドToExcel
のできあがりです。
ブックを保存する
次に、ブックを保存する処理を作成します。RunCommand
メソッドでExcelへの転送を行った場合は、作成されるブックはクエリと同じ名前のブック名が付けられます。このブックを保存するパス名も含め、独自のファイル名で保存したいので、専用のメソッドを用意しておきます。
この専用メソッドは、Excelのアクティブなブックを対象に、Workbook
オブジェクトのSaveAs
メソッドを実行します。引数に保存するブック名をフルパスで指定しますが、ここではクラスのプロパティSaveBookName
から値をオブジェクト取り出します。
SaveBookName
プロパティに何も設定されていない場合に備えて、エラー処理を組み込んでおきます。
If SaveBookName <> "" Then ex.ActiveWorkbook.SaveAs SaveBookName Else MsgBox "保存するブック名をSaveBookNameプロパティで設定してください" End If
最後に、使用したオブジェクト変数をメモリから開放します。
Set ex = Nothing