VBAを使用して抽出結果をExcelへ出力する方法

このQ&Aのポイント
  • VBAを使用して抽出結果をExcelへ出力する方法についてご教授ください。
  • 抽出結果の見出し(フィールド名)も一緒に出力する方法を教えてください。
  • 毎回フィールド名を取得し、見出しとして出力する方法についてアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

Access 抽出結果をExcelへ出力

お世話になります。 VBAより抽出結果をExcelへ出力したいと思います。 とりあえず、抽出結果をExcelの特定の箇所へ出力することは 出来たのですが、今回は見出し(フィールド名)もあわせて出力 したいところです。 見出しの部分を出力するにはどうすればよいのでしょうか。 恐らく見出し部分と抽出結果部分はそれぞれ別々に出力 しなければならないとは思うのですが。。 なお、見出し部分は固定の文字列ではないため、毎回フィールド名を 取得し、それを見出しとして出力する必要があります。 抽出結果(集計クエリ)は、 項目 yyyy年mm月 ・・・・ yyyy年mm月 数量A      500   ・・・・    1200        数量B      200   ・・・・     800 というような感じで、現在は 数量A      500   ・・・・    1200        数量B      200   ・・・・     800 の部分だけ出力できている状況です。 Dim obj As Object Dim MyDB As DAO.Database Dim MyRs As DAO.Recordset MySQL = SQL文(集計クエリ) Set MyRs = MyDB.OpenRecordset(MySQL) obj.Worksheets(シート名).Select obj.Application.Cells(23, 1).CopyFormRecordset MyRs 上記でExcelへ出力してます。 ご教授の程、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

以下 ★ 部分を追加してみてどうなりますか Set MyRs = MyDB.OpenRecordset(MySQL) obj.Worksheets(シート名).Select For i = 0 To MyRs.Fields.Count - 1 ' ★   obj.Application.Cells(22, i + 1) = MyRs(i).Name ' ★ Next ' ★ obj.Application.Cells(23, 1).CopyFormRecordset MyRs ※ これ動いていました? CopyFormRecordset のスペルは CopyFromRecordset なのでは? (そのままにしておきますけど) GetObject した環境ですけど > obj.Worksheets(シート名).Select これ、オートメーションエラーになりませんでした? (Vista+2007 の環境ですけど) エラーになっていなければそれはそれで・・・ obj.Worksheets(シート名).Activate はエラーなく動くようですが・・・ ※ obj.Application.Cells(23, 1) の部分は、 わざわざ obj.Application でトップに行かなくても? Application.Cells 記述では、 アクティブブック・アクティブシートが隠れているだけで・・・ obj の正体はブックでしょうか? (以下の様にトップに行かずに obj から辿った方が良さそうに思いますけど) Set MyRs = MyDB.OpenRecordset(MySQL) With obj.Worksheets(シート名)   .Activate   For i = 0 To MyRs.Fields.Count - 1 ' ★     .Cells(22, i + 1) = MyRs(i).Name ' ★   Next ' ★   .Cells(23, 1).CopyFormRecordset MyRs End With

naoto0216
質問者

お礼

ご回答ありがとうございます。 >CopyFormRecordset のスペルは CopyFromRecordset なのでは? 記載ミスです。すみません。 色々調べてみて、理解しない状態でツギハギしながら作成しました。。 なので、おかしな部分が多々あるかと思います。 とりあえず現状はエラーは出ておりませんが、追々精査したいと 思います。ご指摘ありがとうございました。 見出しについてですが、こちらに質問を投稿しつつ自力でしらべて 出力できるようになりました(30246kikuさまの方法とほぼ同じ)。 ありがとうございました。

その他の回答 (2)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No1です。抜け落ちが、 For I = 0 to MyRs.Fields.Count - 1 obj.sheets(シート名).Cells(1,i+1) = MyRs.Fields(i).Name Next i ですね。セルの指定も反対になっていました。

