• 締切済み

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

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

dim oSheet as Object if MyBK is nothing then   MsgBox "MyBKの取得に失敗しています" end if Set oSheet = myBK.Sheets("新規ジョブ") if oSheet is nothing then   MsgBox "新規ジョブシートの取得に失敗しています" end if set oDst = oSheet.Range("A1") としてみてはいかがでしょう どのオブジェクトが取得できていないのかを明確にしましょう WorkBOOKなのかシートなのか

sn_hyodo
質問者

補足

大変ご無沙汰しております。 その後も引き続き取り組んでおりまして、今回は頂いた方法から若干趣向を変えて下記の通りソースを組んでみました。 動作としては、Forループを使って一行目へ転記後に次の行へと転記されるようになったのですが、今回の問題としましてはクエリテーブルの一行目しか転記されないことです。 クエリの1行目が転記されたら2行目が転記されるようにするにはどのような方法がありますでしょうか? 長々のお付き合いでお手数をお掛けいたしますがご教授のほどよろしくお願いいたします。 以下、ソース 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) Dim i As Integer For i = 5 To 10 Set myRS = Application _ .CurrentProject _ .Connection _ .Execute("SELECT * FROM Q_ジョブリスト") myBK.sheets("新規ジョブ").Cells(i, 2) = myRS("ジョブNo") myBK.sheets("新規ジョブ").Cells(i, 3) = myRS("顧客") myBK.sheets("新規ジョブ").Cells(i, 4) = myRS("案件名") myBK.sheets("新規ジョブ").Cells(i, 5) = myRS("制作カテゴリ") myBK.sheets("新規ジョブ").Cells(i, 6) = myRS("発生日") myBK.sheets("新規ジョブ").Cells(i, 7) = myRS("依頼日") myBK.sheets("新規ジョブ").Cells(i, 9) = myRS("納品日") myBK.sheets("新規ジョブ").Cells(i, 10) = myRS("価格") myBK.sheets("新規ジョブ").Cells(i, 11) = myRS("外注費_合計") myBK.sheets("新規ジョブ").Cells(i, 12) = myRS("請求日") myBK.sheets("新規ジョブ").Cells(i, 13) = myRS("入金日") myBK.sheets("新規ジョブ").Cells(i, 14) = myRS("状況") Next i End Sub

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

Excelへの参照設定を行わないのであれば Dim oDest as Object といった具合に宣言しましょう

sn_hyodo
質問者

補足

早速、ご教授頂きまして誠にありがとうございます。 Dim oDest As Object としてエクセル表は起動したのですが、書き出しはされず エラーとして424が表示されます。 Set oDest = mkBK.Sheets("新規ジョブ").Range("A1") で引っかかっているようです。 再三にわたり、大変お手数ですが原因について ご教授いただけますと誠に幸いです。 どうぞ宜しくお願いいたします。 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 Dim oDest As Object Set oDest = mkBK.Sheets("新規ジョブ").Range("A1") ' 最初のレコードへ移動 rs.MoveFirst ' レコードがなくなるまで繰り返す Do Until rs.EOF rDest.Range("B5") = myRS("ジョブNo") rDest.Range("C5") = myRS("顧客") rDest.Range("D5") = myRS("案件名") rDest.Range("E5") = myRS("制作カテゴリ") rDest.Range("F5") = myRS("発生日") rDest.Range("G5") = myRS("依頼日") rDest.Range("I5") = myRS("納品日") rDest.Range("J5") = myRS("価格") rDest.Range("K5") = myRS("外注費_合計") rDest.Range("L5") = myRS("請求日") rDest.Range("M1") = myRS("入金日") rDest.Range("N1") = myRS("状況") ' 転記先の更新 Set rDest = rDest.Offset(1, 0) ' 次のレコードへ移動 rs.MoveNext Loop rs.Close End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

