いつもお世話になります
hatenaさまのサイトで、印刷プレビューに[印刷][閉じる]ボタンを付加する関数https://hatenachips.blog.fc2.com/blog-entry-404.html
を参考にさせていただきました
このフォームに EXCEL出力 のコマンドボタンを追加して プレビューされたデータをEXCELデータとして取り込みしたいです
コマンドボタンのクリック時のコードは 別サイトで見て書いてみました
Dim strsql As String
Dim strFileName As String
Dim xlapp As Object
Dim myCn As New ADODB.Connection
Dim myRs As New ADODB.Recordset
Dim colcnt As Integer
Dim csOutputFileName As AccessObject
On Error GoTo Err_Exit
'ファイル名作成
strFileName = csOutputFileName & "_" & Format(Date, "yyyymmdd") & ".xlsx"
'EXCELアプリケーションを起動
Set xlapp = CreateObject("Excel.Application")
Set myCn = CurrentProject.Connection
strsql = "SELECT * FROM テストテーブル"
'レコードセットオープン
myRs.Open strsql, myCn, adOpenForwardOnly, adLockReadOnly
With xlapp
'セットする過程が見えないよう一旦不可視
.Visible = False
'新しいBookを追加
.Workbooks.Add
.Worksheets("Sheet1").Select
'レコードセットのフィールド名(見出し)出力処理
For colcnt = 0 To myRs.Fields.Count - 1
.Worksheets("Sheet1").Cells(1, colcnt + 1).Value = myRs.Fields(colcnt).Name
Next
'結果値出力処理(1行目はヘッダーなので、2行目1列目からセット
.Cells(2, 1).CopyFromRecordset myRs
'列幅自動調整
.Cells.EntireColumn.AutoFit
'完了したら保存
.ActiveWorkBook.SaveAs FileName:=strFileName
MsgBox "出力しました。", vbOKOnly + vbInformation
End With
Set myRs = Nothing: Close
Set myCn = Nothing: Close
'Excelを終了します
xlapp.Quit
Exit Sub
Err_Exit:
MsgBox Err.Number & ":" & Err.Description, vbOKOnly + vbCritical, "OutputExcel()"
Set myRs = Nothing: Close
Set myCn = Nothing: Close
xlapp.Quit
こんな感じでできると思いますが
途中の strsql = "SELECT * FROM テストテーブル"の箇所を
Report.RecordSource にしたいのですが できるのでしょうか?
また、どのように書けばよいのかわかりません
ご指導お願いいたします
ブログのコメント欄でも書きましたが、OutputToメソッドを使えば1行で済みますが、それではうまくいかなかったのでしょうか。
CurrentDb.QueryDefs(Me.RecordSource).SQL
OutputToメソッドやTransferSpreadsheetメソッドでは駄目なのでしょうか?中には非推奨とするサイトもあるようですが、鵜呑みにせずに本当に駄目なのか慎重に判断でましょう。
コーディングの是非もありますが、Excelエクスポートの是非も気になります。そもそも、AccessとExcelの業務連携の必要性、何の為にAccessを導入しているのかと。
参考にするなら、下記サイトなんかはどうでしょう?
hatenaさま お返事ありがとうございます
hatenaさまの「F_PreViewChildMenu」のフォームはありとあらゆるレポートの出力に利用させてもらっています
そのため OutputTo acReport ”レポート名” では 「F_PreViewChildMenu-1」 「F_PreViewChildMenu-2」といったように その特定のレポートごとにフォームを作らなくてはなりません、なので現在ひらいているレポートのレコードを取りたかったのです
りんごさま お返事ありがとうございます EXCELはACCESSで加工されたデータを、その時だけに必要な集計表や煩雑なレポートを作成するために利用しております
CurrentDb.QueryDefs(Me.RecordSource).SQL ありがとうございます フォーム上でのエクスポート設定を読んで勉強させていただきます
ありがとうございます
F_PreViewChildMenu のTagプロパティにレポート名が格納されている仕様になってます。
よって下記のようなコードで共通に使えます。
レポートのレコードソースがテーブルかクエリなら、DoCmd.TransferSpreadsheet が使えます。
わさわざ質問のような面倒なコードを使う必要性はないです。
その場合も、レポート名は、Me.Tagで取得できます。
ただし、レポートを開く時にフィルターをかけていたり、並べ替えを設定していたりすると、それが反映されないので、それを反映させたい場合はまた、面倒なことになります。
hatenaさま ありがとうございます
勉強不足ですみませんでした
acReport, Me.Tag をそのまま使えばよかったのですね
難しく考えすぎていました OutputTo で対応いたします
本当にありがとうございました
いつもお世話になります
レポートのレコードソースを取得する方法を教えていただきましたが
DoCmd.OutputTo acReport, Me.Tag, acFormatXLS, では
現在出力しようとしているオブジェクトの型式は無効ですのエラーがでます
acReportを acOutputReportにしても acFormatXLS を acOutputXlsにしてもだめでした
acOutputReportではダメで acOutputTableでは出力されます
なぜでしょうか?
ちなみに ACCESS2007です
2007 Office スイート Service Pack でアップデートしなくてはだめなのでしょうか?