naoto0216
質問者

お礼

piroin654様 いつもご回答ありがとうございます。 こちらへ質問を投稿しつつ、自力で調べてなんとか 出力できるようになりました。 方法としては、piroin654様のやり方とほぼ同じです。 ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

クエリのフィールド名を取り出し、それを指定の 位置から順に貼り付けていくという手順になるかと。 たとえば、A1から貼り付ける場合は、 For I = 0 to MyRs.Fields.Count - 1 obj.sheets(i+1,1) = MyRs.Fields(i).Name Next i のような感じ。 obj.Worksheets(シート名).Select のあとに。

関連するQ&A

  • Access Excelへ出力時にエラー

    お世話になります。 下記にてローカルクエリの抽出結果をExcelへ出力しております。  Dim obj As Object  Dim MyDB As DAO.Database  Dim MyRs As DAO.Recordset  Dim qdf As DAO.QueryDef  Dim out_path as String  Dim sheet_name as String  out_path = "出力先ファイルのフルパス(ファイル名含む)"  sheet_name = "出力先シート名" Set MyDB = CurrentDb Set obj = GetObject(out_path, "Excel.Sheet") obj.Application.Visible = False obj.Parent.Windows(1).Visible = True Set qdf = MyDB.QueryDefs("ローカルクエリ名") With qdf .Parameters("[forms]![test]![id]") = Forms!test!id Set MyRs = .OpenRecordset .Close End With obj.Worksheets(sheet_name).Select   ← (注) obj.Application.Cells(24, 1).CopyFromRecordset MyRs ※ローカルクエリの抽出条件としてフォーム上のテキストボックスを  参照しているため、Parametersを使ってます。 とりえあず上記で抽出結果は出力されます。 但し、適当なExcelファイルを開いた状態で実行すると、(注)の箇所で 「実行時エラー1004 WorksheetクラスのSelectメソッドが失敗 しました」となってしまいます。 なお、Selectの箇所をActiveにすると「実行時エラー438 オブジェクトは このプロパティまたはメソッドをサポートしていません。」と表示されます。 また、obj.Application.Visible = False の箇所で開いていた Excelファイルが閉じてしまうのですが、そういうものなのでしょうか。 勉強不足で大変恐縮ですが、ご教授の程、宜しくお願い足します。

  • エクセルからアクセスへ

    お世話になります。 エクセルからVBAでアクセスのテーブルに レコードを追加させたいのですが、 下記の記述でいきなり mydb as database の所が 青く塗られ 「コンパイルエラー:ユーザー定義型は定義されていません」 とエラーになってしまします。 また、databaseのdが小文字なのも気になります。 参照設定での項目チェックが必要なんだと思うのですが どこにチェックしたら良いのか、またそれだけではダメなのか 分かりません。 どなたかご教授下さい。     記 Dim mydb As database Dim myrs As Recordset Dim myrnge As Range Dim myrow As Long

  • ACCESS2007でのDAO(?)につきまして

    お世話になっております。 ACCESSの件で色々教えて頂き、とても感謝しております。 つきましては、ACCESS2007で疑問に思える点がありましたので 以下に記述いたします。 あるACCESS2007のVBAの記述で Dim myDB As Database Dim myQueryDef As QueryDef なる変数定義がされているのを見たのですが 質問があります <質問1> 上記の定義はDAOを使用しているという事になるのでしょうか? <質問2> DAOであるならば Dim myDB As DAO.Database Dim myQueryDef As DAO.QueryDef と記述するのが正しいのではないでしょうか? (Option Explicitは記述してあります) 私には謝った記述に見えるのですが、動作 している理由がわかりません。 質問が変かもしれませんが、どなたか教えて 頂けるありがたいです。

  • Access クエリ抽出結果をExcel(特定フォーム)に出力させたい

    いつもいつもお世話になっております(><) 今までこちらで色々質問しながら、 「条件入力フォームで入力した条件で、レコードを条件抽出し、この抽出結果をフォームに出力、かつ、伝票発行する」 というシステムを作っています。 今、伝票発行の部分で、下記のようなプロシージャを組みました。 そして、下記★(コード内参照)の2点で詰まっています。 ★1 指定しているクエリは抽出結果のフォームなのですが、これが「SQLステートメントが正しくありません」となります。どうしてでしょうか。ちなみに実在する別のクエリ名にすると、一応動きます。 ★2 フォーム上に抽出されたレコードがEOFになるまで、というループ条件にしたいのですが、この部分の記述は正しいでしょうか。 いつも初心者的質問で恐縮です。 どうぞよろしくお願い致します。 --------------------------------------------- Option Compare Database Private Sub 伝票発行_Click() Dim db As ADODB.Connection Dim rs As ADODB.Recordset Dim app As Object Dim wb As Excel.Workbook Dim iRow As Long Dim iColm As Long '■初期化 iRow = 12 iColm = 1 '■確認 If MsgBox("伝票を出力します。", vbOKCancel) = vbOK Then '■DBコネクション Set db = CurrentProject.Connection '■レコードセットの取得 Set rs = New ADODB.Recordset rs.Open "受注集計クエリ_f", db, adOpenStatic, adLockReadOnly '★1 '■Excelアプリの起動及びファイルオープン Set app = CreateObject("Excel.Application") app.Workbooks.Open filename:=CurrentProject.Path & "\nouhinsyo.xls" '■Excelシート名指定 app.Worksheets(1).Select Do Until rs.EOF '★2 ws.Cells(iRow, iColm + 2) = rs("品番") ws.Cells(iRow, iColm + 3) = rs("商品名") ws.Cells(iRow, iColm + 4) = rs("受注数の合計") ws.Cells(iRow, iColm + 8) = rs("備考") rs.MoveNext iRow = iRow + 1 Loop MsgBox "発行完了。" End If rs.Close app.Quit 'エクセルセッションをクローズする。 Set ws = Nothing '変数の初期化 Set wb = Nothing '変数の初期化 Set app = Nothing '変数の初期化 Set db = Nothing End Sub

  • DAOでテーブルの内容を検索したいのですが…

    DAOでテーブルの内容を検索したいのですが… アクセス初心者です。 フォームで取得した値をテーブルで検索して命令するために,次のようなことをしてみましたが,FindFirstのところでエラーがでます。 どうしたらよいのかご指導ください。 コマンドボタンのイベントプロシージャで Private Sub テストテーブル作成_Click() Dim gakki As Integer Dim test As Integer Me.学期 = gakki Me.テスト = test Call testテーブル作成 End Sub として,標準モジュールに Sub testテーブル作成() Dim myDB As DAO.Database Dim myRS As DAO.Recordset Set myDB = CurrentDb Set myRS = myDB.OpenRecordset("T_生徒テスト") myRS.FindFirst "学期ID=" & "" & "gakki" & "" & "AND テストID =" & "" & "test" & "" If myRS.NoMatch = False Then DoCmd.OpenQuery "Q_TSテストA" DoCmd.OpenForm "F_テスト" DoCmd.Close Else DoCmd.OpenQuery "Q_TSテスト" DoCmd.OpenQuery "Q_テスト" DoCmd.Close DoCmd.OpenForm "F_テスト" End If myRS.Close: Set myRS = Nothing myDB.Close: Set myDB = Nothing End Sub としました。よろしくお願いします。

  • 如何したら良いのか分かりません。

    Access2000/Windows2000を使用してます。 車検到来年を自動計算させようとしてます。 現在よりも小さい場合は、車検到来区分によって現在の日付以上になるように計算させるようにしたいのですが・・・ 以下の組み方ではうまく出来ません。如何したら良いのかアドバイス宜しくお願い致します。 Private Sub コマンド233_Click() Dim MyDB As DAO.Database Dim MyRS As DAO.Recordset Dim strDate As String Dim strSyakenDate As String '現在の年月日を退避しておく strDate = Format(Date, "yyyymmdd") Set MyDB = CurrentDb() Set MyRS = MyDB.OpenRecordset("基保有") Do Until strSyakenDate > strDate Select Case MyRS.Fields("車検到来区分") Case 1 MyRS.Fields("車検到来年") = MyRS.Fields("車検到来年") + 2 Case 2 MyRS.Fields("車検到来年") = MyRS.Fields("車検到来年") + 1 Case 3 MyRS.Fields("車検到来年") = MyRS.Fields("車検到来年") + 2 Case 4 MyRS.Fields("車検到来年") = MyRS.Fields("車検到来年") + 1 End Select '車検日を再算出 strSyakenDate = Format(MyRS.Fields("車検到来年"), "0000") & Format(MyRS.Fields("車月"), "00") & Format(MyRS.Fields("検日"), "00") Loop MyRS.Update MyRS.MoveNext MyRS.Close End Sub

  • AccessでのSQL文

    AccessでSQL文を使おうと思うのですが、 Dim mydb as Database とすると、ユーザ定義型は定義されていません とエラーになります。 また、mydb as と打つと変数の方の一覧が出ますがその中にもDataBaseがありません。 サンプルの家計簿を開いてみるとSQL文を使っているのにエラーは出ません。 ヘルプを見てみるとDAOが関係しているようなのですが良くわかりません。 AccessでDatabase型を使うにはどうすればいいのでしょう。 教えてください。 Access2000です。

  • クロス集計の結果をレポート出力したい

    ACCESS2002です。 クロス集計の結果をレポートに出力したいのですが、 クロス集計ないので条件によって列数が可変です。 その列が1ページに収まる場合は良いのですが、 おさまらない場合は、改ページして続きを 出力することは可能ですか。 その際には、クロス集計の行見出しとしている 部分は、固定で表示したいのですが。 1ページ目 商品名   1/1     1/2   1/3   ・・・ AAA     0      1    2 BBB     2      3    5 2ページ目 商品名   1/10     1/11   1/12   ・・・ CCC     0      1    2 DDD     2      3    5 上記の例では、商品名が行見出しに設定されていて、 日付が列見出しになっています。 1ページ目には10日分のデータしか出力できないので、11日目以降は 2ページ目表示したいのです。 可能でしょうか? よろしくお願いいたします。

  • ACCESSでExcelにデータ出力、高速化

    ACCESSのVBAを使ってテーブルのデータを 既存ブックに出力し、別名で保存をしたいのですが、 どうも、処理が遅くて困っています。 改善点がありましたら教えてくださいお願いいたします。 Dim objExcel As Excel.Application Dim xlWrkbk As Excel.Workbook Dim xlWrksh As Excel.Worksheet Dim rs As DAO.Recordset Dim strFilename As String strFilename = CurrentProject.Path & "既存ブック名.XLS" Set objExcel = New Excel.Application Set xlWrkbk = objExcel.Workbooks.Open(Filename:=strFilename, ReadOnly:=True) Set xlWrksh = xlWrkbk.Worksheets("シート名") Set rs = CurrentDb.OpenRecordset("テーブル名", dbOpenSnapshot) With objExcel xlWrksh.Range("A:N").Clear xlWrksh.Range("A2").CopyFromRecordset rs xlWrkbk.SaveAs Filename:=CurrentProject.Path & "新しいブック名.xls" xlWrkbk.Close .Quit rs.Close End With Set rs = Nothing Set objExcel = Nothing Set xlWrkbk = Nothing Set xlWrksh = Nothing

  • エクセルでDAO 参照設定は?

    エクセルでDAOを使う場合、 参照設定はどれにチェックを付ければいいのでしょうか? Dim db As DAO.database の宣言部分でエラーになってしまいます。