アクセスからエクセルのテンプレートへの出力

このQ&Aのポイント
  • アクセス(クエリ)からテンプレートファイル(エクセル)へユーザー単位で出力する方法を教えてください。
  • QRY_出力クエリの結果をユーザー名毎(もしくはユーザーID毎)にテンプレートファイル(エクセル)の「出力Sheet」へ出力し、ユーザー名をファイル名として保存したいです。
  • 初心者ですが、アクセスからエクセルのテンプレートへの出力方法を教えてください。
回答を見る
  • ベストアンサー

アクセスからエクセルのテンプレートへの出力

お世話になっております。 アクセス(クエリ)から テンプレートファイル(エクセル)へ ユーザー単位で出力するには どのようにすれば良いでしょうか? QRY_出力: ユーザー名|ユーザーID|商品|単価|数量|日付 という表示クエリがあり、 このクエリから ユーザー名毎(もしくはユーザーID毎)に テンプレートファイル(エクセル)の「出力Sheet」へ出力した上で、 [ユーザー名]_出力日.xlsx という名前で別名保存したいです。 ※商品×1のユーザーは1レコード  商品×2のユーザーは2レコード・・・の出力のイメージです。 初心者につき、つたない説明かもしれませんが、 ご教示のほどよろしくお願い致します。

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

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

