アクセスからエクセルのテンプレートへの出力
- アクセス(クエリ)からテンプレートファイル(エクセル)へユーザー単位で出力する方法を教えてください。
- QRY_出力クエリの結果をユーザー名毎(もしくはユーザーID毎)にテンプレートファイル(エクセル)の「出力Sheet」へ出力し、ユーザー名をファイル名として保存したいです。
- 初心者ですが、アクセスからエクセルのテンプレートへの出力方法を教えてください。
- ベストアンサー
アクセスからエクセルのテンプレートへの出力
お世話になっております。 アクセス(クエリ)から テンプレートファイル(エクセル)へ ユーザー単位で出力するには どのようにすれば良いでしょうか? QRY_出力: ユーザー名|ユーザーID|商品|単価|数量|日付 という表示クエリがあり、 このクエリから ユーザー名毎(もしくはユーザーID毎)に テンプレートファイル(エクセル)の「出力Sheet」へ出力した上で、 [ユーザー名]_出力日.xlsx という名前で別名保存したいです。 ※商品×1のユーザーは1レコード 商品×2のユーザーは2レコード・・・の出力のイメージです。 初心者につき、つたない説明かもしれませんが、 ご教示のほどよろしくお願い致します。
- aka_ao
- お礼率50% (26/52)
- Visual Basic
- 回答数3
- ありがとう数5
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
テンプレートファイルのあるフォルダ名を「出力用」、 ファイルのコピー先フォルダ名を「保存用」としています。 実際にあわせて変更してください。 保存するときにユーザー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 何かあれば補足してください。
その他の回答 (2)
- piroin654
- ベストアンサー率75% (692/917)
(1) 何かメッセージが出ますか? (2) ファイルは複数必要ならばすべて作成されますか? (3) 一度、以下のようにしてみるとどうなりますか? 'テンプレートファイルの変更確定。 On Error Resume Next objWorkBook.Save On Error Resume 0
お礼
お礼が遅くなってしまい、大変申し訳ございません。 エラー処理にMsgBox Err.Descriptionを入れて調べて、対応することができました。 お騒がせしました。また、親切なご教示、とても参考になりました。本当にありがとございます。
- piroin654
- ベストアンサー率75% (692/917)
訂正です。 'ファイルのコピー。 のところで、、 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(アクセス)
- 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」にすればいいかとは 思うのですが。。 ご教示の程、宜しくお願い致します。
- ベストアンサー
- その他MS Office製品
- アクセスからエクセルテンプレートを複製して改名
お世話になっております。 アクセスのクエリを エクセルのテンプレートへ出力する際、 セルの位置を指定してフィールド値を出力したいです。 また、複製したファイル名に そのフィールド値を使って「名前を付けて保存」としたいのですが 知識不足のため、ご教示いただけないでしょうか。 クエリ名:qry_expt (クエリの)フィールド名:顧客番号・氏名・住所・電話番号・年齢・登録日・削除日・利用日・利用回数・利用内容・ナド・・・ エクセルテンプレート名:報告書 出力先セルと出力フィールド:B10(顧客番号)・E10(氏名)・B13(住所)・B14(電話番号)・B20(利用日)・・ 改名したいファイル名:報告書_[氏名]_[利用日] 過不足ありましたら、追記させていただきます。 是非、よろしくお願い致します。
- ベストアンサー
- Visual Basic
- 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...) フィールドキー:ブロック クエリにてフィールドキー毎のデータを作成し、都度エクセルへコピペする作業工数を減らすべくご教示いただけますと幸いです。
- ベストアンサー
- Access(アクセス)
- 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に出力するにはどうすればよいでしょうか。 ご教授ください。
- ベストアンサー
- その他MS Office製品
- アクセスからエクセルのフォーマットへ出力
初心者につき、ご教示ください。 アクセスのテーブルのクエリから エクセルのフォーマットをコピーして出力したいのです。 例) オブジェクト種別:オブジェクト名:フィールド名 テーブル1:TBL_社員情報:社員番号・氏名・所属・入社年月・退職日・・ テーブル2:TBL_所属情報:社員番号・所属・グループ・業務担当・主務or兼務・・ 出力用クエリ:QRY_エクスポート:社員番号・氏名・所属・グループ・業務担当 エクセルのフォーマット名:所属申請:社員番号・氏名・所属・グループ・主務・兼務 ※主務と兼務はそれぞれ分けた申請になるため、同一社員で複数の申請書が必要になります。 →申請書の様式はありますが、新しいシート(もしくは フォーマットのエクセルに、もともと空シートを作っておいて、そこ)にデータを出力する・・のであれば、申請書の様式が変更になっても使えるものになると想定しています。 単にクエリをエクスポートするだけであれば DoCmd.RunSavedImportExport で、設定できるのは理解しているのですが フォーマットを必要分コピーして別名保存(例えば「社員番号+部署」)するとなると知識が足りません。 ご理解の深い方、お分かりになりましたら ご教示いただけますと幸いです。 よろしくお願い致します。
- 締切済み
- Visual Basic
- アクセスから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*-***-**** ... よろしくお願い致します。
- ベストアンサー
- Visual Basic
- ACCESSでクエリの式の内容を一覧にしたい
ACCESSの質問です。初心者です。 ひとつのクエリにフィールドが200以上あり、その中に式がたくさん(私にとっては・・・)あります。 式の内容を変更したりメンテするのに、クエリの内容をすべて一覧で見る方法か、または、EXCEL等に吐き出して見る方法はありますでしょうか? 現在、クエリのフィールド名と式の内容を1フィールド毎にEXCELに貼り付けて管理しています。 たとえば・・・ (1)ID (2)数量 (3)単価 (4)売上:数量*単価 (5)消費税:数量*単価*0.05 ・ ・ といった具合にクエリの内容が延々と200以上続いています。実際には複数の条件式が入ったりして、もっと複雑な計算をしています。 これを、一覧の形で見るか、またはEXCEL等に吐き出した形で見たいのです。 どなたか教えてください。 よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
お礼
確認が遅くなり、お礼も遅れましたこと、申し訳ございません。 ご丁寧なご教示、ありがとうございます。
補足
初心者につき 追加で教えてください! 'テンプレートファイルの変更確定。 objWorkBook.Save のところで、デバックしてしまいます。 ファイルはちゃんと作成されているのですが・・・?