• 締切済み

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ファイルが閉じてしまうのですが、そういうものなのでしょうか。 勉強不足で大変恐縮ですが、ご教授の程、宜しくお願い足します。

みんなの回答

回答No.3

非常にこころもとない回答ですが、ちょっと調べてみました。 Dim XL As Object Dim BK As Object Dim SH As Object Set BK = GetObject("d:\DATA\123.xlsm", "Excel.sheet") Stop として止めておいてイミディエイトウィンドウで bk.worksheets(3).select はオートメーションエラーで失敗しました。 でも、 ?bk.worksheets(3).name や ?bk.worksheets("Sheet1").cells(1,1).value bk.worksheets(2).cells(1,1) = "ABC" と代入 は成功しました。 なので、この場合の BK はシートの集合体なのだろうと思います。 クラスには、Excel.Chart というのもあるので 図?に関しては別の扱いのような・・・???なので BK はブックの一部の様です。 bk.worksheets(3).select を成功させるためには Set XL = BK.Parent.Application XL.Windows(BK.Name).Visible = True bk.worksheets(3).select と2行追加で OK っぽい?です。? 確認するためには、Xl.Visible = true としてみました。 Excelの大元の『親』が必要のようです。 しかし、 bk.worksheets(3).activate は無くてもなぜ成功するのか? ヘルプ見ても謎は深まるばかり。。。

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

#1です 私も手詰まり状態になりつつありますが > >また、"Excel.Sheet" を指定しないとどうなりますか? >  ⇒ obj.Worksheets(sheet_name).Select の箇所で、「実行時エラー1004 >    WorksheetクラスのSelectメソッドが失敗しました」となりました。 これって、見出しがどうの・・・っていう質問での、私の Select エラーと同じ? Select する時って、表示している状態・・・これが絡むのでしょうか? Activate に変更してみてどうなりますか? GetObject(パス)、GetObject(,"Excel.Application") の様な使い方しかやっていなかった。 (だったら回答するなって・・・申し訳ございません) > 但し、その適当に開いていたファイルはobj.Application.Visible = False > の箇所で閉じてしまいます。 これは閉じているのではなく、表示上見えないだけ?だと思います。 Excel(obj.Applicaion)を非表示っていう指定ですよね。 タスクマネージャで見て、EXCEL.EXE が立ち上がっていませんか? > >> 適当なExcelファイルを開いた状態で > には、sheet_name に設定したシート名はある? >  ⇒ 適当に開いたExcelファイルに同じシート名は存在しません。 これなら、無いものを指定したのでエラーになって当然かと・・・ デバッグで、GetObject の次の行で止めて、 ウォッチウインドウで obj を追ってみれば、どこを指している・・・わかると思います。

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

未検証なので嘘かもしれません > Set obj = GetObject(out_path, "Excel.Sheet") ここの Excel.Sheet を Excel.Workbook ?にしてみてどうなりますか? また、"Excel.Sheet" を指定しないとどうなりますか? 指定するファイル名の拡張子は Excel のものですか? > obj.Application.Visible = False Vista+2007 では、GetObject で初めて Excel が起動された場合は Visible = False 状態だったかと・・・ 後半の記述を見ると obj はブック扱いでしょうか? であれば、obj.Parent は Application になるので > obj.Parent.Windows(1).Visible = True の、1 固定は危ないかも 既に Excel を起動していたら、ブックとして追加される?ので 1 のところを obj.Application.Workbooks.Count としておいた方が良いかも・・・バージョンによって違う? obj がシート扱いならそのままでも・・・ でも > obj.Worksheets(sheet_name).Select だと・・・? > 適当なExcelファイルを開いた状態で には、sheet_name に設定したシート名はある? obj がブック扱いなら以下でも  obj.Windows(1).Visible = True ※ 前の回答では oApp を Set して、Windows 内を探す事してました  遠回りだったかも・・・

naoto0216
質問者

お礼

30246kiku様 いつもご回答ありがとうございます。 >ここの Excel.Sheet を Excel.Workbook ?にしてみてどうなりますか?  ⇒ 変更した箇所で「実行時エラー429 ActiveXコンポーネントはオブジェクトを    作成できません」となりました。 >また、"Excel.Sheet" を指定しないとどうなりますか?  ⇒ obj.Worksheets(sheet_name).Select の箇所で、「実行時エラー1004    WorksheetクラスのSelectメソッドが失敗しました」となりました。 >指定するファイル名の拡張子は Excel のものですか?  ⇒ Excelのものです(.xlsx)。 >後半の記述を見ると obj はブック扱いでしょうか?  ⇒ 自分で書いておきながらいまいち分かっていないのですが、    「Set obj = GetObject(out_path, "Excel.Sheet")」ってことは    シート扱い?になるのでしょうか。。      >> 適当なExcelファイルを開いた状態で には、sheet_name に設定したシート名はある?  ⇒ 適当に開いたExcelファイルに同じシート名は存在しません。 ************** >の、1 固定は危ないかも  ⇒ GetObjectの後に、n = obj.Application.Workbooks.Count     とし、obj.Parent.Windows(n).Visible = True    としたら、適当なファイルを開いていてもエラーが出なくなりました。    ・・・ということは、結局objはブック扱いってことになるのでしょうか?    但し、その適当に開いていたファイルはobj.Application.Visible = False    の箇所で閉じてしまいます。    処理が完了し、出力先のExcelファイルを開くと、その閉じていたファイルも    一緒に開きます。。どういうことでしょうか? 度々申し訳ございませんが、よろしくお願い致します。