テンプレートファイルのあるフォルダ名を「出力用」、 ファイルのコピー先フォルダ名を「保存用」としています。 実際にあわせて変更してください。 保存するときにユーザーIDとユーザー名のどちらを使用するかは 一概に言えませんが、わかりやすいのはユーザー名かもしれませんが、 同姓同名が存在するともかぎらないので一応、一意性のある ユーザーIDで保存するようにしています。ユーザー名を使う場合は、 コード中のstrFileNameを差し替えればいいようになっています。 コード中にコメントしてあります。 なお、strSQL文はデータ量が多い場合はクエリとして保存して 使ってもいいかもしれません。 一度に保存するファイル数が多くなるとそれなりに時間がかかります。 Sub test()   Dim db As DAO.Database   Dim rs1 As DAO.Recordset   Dim rs2 As DAO.Recordset   Dim strSQL As String   Dim objExcel As Object   Dim objWorkBook As Object   Dim objSheet As Object   Dim objFSO As Object   Dim strTemplatePath As String   Dim strStorePath As String   Dim i As Long   Dim j As Long   Dim m As Long   Dim n As Long   Dim varUserID As Variant   Dim varUserName As Variant   Dim strDate As String   Dim strFileName As String   'ユーザーIDまたは、ユーザーIDとユーザー名の両方の名寄せ。以下のSQL文のどちらかを使用   'strSQL = "SELECT ユーザーID FROM QRY_出力 GROUP BY ユーザーID ORDER BY ユーザーID;"   strSQL = "SELECT ユーザー名, ユーザーID FROM QRY_出力 GROUP BY ユーザー名, ユーザーID ORDER BY ユーザーID;"   'テンプレートファイルのアドレス   strTemplatePath = "C:\Users\hoge\出力用" & "\テンプレート.xlsx"   '保存用フォルダのアドレス   strStorePath = "C:\Users\hogehoge\保存用"   'ファイル名でのエラー回避のために日付の表示変更   strDate = Format(Date, "yyyy-mm-dd")   Set db = CurrentDb   Set rs1 = db.OpenRecordset(strSQL)   Set rs2 = db.OpenRecordset("QRY_出力")   Set objExcel = CreateObject("Excel.Application")   Set objWorkBook = objExcel.Workbooks.Open(Filename:=strTemplatePath)   Set objSheet = objWorkBook.WorkSheets("出力Sheet")   If rs1.RecordCount > 0 Then     rs1.MoveFirst     Do Until rs1.EOF     '一応、ユーザーIDとユーザー名の両方を取得。     varUserID = rs1!ユーザーID     varUserName = rs1!ユーザー名     'ヘッダを入れるのでデータの書き込みは2行目からなのでmの初期値を2に設定     m = 2     'ユーザー名を使う場合は下のstrFileName。     strFileName = "[" & varUserID & "]" & "_" & strDate     'strFileName = "[" & varUserName & "]" & "_" & strDate     '同じファイル名のものが存在しないか確認。     If Len(Dir(strStorePath & "\" & strFileName & ".xlsx")) = 0 Then       If rs2.RecordCount > 0 Then         'ヘッダの書き込み。         For i = 1 To rs2.Fields.Count           objSheet.Cells(1, i) = rs2.Fields(i - 1).Name         Next i         'データの検索と書き込み。         rs2.MoveFirst         Do Until rs2.EOF           If rs2!ユーザーID = varUserID Then             For n = 1 To rs2.Fields.Count               objSheet.Cells(m, n) = rs2.Fields(n - 1).Value             Next n             '次の行の設定。             m = m + 1           End If         rs2.MoveNext         Loop         objExcel.DisplayAlerts = False         'テンプレートファイルのデータの確定。         objWorkBook.Save         'ファイルのコピー。         Set objFSO = CreateObject("Scripting.FileSystemObject")           objFSO.CopyFile strTemplatePath, strStorePath & "\" & strFileName & ".xlsx"         objExcel.DisplayAlerts = True       End If       objExcel.DisplayAlerts = False       '出力Sheetの初期化       objSheet.Cells.Clear       'テンプレートファイルの変更確定。       objWorkBook.Save       objExcel.DisplayAlerts = True     End If     rs1.MoveNext     Loop   End If   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   db.Close: Set db = Nothing   objWorkBook.Close: Set objWorkBook = Nothing   objExcel.Quit   Set objExcel = Nothing   Set objFSO = Nothing End Sub 何かあれば補足してください。

aka_ao
質問者

お礼

確認が遅くなり、お礼も遅れましたこと、申し訳ございません。 ご丁寧なご教示、ありがとうございます。

aka_ao
質問者

補足

初心者につき 追加で教えてください! 'テンプレートファイルの変更確定。 objWorkBook.Save のところで、デバックしてしまいます。 ファイルはちゃんと作成されているのですが・・・?

その他の回答 (2)

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

(1) 何かメッセージが出ますか? (2) ファイルは複数必要ならばすべて作成されますか? (3) 一度、以下のようにしてみるとどうなりますか?     'テンプレートファイルの変更確定。    On Error Resume Next    objWorkBook.Save    On Error Resume 0

aka_ao
質問者

お礼

お礼が遅くなってしまい、大変申し訳ございません。 エラー処理にMsgBox Err.Descriptionを入れて調べて、対応することができました。 お騒がせしました。また、親切なご教示、とても参考になりました。本当にありがとございます。

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

訂正です。   'ファイルのコピー。          のところで、、   Set objFSO = CreateObject("Scripting.FileSystemObject") を、   Set db = CurrentDb   Set rs1 = db.OpenRecordset(strSQL)   Set rs2 = db.OpenRecordset("QRY_出力")   Set objExcel = CreateObject("Excel.Application")   Set objWorkBook = objExcel.Workbooks.Open(Filename:=strTemplatePath)   Set objSheet = objWorkBook.WorkSheets("出力Sheet")   Set objFSO = CreateObject("Scripting.FileSystemObject") のように移動してください。オブジェクトの設定を何度もすることに なっていました。ミスでした。

関連するQ&A

  • accessからExcelテンプレートへの出力

    お世話になります。 accessのクエリ内データをテンプレExcel内の指定セルに出力したいです。accessVBAで以下の流れで作成したく。 ①accessでクエリ抽出(複数レコードに顧客ID、所属、売上げ額) ②テンプレExcel内の顧客ID、所属、売上げ額をそれぞれのセルに入力 ③1人分が出来たら、ファイル名「顧客ID+"売上表".xlsx」で保存先「フォルダA」へ保存したい。 ④同様にクエリ内の他の対象者もExcelファイル作成し、「フォルダA」へ蓄積したい。 ⑤可能であれば、「フォルダA」内のファイルをメールで一括送信したく、ファイルパス名リストも別エクセルに出力したい。 説明が拙い部分もあるかと思いますが、何卒お力をお貸しいただけないでしょうか。

  • AccessからのExcel出力

    お世話になります。 Access2010 フォームに「Excel出力」ボタンを設置し、押すとクエリの内容を Excelに出力するツールを作成しました。 具体的には、ボタンを押すと出力先を指定するダイアログを表示し、 フォルダが選択されたら、そのパスを取得し、そこにExcelファイルが 作成されます。 出力されるファイル名は「情報_yyyymmdd.xlsx」です。 DoCmd.TransferSpreadsheet acExport, 10, "Q_Dummy", strFolder & "情報_" & Format(Date, "yyyymmdd") & ".xlsx", True, "" strFolderは、ダイアログで選択されたパス Q_Dummyは出力するクエリ <質問1> 上記にて問題無く出力はされますが、例えば今日だと「情報_20160704.xlsx」 というファイルをデスクトップに作成したとします。 で、再度デスクトップに作成しようとした場合「既に同じ名前のファイルが あります、上書きしますか?」というメッセージは表示されず そのまま上書きされてしまいます。 DoCmd.TransferSpreadsheet acExportを実行する前に、事前に出力先の パスに同ファイル名が存在していないかチェックした上で、手動で 「上書きしますか?」のメッセージを表示させる必要があるのでしょうか。 <質問2> 「そのまま上書きされてしまいます。」と書きましたが、実際には マージされてしまうようです。 例えば、2レコード抽出されたクエリの内容を出力し、そのExcelを開いて 表外に「ああああ」と入力します。 次に条件を変えて3レコード抽出されたクエリの内容を出力します。 そうすると、ちゃんと3レコードの内容が出力されていますが 表外に入力した「ああああ」は残ってます。 ※画像1 また、表内のセルに「AAAA」と入力し、そのセルに色付けした状態で、 再度出力すると、「AAAA」は上書きされますが、色は付いたままです。 ※画像2 という結果から、  ・ファイル自体が作成し直される訳ではない。  ・上書きされる部分はあくまでもクエリの内容(表内)の部分だけ   であり、書式や表外の部分については上書きされない。 ということになるかと思います。 その認識で問題ありませんでしょうか。 上書きされないように(そもそも同じファイル名にならないように) ファイル名を「情報_yyyymmdd_hhmmss.xlsx」にすればいいかとは 思うのですが。。 ご教示の程、宜しくお願い致します。

  • アクセスからエクセルテンプレートを複製して改名

    お世話になっております。 アクセスのクエリを エクセルのテンプレートへ出力する際、 セルの位置を指定してフィールド値を出力したいです。 また、複製したファイル名に そのフィールド値を使って「名前を付けて保存」としたいのですが 知識不足のため、ご教示いただけないでしょうか。 クエリ名:qry_expt (クエリの)フィールド名:顧客番号・氏名・住所・電話番号・年齢・登録日・削除日・利用日・利用回数・利用内容・ナド・・・ エクセルテンプレート名:報告書 出力先セルと出力フィールド:B10(顧客番号)・E10(氏名)・B13(住所)・B14(電話番号)・B20(利用日)・・ 改名したいファイル名:報告書_[氏名]_[利用日] 過不足ありましたら、追記させていただきます。 是非、よろしくお願い致します。

  • Accessで2テーブルの差分出力

    Access2000を使っています。 2つのテーブルの不一致レコードを表示したいと思っています。 下記例では『玄米茶の単価が違う・ 紅茶の数量が違う』ため、差分のレコードを出力したいのです。 (新しいテーブルにINSERTしてもかまいませんし、クエリで出力してもかまいません) 例) Aテーブル 品目  単価  数量 緑茶  100   10 玄米茶 200   15 紅茶  150   5 Bテーブル 品目  単価  数量 緑茶  100   10 玄米茶 150   15 紅茶  150   30 差分テーブル(クエリでも可) 品目 玄米茶 紅茶 実際に処理するレコードが10万件を超える為、差分レコードのみを表示したいと思っています。 上記例では、緑茶レコードは表示したくありません。 どなたか教えてください。お願いします。

  • ACCESS Excelの出力について

    stressmanといいます。 実は、ACCESSでクエリをExcelへ出力をしたいのですが、 ここで、既存のExcelのファイルのセルを指定して出力 というこはできるのでしょうか? 選択クエリで必要な情報を抜き出し、そのクエリを 「営業報告書.xls」というファイルのあらかじめ記載して ある「顧客名」「住所」のセルに格納していきたいのです。 マクロで「コマンド実行」-「Excel出力」を使って みたのですが、新しくファイルを開き、クエリのデザイン そのままで出力されます。 宜しくお願いします。

  • アクセスVBAでの出力設定について

    初めての質問投稿となります。 アクセステーブルデータを、フィールドキー毎にエクセルテンプレートへ出力しようと試みています。 様々なサイトを参考に下記の対応は作成してみたのですが、組み合わせ方が上手く理解できずに行き詰っております。 ①テーブルのレコードをフィールドキー毎に ②エクセルのテンプレート(B3セルから)へレコード出力し ③シート名・ファイル名にフィールドキーをつけて保存 テーブル名:報告リスト (ブロック/支店名/社員コード/etc...) フィールドキー:ブロック クエリにてフィールドキー毎のデータを作成し、都度エクセルへコピペする作業工数を減らすべくご教示いただけますと幸いです。

  • Access2010でのExcel出力について

    お世話になります。 Access2010のクエリで抽出した結果を下記のコマンドでExcelに出力しています。 Private Sub コマンド6_Click() Dim デスクトップの場所 As String デスクトップの場所 = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" If Nz(Dir(デスクトップの場所 & "log.xlsx"), "") <> "" Then If vbNo = MsgBox("デスクトップに同じ名前のファイルが存在します。上書きしますか?", vbYesNo + vbQuestion, "ファイルが存在します") Then Exit Sub End If End If DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Q_syukei", デスクトップの場所 & "log.xlsx" DoCmd.Close MsgBox "デスクトップに案件ログのExcelファイルが出力されました" End Sub その中のフィールドにコンボボックス利用のデータが複数あり、 1列目にID番号が振られていて、2列目に目的のデータ項目が格納されています。 元のテーブルでも、クエリでも列幅を0cm;10cmとしていて、 クエリの結果もAccess上で見ると2列目のデータ項目が表示されるのですが、 出力されたExcelには1列目のID番号しか載ってきていません。 2列目のデータをExcelに出力するにはどうすればよいでしょうか。 ご教授ください。

  • アクセスからエクセルのフォーマットへ出力

    初心者につき、ご教示ください。 アクセスのテーブルのクエリから エクセルのフォーマットをコピーして出力したいのです。 例) オブジェクト種別:オブジェクト名:フィールド名 テーブル1:TBL_社員情報:社員番号・氏名・所属・入社年月・退職日・・ テーブル2:TBL_所属情報:社員番号・所属・グループ・業務担当・主務or兼務・・ 出力用クエリ:QRY_エクスポート:社員番号・氏名・所属・グループ・業務担当 エクセルのフォーマット名:所属申請:社員番号・氏名・所属・グループ・主務・兼務 ※主務と兼務はそれぞれ分けた申請になるため、同一社員で複数の申請書が必要になります。 →申請書の様式はありますが、新しいシート(もしくは フォーマットのエクセルに、もともと空シートを作っておいて、そこ)にデータを出力する・・のであれば、申請書の様式が変更になっても使えるものになると想定しています。 単にクエリをエクスポートするだけであれば DoCmd.RunSavedImportExport で、設定できるのは理解しているのですが フォーマットを必要分コピーして別名保存(例えば「社員番号+部署」)するとなると知識が足りません。 ご理解の深い方、お分かりになりましたら ご教示いただけますと幸いです。 よろしくお願い致します。

  • アクセスからVBAでエクセルに出力する方法

    アクセスからVBAでエクセルに出力する方法 アクセスで下記のようなクエリの結果に対して、VBAにて会社毎のエクセルファイルを作成、 保存したいと思いますが、どのようにすればいいでしょうか? ファイル名は、[KAISYA_MEI].xlsとし、それぞれをC:\ などに保存したい。 ちなみにExcel2003、Access2003を使用しています。 ・アクセスのクエリ結果 KAISYA_ID   KAISYA_MEI  TANTOSYA_MEI     MAIL     TEL 1        ○○社        ***        ***@*** 0*-***-**** 2        △△社        ***        ***@*** 0*-***-**** 2        △△社        ***        ***@*** 0*-***-**** 3        □□社        ***        ***@*** 0*-***-**** 3        □□社        ***        ***@*** 0*-***-**** ↓  ファイル名:○○社.xls のエクセルファイル KAISYA_ID   KAISYA_MEI  TANTOSYA_MEI     MAIL     TEL 1        ○○社        ***        ***@*** 0*-***-**** ↓  ファイル名:△△社.xlsのエクセルファイル KAISYA_ID   KAISYA_MEI  TANTOSYA_MEI     MAIL     TEL 2        △△社        ***        ***@*** 0*-***-**** 2        △△社        ***        ***@*** 0*-***-**** ... よろしくお願い致します。

  • ACCESSでクエリの式の内容を一覧にしたい

    ACCESSの質問です。初心者です。 ひとつのクエリにフィールドが200以上あり、その中に式がたくさん(私にとっては・・・)あります。 式の内容を変更したりメンテするのに、クエリの内容をすべて一覧で見る方法か、または、EXCEL等に吐き出して見る方法はありますでしょうか? 現在、クエリのフィールド名と式の内容を1フィールド毎にEXCELに貼り付けて管理しています。 たとえば・・・ (1)ID (2)数量 (3)単価 (4)売上:数量*単価 (5)消費税:数量*単価*0.05    ・    ・ といった具合にクエリの内容が延々と200以上続いています。実際には複数の条件式が入ったりして、もっと複雑な計算をしています。 これを、一覧の形で見るか、またはEXCEL等に吐き出した形で見たいのです。 どなたか教えてください。 よろしくお願いします。

専門家に質問してみよう