myBK.sheets("新規ジョブ").range("B5") にデータを受け取るのでしょうが、最初のレコードはそれでよくても、アクセスでの第2、第3・・のレコードは 1行ずつ下の行に順次セットしないとならないのでしょう。ですから B5のように5と固定してはダメで i=5 'エクセルシートでデータの最初(上)行 ブック・シート指定.Cells(i,"B")=アクセスデータ ・・・他のフィールドへの代入 i=i+1 次の繰り返し(レコード)に移る、 ーー のように考えること。

sn_hyodo
質問者

お礼

この度は、お礼が遅くなりまして誠に申し訳ございません。 体調不良により、昨日まで入院をしておりまして遅くなりました。 アドバイスを頂きありがとうございます。 参考にさせて頂きます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

一枚のシートに クエリーで取ってきたデータをすべて転記したいのでしょうか そうであればRecordsetをループして処理するように変更しましょう ' 転記対象のRangeオブジェクトを準備します dim oDest as Range Set oDest = mkBK.Sheets("新規ジョブ".Range("A1") ' 最初のレコードへ移動 rs.MoveFirst ' レコードがなくなるまで繰り返す do until rs.EOF   rDest.range("B5") = myRS("ジョブNo")   rDest.range("C5") = myRS("顧客")   rDest.range("D5") = myRS("案件名")   rDest.range("E5") = myRS("制作カテゴリ")   rDest.range("F5") = myRS("発生日")   rDest.range("G5") = myRS("依頼日")   rDest.range("I5") = myRS("納品日")   rDest.range("J5") = myRS("価格")   rDest.range("K5") = myRS("外注費_合計")   rDest.range("L5") = myRS("請求日")   rDest.range("M1") = myRS("入金日")   rDest.range("N1") = myRS("状況")   ' 転記先の更新   set rDest = rDest.Offset( 1, 0 )   ' 次のレコードへ移動   rs.MoveNext Loop rs.close といった具合でしょう # 字下げに全角スペースを使用しています適宜置換などの修正をしてください

sn_hyodo
質問者

お礼

昨日まで体調不良のため、入院をしておりお返事が遅くなりました。 大変失礼いたしました。 詳細なアドバイス誠にありがとうございます。 頂いたサンプルをこちらで作成したものと組み合わせて下記のように記述いたしましたところ、Dim oDest As Range のところでユーザー定義型は定義されないとエラーが表示されてしまいます。 出来る限り調べてみましたが、わたしの現在の知識では解決に至らず原因についてご教授頂ければ幸いです。 よろしくお願いいたします。 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 ' 転記対象のRangeオブジェクトを準備します Dim oDest As Range Set oDest = mkBK.Sheets("新規ジョブ").Range("A1") ' 最初のレコードへ移動 rs.MoveFirst ' レコードがなくなるまで繰り返す Do Until rs.EOF rDest.Range("B5") = myRS("ジョブNo") rDest.Range("C5") = myRS("顧客") rDest.Range("D5") = myRS("案件名") rDest.Range("E5") = myRS("制作カテゴリ") rDest.Range("F5") = myRS("発生日") rDest.Range("G5") = myRS("依頼日") rDest.Range("I5") = myRS("納品日") rDest.Range("J5") = myRS("価格") rDest.Range("K5") = myRS("外注費_合計") rDest.Range("L5") = myRS("請求日") rDest.Range("M1") = myRS("入金日") rDest.Range("N1") = myRS("状況") ' 転記先の更新 Set rDest = rDest.Offset(1, 0) ' 次のレコードへ移動 rs.MoveNext Loop rs.Close End Sub