関連するQ&A

  • 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へ出力してます。 ご教授の程、宜しくお願い致します。

  • Access2002によるエクセルへの出力

    現在、Accessで案件整理のDBを作成しております。 job-list.xlsというエクセルファイルの所定のシートに クエリであるQ_ジョブリストの表の値を一行ずつ差し込みたいと思っています。 そこで、下記の通りVBにてプログラムを組みましたが エクセルシートのB5から始まる一行目にクエリ表の一行目が入るのみで 全データを差し込みできません。 下記のプログラムをベースにB5以降もクエリ表の1行目以降の値が差し込みされるようにしたいと思っております。 どなたかご教授いただけますでしょうか。 よろしくお願いいたします。 Private Sub コマンド103_Click() Me.Requery myXLS = CurrentProject.Path & "\job-list.xls" Set myEXE = CreateObject("Excel.Application") myEXE.Visible = True Set myBK = myEXE.Workbooks.Open(myXLS) Set myRS = Application _ .CurrentProject _ .Connection _ .Execute("SELECT * FROM Q_ジョブリスト") myCNT = 0 myBK.sheets("新規ジョブ").range("B5") = myRS("ジョブNo") myBK.sheets("新規ジョブ").range("C5") = myRS("顧客") myBK.sheets("新規ジョブ").range("D5") = myRS("案件名") myBK.sheets("新規ジョブ").range("E5") = myRS("制作カテゴリ") myBK.sheets("新規ジョブ").range("F5") = myRS("発生日") myBK.sheets("新規ジョブ").range("G5") = myRS("依頼日") myBK.sheets("新規ジョブ").range("I5") = myRS("納品日") myBK.sheets("新規ジョブ").range("J5") = myRS("価格") myBK.sheets("新規ジョブ").range("K5") = myRS("外注費_合計") myBK.sheets("新規ジョブ").range("L5") = myRS("請求日") myBK.sheets("新規ジョブ").range("M1") = myRS("入金日") myBK.sheets("新規ジョブ").range("N1") = myRS("状況") myBK.sheets("新規ジョブ").Copy myCNT = myCNT + 1 End Sub

  • ACCESS VBA クエリを開く

    ACCESS初心者です。 VBAはEXCELで独学した程度の知識です。 フォームから受注納期を入力し、クエリを抽出。 クエリでレコード毎に製品票の印刷枚数を計算し レポートで各レコード毎に求められた印刷枚数分を 印刷させたいのですが・・・ クエリを開く段階でつまずいており困っています。 Private Sub コマンド23_Click() Dim db As DAO.database Dim rs As DAO.Recordset Dim qdf As DAO.QueryDef Set db = CurrentDb() Set qdf = db.QueryDefs("受注クエリ") With qdf .Parameters("納期") = Format(Forms![受注データ一覧]![納期], "yyyy/mm/dd") Set rs = .OpenRecordset .Close End With MsgBox rs![注文番号] rs.Close End Sub パラメータクエリの開き方、上記コードで問題ないでしょうか? そしてこのコードを実行した際 実行時エラー3421 データ型の変換エラーが発生しましたと表示されます。 ローカルウィンドウで 変数rs = nothingとなっており クエリのレコードが読み込めていないようです。 (Msgbox rs!注文番号はデータが読み込めたかテストするために コードを書いています。) どうぞ宜しくお願いいたします。

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

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

  • 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でテーブルの内容を検索したいのですが… アクセス初心者です。 フォームで取得した値をテーブルで検索して命令するために,次のようなことをしてみましたが,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 としました。よろしくお願いします。

  • accessからexcelへ出力時。。。

    3つのクエリを一つのエクセルシートへ出力しようとしているのですが、 3つ目が張り付きません。なんでなんでしょうか?どなたか教えてください。 Dim dbs As Database Dim rst1 As Recordset Dim rst2 As Recordset Dim rst3 As Recordset Dim intRow As Integer Dim intCell As Integer Dim xlsx As Object Set dbs = CurrentDb Set rst1 = dbs.OpenRecordset("クエリA") Set rst2 = dbs.OpenRecordset("クエリB") Set rst3 = dbs.OpenRecordset("クエリC") Set xlsx = CreateObject("Excel.Application") 'Excelオブジェクトを生成 With xlsx .ScreenUpdating = False '画面の再描画を抑止 .Workbooks.Add '新しいブックを追加 '---"クエリA"---------------------------------------------------- intRow = 1 For intCell = 1 To rst1.Fields.Count .Cells(intRow, intCell).Value = rst1.Fields(intCell - 1).Name .Cells(intRow, intCell).Interior.ColorIndex = 15 Next intCell '各レコード出力 intRow = 2 Do Until rst1.EOF For intCell = 1 To rst1.Fields.Count .Cells(intRow, intCell).Value = rst1.Fields(intCell - 1) Next intCell intRow = intRow + 1 rst1.MoveNext Loop '集計Sum For intCell = 4 To rst1.Fields.Count .Cells(intRow + 1, intCell) = "=SUM(" & Cells(2, intCell).Address & ":" & Cells(intRow, intCell).Address & ")" Next intCell ・ ・2目のクエリはOK ・ ・ ’以下3つ目のクエリ Dim intRow3 As Integer Dim intCell3 As Integer intRow3 = intRow + 5 intCell3 = 5 For intCell3 = 5 To rst3.Fields.Count .Cells(intRow3, intCell3).Value = rst3.Fields(intCell3 - 1).Name .Cells(intRow3, intCell3).Interior.ColorIndex = 15 Next intCell3 '各レコード出力 intRow3 = intRow + 6 Do Until rst3.EOF For intCell3 = 5 To rst3.Fields.Count .Cells(intRow3, intCell3).Value = rst3.Fields(intCell3 - 1) Next intCell3 intRow3 = intRow3 + 1 rst3.MoveNext Loop '---- Dim rst3RC As Integer rst3RC = intRow + 5 + rst3.RecordCount '863 '集計Sum For intCell3 = 6 To rst3.Fields.Count - 1 .Cells(rst3RC, intCell3) = "=SUM(" & Cells(rst3RC - rst3.RecordCount, intCell3).Address & ":" & Cells(rst3RC - 1, intCell3).Address & ")" Next intCell3

  • Access VBAでパラメータクエリをSQL文へ

    すみません、、初めて質問しますが、 お手柔らかに宜しくお願い致します。 1.集計クエリ1    ID--Group化 出庫数--合計 日付--Where条件 2..集計クエリ2  ID--Group化 入庫数--合計 日付--Where条件 3.出力用クエリ  ID 商品名 集計クエリ1の合計 集計クエリ2の合計  IDと左結合で、上記のクエリを作成 デザインビューでは1~3は完成しており、 VBA上で1と2を3のSQLに置き換えるところで悩んでおります。。 どなたか教えてください。 ちなみに1.集計クエリの下記のように試してみましたが、 Dim dbs As DAO.Database Dim qdf As QueryDef Dim rst As DAO.Recordset Set qdf = dbs.QueryDefs("Q_データ抽出をしたいクエリ") With qdf .Parameters("[Forms]![f_DataEx]![txt_YearStart]") = "2011" .Parameters("[Forms]![f_DataEx]![txt_MonthStart]") = "02" .Parameters("[Forms]![f_DataEx]![txt_DayStart]") = "23" .Parameters("[Forms]![f_DataEx]![txt_YearEnd]") = "2011" .Parameters("[Forms]![f_DataEx]![txt_MonthEnd]") = "02" .Parameters("[Forms]![f_DataEx]![txt_DayEnd]") = "23" Set rst = .OpenRecordset End With 上記で求めた"rstを基にSQL文が実行できれば、実現できそうなんですが、 うまく行きません。 言葉足らずの内容もあるかと思いますが、宜しくお願い致します。

  • アクセスからエクセルへの処理

    Private Sub エクスポート_Click() Dim myExcel As Object 'エクセルに出力 DoCmd.TransferSpreadsheet filename:=CurrentProject.Path & "\分析素材\test.xls", _ tablename:="HJEX016", _ transfertype:=acExport 'ファイルを開く Set myExcel = CreateObject("Excel.Application")   myExcel.Visible = True ★ myExcel.workbooks.Open filename:=CurrentProject.Path & "\分析素材\test.xls" アクセスのテーブルをエクセルシートに出力し、そのファイルを開くという プログラムを作成してみたのですが、★のところで固まってしまいます。 何がいけないのでしょうか?

  • Excel出力後のExcelの起動について

    Vb側からデータをExcelに出力し、その画面を表示させたまま 出力したExcelを確認しようと思ったところ、Excelは起動するものの シートが表示されない現象が起こりました。 出力後のExcelの終了(解放?)のロジックは下記の通りです。 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = New Excel.Application Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets.Add … … Sheetへの出力処理 … … Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing この現象の回避方法がありましたらご教授ください。 Windows2000 Vb6.0 SP5 Excel2000