関連するQ&A

  • AccessからExcelに罫線付で出力したい

    Access2010使用。 AccessのクエリからExcelにエクスポートした際、罫線などの体裁を整えて出力したいと思っています。 データは下記のコードでなんとか出るようになりましたが、このコードの中に罫線を引くコードを 入れる方法がどうしてもわかりません。 検索してあれこれ試しましたが「オブジェクトがない」や「サポートしてない」などエラーメッセージ が出てしまい、VBAの基礎知識がない私にはどうしてもわかりませんでした。 どうかアドバイスお願いいたします。 (クエリ名は Q_ABC とします) やりたいことは ・データがある行列に格子線を引き、1行目の項目列の下は二重線、外側は太線にしたい。 ・行の高さを数値で指定したい。 です。なお、行数はその都度増えます。 また、できれば 印刷する際の設定で用紙を「A3横」で、常に横1ページに入るように縮小率を設定しておきたい のですが可能でしょうか? どうぞよろしくお願いします。 Private Sub コマンド0_Click() Set xlapp = CreateObject("Excel.application") Dim xlbook As Excel.Workbook Dim xlsheet As Excel.Worksheet Dim rs As New ADODB.Recordset Dim objEXCEL As Object Dim nYLINE As Integer Dim nXLINE As Integer Dim nRCNT As Integer Dim strWORK As String Set xlApp = CreateObject("Excel.Application") Set objEXCEL = CreateObject("Excel.Application") objEXCEL.Visible = True objEXCEL.Workbooks.Add objEXCEL.sheets.Add re.Open "Q_ABC", CurrentProject.Connection, adOpenKeyset, adLockOptimistic '見出しを書き込む objEXCEL.Range("A1") = "ID" objEXCEL.Range("B1") = "氏名" objEXCEL.Range("C1") = "住所"  == 以下T列まで省略 == '項目名をセルの中央に objEXCEL.Range("A1:T1").HoraizontalAlignment = xlHAilignCenterAcrossSelection Dim yLINE As Integer '行カウンター yLINE = 2  'ループ処理 While rs.EOF = False 'accessからデータのセット objEXCEL.Cells(yLINE, "A") = rs.Fields("ID") objEXCEL.Cells(yLINE, "B") = rs.Fields("氏名") objEXCEL.Cells(yLINE, "C") = rs.Fields("住所") == 以下T列まで省略 == rs.MoveNext yLINE = yLINE + 1 Wend 'シートの列幅の自動調整 objEXCEL.Cells.EntireColumn.AutoFit rs.Close Set rs = Nothing End Sub

  • 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

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

    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" アクセスのテーブルをエクセルシートに出力し、そのファイルを開くという プログラムを作成してみたのですが、★のところで固まってしまいます。 何がいけないのでしょうか?

  • access 特定のレコード数までエクセルに出力したら、別のシートに出力先を変えたい

    VBA初心者です。宜しくお願い致します。 テーブルのデータをエクセルに出力しているのですが 特定の行まで出力したら、別のシートに出力先を変更したいのです。 以下コードの★部分で処理するのではないかと思っているのですが どのように書けばいいのかさっぱりわからず、ご質問させて いただきました。 どうぞ、宜しくお願い致します。 ----------------------- '既存の Excel Book をテンプレートとして開き、 '位置を指定して、テーブルのデータを出力 Dim cnADO As ADODB.Connection 'ADO コネクション確立 Dim rsADO As ADODB.Recordset Dim xls As Excel.Application Dim wkb As Excel.Workbook Dim fName As Variant Dim stDetail As String 'Query OR Table Name Dim stPath As String 'mdb & Excel Book Path Dim stXLName As String 'Book Name Dim stSheet As String 'Sheet Name Dim stSheet2 As String 'Sheet2 Name Dim stRng As String 'Range Address stPath = "\\marketing\" '自mdb & Excel Book のパス stXLName = "marketing.xls" 'テンプレート用の Book stDetail = "出力テーブル" 'テーブル名 stSheet = "marketing" '出力するシート名1 stSheet2 = "marketing2" '出力するシート名2 stSheet3 = "marketing3" '出力するシート名3 stRng = "A26" '出力開始セル番地 Set cnADO = CurrentProject.Connection Set rsADO = cnADO.Execute(stDetail) 'テンプレート としてオープン Set xls = CreateObject("Excel.Application") xls.Workbooks.Add template:=stPath & stXLName Set wkb = xls.Workbooks(1) '★rsADOのレコード数を1行目のデータから30行目までに制限 '★明細データ貼り付け1(rsADOの1行目のデータから30行目までを貼り付け処理) With wkb.Worksheets(stSheet) .Range(stRng).CopyFromRecordset Data:=rsADO End With '★rsADOのレコード数を31行目のデータから75行目までに制限 '★明細データ貼り付け2(rsADOの31行目のデータから75行目までを貼り付け処理) With wkb.Worksheets(stSheet2) .Range(stRng).CopyFromRecordset Data:=rsADO End With '★rsADOのレコード数を76行目のデータから100行目までに制限 '★明細データ貼り付け3(rsADOの76行目のデータから100行目までを貼り付け処理) With wkb.Worksheets(stSheet3) .Range(stRng).CopyFromRecordset Data:=rsADO End With 'Excel画面を表示して終了(保存しない) xls.Visible = True Set xls = Nothing Set wkb = Nothing Set fName = Nothing rsADO.Close: Set rsADO = Nothing cnADO.Close: Set cnADO = Nothing

  • AccessからExcelのVBAを動かしたい

    2002です。 Excel_A.xlsからExcel_B.xlsのFromAccessプロシージャを実行する場合、 Application.Run "'" & ActiveWorkbook.Path & "\Excel_B.xls'!FromAccess" でいけたのですが、、、 Access_A.mdbから次のようにやると Application.Run "'" & CurrentProject.Path & "\Excel_B.xls'!FromAccess" エラーになります。 それで、次のようにやってみたら動いたのですが、FromAccessが一気に終了して しまい、デバッグできません。 Dim myExcel As Object Set myExcel = CreateObject("Excel.Application") Set myExcel = GetObject(CurrentProject.Path & "\Excel_B.xls", "Excel.Sheet") myExcel.Application.Visible = True myExcel.Application.UserControl = True myExcel.windows(1).Visible = True myExcel.Application.Run "FromAccess" デバッグしながら、AccessからExcelのプロシージャを実行するにはどうしたらいいのでしょうか?

  • EXCELのVBAですが。

    EXCELのVBAですが。 Sub macro1() Dim mycnt As Integer Dim sheet_name1 As String Sheets("kekka").Select Range("A1").Select Sheets("shiji").Select mycnt = Range("B1").Value sheet_name1 = Range("c" & mycnt) Sheets("kekka").Select Sheets("kekka").name = sheet_name1 Sheets("kansuke").Select Sheets("kansuke").Copy Before:=Workbooks("2007年報告.xls").Sheets(3) End Sub (やりたいこと) B1に入っている数値でC1からC10に入っているあるシートの名前(たとえばkansukeとする)を取り、その名前で kekkaというシート名をkansukeという名前に変える。 名前を変えたkansukeというシートを別の2007年報告というbookにコピーを転送する。 (質問)上のコードで実はkansukeと書いてあるところは,B1の値次第で当然いろいろに 変化するため、そのシート名にとらわれない書き方をしたいのですがどう記述すればいいのか わかりません。以上お願いします。

  • AccessでExcelに出力

    クエリで抽出したデータをエクセルに出力すると、左上から(セルA1)から詰めて表示されますが、たとえばAの行に任意の文、データはBの行から表示させる方法はあるでしょうか。 また、出力するデータを自分で作成した表にはめ込む、もしくははめ込んだ状態で出力させるということは可能でしょうか? よろしくお願いします。

  • excel vba DATAの日集計

    excel vba DATAの日集計 いつもお世話になっています。 "DATA"シートのセル"D2"の日付を変えると表の数値が変わるようにしています。 その日毎のデータを"集計"シートの日別の表に飛ぶようにしているのですが、 1日分の転記するセル数が多く、Select Caseで31日分のコードを書くと、あまりにも プロシージャーが大きくなります。(Case1からCase31・・・結果分割してますが) FOR NEXT なのかな~、もっと効率のいい書き方がありましたらよろしくお願いします。 例:"集計"シート1日分は、9行となります。それぞれ"DATA"シートからの転記です。"DATA"シートのF5+F10,G5+G10~AC5+AC10までそれぞれの値を"集計"シートのG5からAD5まで、F6+F12,G6+G12~AC6+AC12までそれぞれの値を"集計"シートのG13からAD13までといった具合です (日の9行はそれぞれ決まったある行とある行の加算です、これが31日分の行があります) Sub macro() Dim myrng As Range Dim c As Range Set myrng = Sheets("DATA").Range("D2") For Each c In myrng Select Case c.Value Case 1 '1行目 Sheets("集計").Range("G5").Value = Sheets("DATA").Range("F5") + Sheets("DATA").Range("F10") | | Sheets("集計").Range("AD5").Value = Sheets("DATA").Range("AC5") + Sheets("DATA").Range("AC10") | | '9行目Sheets("集計").Range("G13").Value = Sheets("DATA").Range("F6") + Sheets("DATA").Range("F12") | | Sheets("集計").Range("AD13").Value = Sheets("DATA").Range("AC6") + Sheets("DATA").Range("AC12")

  • Access2000:VBAを使用したエクセル操作

    下記のように既存のエクセルファイルにクエリからとってきたデータを挿入したいと考えております。 既存のエクセルファイルを開くことは成功したのですが、ある条件だとシートを追加するという処理(オブジェクト記述)がわかりません。 シート追加、あわせてブック追加方法もお願いします。 Set ExcelApp = CreateObject("Excel.Application") Set Book = ExcelApp.Workbooks.Open("C:\query\module\VBExcel.xls") Set Sheet = Book.Worksheets("test1")←追加したい

  • EXCEL ADO接続についておしえてください!

    コネクションを一つ、レコードセットを3つ開いて、エクセルのデータを取り込むというコードを書いたのですが、’このコンテキストで操作は許可されていません’というエラーが出てしまいます。 どなたか解決策わかる方いらっしゃいましたらお願いします。 コードは↓ Dim WS1 As New Worksheet Set WS1 = Sheets("入力") myCon.Open conSTR1 myRS.Open "流動中現品", conSTR1, adOpenDynamic, adLockPessimistic myRS1.Open "次待機現品", conSTR1, adOpenDynamic, adLockPessimistic myRS2.Open "次次待機現品", conSTR1, adOpenDynamic, adLockPessimistic For i = 0 To 71 myRS.Fields("ロットNo.") = WS1.Range("E3").Offset(i) myRS1.Fields("ロットNo.") = WS1.Range("K3").Offset(i) myRS2.Fields("ロットNo.") = WS1.Range("T3").Offset(i) myRS.Fields("製造No.") = WS1.Range("AA3").Offset(i) myRS.Fields("品種") = WS1.Range("G3").Offset(i) myRS1.Fields("品種") = WS1.Range("R3").Offset(i) myRS2.Fields("品種") = WS1.Range("CX3").Offset(i) If WS1.Range("H3").Offset(i) <> "" Then myRS.Fields("製品") = Round(WS1.Range("H3").Offset(i), 1) ElseIf WS1.Range("S3").Offset(i) <> "" Then myRS1.Fields("製品") = Round(WS1.Range("S3").Offset(i), 1) ElseIf WS1.Range("CY3").Offset(i) <> "" Then myRS2.Fields("製品") = Round(WS1.Range("CY3").Offset(i), 1) End If For a = 1 To 15 myRS.Fields(a & "現品目") = WS1.Range("AY3").Offset(i, a - 1) myRS1.Fields(a & "現品目") = WS1.Range("BO3").Offset(i, a - 1) myRS2.Fields(a & "現品目") = WS1.Range("CE3").Offset(i, a - 1) Next myRS.MoveNext Next myRS.Close: myRS1.Close  ←この部分でエラーがでます!! myCon.Close: Set myCon = Nothing End Sub

専門家に質問してみよう