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

このQ&Aのポイント
  • アクセスのクエリ結果をエクセルのテンプレートに出力する際に、セルの位置を指定してフィールド値を出力する方法を知りたいです。
  • また、出力したエクセルファイルの名前を、フィールド値を使って「名前を付けて保存」したいですが、知識が足りず教えていただけないでしょうか。
  • クエリ名はqry_exptで、フィールド名には顧客番号・氏名・住所・電話番号・年齢・登録日・削除日・利用日・利用回数・利用内容などがあります。エクセルテンプレート名は報告書で、出力先セルと出力フィールドは以下の通りです。改名したいファイル名は報告書_[氏名]_[利用日]です。
回答を見る
  • ベストアンサー

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

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

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

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

>Microsoft DAO XXXObject Libraryですが、既にあるモジュールで使われています。 >と出てしまうので、設定しなくて大丈夫ということでしょうか? チェックが入っていれば設定は不要です。 >Dim objExcel As Excel.Application >Dim wkb As Excel.Workbook >でもエラーで止まってしまうので、コメントアウトしてテスト作動してみましたが、大丈夫でしょうか? >フォームのtxt_Pathというテキストボックスに作成するのですが、 >どのように修正するとよろしいでしょうか? これらについてはまとめて書き換えましたので以下のコードで確認してください。 Private Sub コマンド2_Click()   Dim db As DAO.Database   Dim rs As DAO.Recordset   Dim objExcel As Object   Dim wkb As Object   Dim i As Long   Dim strFileName As String   Dim strName As String   Dim strDate As String   Dim objFSO As Object   Dim strPath As Long   'コピー先のフォルダの確認など。   If IsNull(Me!txt_Path) Then     MsgBox ("コピー先のパスが入力されていません")     Exit Sub   End If   If Dir(Me!txt_Path, vbDirectory) = "" Then     MsgBox ("フォルダがみつかりません.パスを正確に設定してください。")     Exit Sub   End If   If Not GetAttr(Me!txt_Path) = vbDirectory Then     MsgBox ("コピー先が不正です。コピー先のフォルダのパスを確認してください。")     Exit Sub   Else     If MsgBox(Me!txt_Path & "にコピーしてよろしいですか?", vbYesNo) = vbNo Then       MsgBox ("コピーを取り止めます。")       Exit Sub     End If   End If   Set objExcel = CreateObject("Excel.Application")   Set wkb = objExcel.Workbooks.Open(Filename:=Me!txt_Path & "\報告書.xls")   Set db = CurrentDb   Set rs = db.OpenRecordset("qry_expt")   If rs.RecordCount > 0 Then     Do Until rs.EOF       For i = 0 To rs.Fields.Count - 1         If rs.Fields(i).Name = "顧客番号" Then           wkb.Sheets("Sheet1").Range("B10") = rs.Fields(i).Value         End If         If rs.Fields(i).Name = "氏名" Then           'ファイル名用にデータの取り出し           strName = rs.Fields(i).Value           wkb.Sheets("Sheet1").Range("E10") = rs.Fields(i).Value         End If         If rs.Fields(i).Name = "住所" Then           wkb.Sheets("Sheet1").Range("B13") = rs.Fields(i).Value         End If         If rs.Fields(i).Name = "電話番号" Then           wkb.Sheets("Sheet1").Range("B14") = rs.Fields(i).Value         End If         If rs.Fields(i).Name = "利用日" Then           'ファイル名用にデータの取り出し           '"yyyy/mm/dd"ままだとエラーを起こすので"yyyy-mm-dd"のようにフォーマット。           strDate = Format(rs.Fields(i).Value, "yyyy-mm-dd")           wkb.Sheets("Sheet1").Range("B20") = rs.Fields(i).Value         End If         '以下必要に応じてデータを設定してください。       Next i     rs.MoveNext     Loop   strFileName = "報告書_[" & strName & "]_[" & strDate & "]"   '同じ名前のファイルがあるか確認。あればコピーを中止。   If Dir(Me!txt_Path & "\" & strFileName & ".xls") <> "" Then     MsgBox "同じ名前のファイルが指定先のフォルダに存在するのでコピーを中断します。"     Exit Sub   End If   'テンプレートを保存してデータを確定   wkb.Save   objExcel.DisplayAlerts = False   'ファイルのコピー作業   Set objFSO = CreateObject("Scripting.FileSystemObject")   objFSO.CopyFile CurrentProject.Path & "\報告書.xls", Me!txt_Path & "\" & strFileName & ".xls"   objExcel.DisplayAlerts = True   Else     MsgBox ("レコードがありません")     Exit Sub   End If   wkb.Close: Set wkb = Nothing   objExcel.Quit   Set objExcel = Nothing   rs.Close: Set rs = Nothing   db.Close: Set db = Nothing   Set objFSO = Nothing End Sub 分からないところ、エラーの発生などがありましたら補足してください。

その他の回答 (3)

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

すみません。すべて訂正したつもりが一つ残っていました。 objFSO.CopyFile CurrentProject.Path & "\報告書.xls", Me!txt_Path & "\" & strFileName & ".xls" を objFSO.CopyFile Me!txt_Path & "\" & "報告書.xls", Me!txt_Path & "\" & strFileName & ".xls" に訂正してください。一応、テンプレートとコピーするファイルは 同じフォルダとしています。

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

No1です。 忘れていましたが、Excelのファイルの拡張子はxlsにしていますが、 違っていたら訂正しておいてください。何ヶ所かあります。

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

質問の内容から、クエリで取り出されるレコードは一つとします。 違っていたら補足してください。 なお、DAOを使いますのでコード表のツール、参照設定から DAOを参照するために    Microsoft DAO XXXObject Library にチェックが入っているか確認してください。XXXは数値でそれぞれの Accessのバージョンによって違いますが。これにチェックが入っていないと エラーが生じます。チェックをいれたらOKボタンを押してください。 それから、Excelも使用しますので同様に参照設定で    Microsoft Excel XXXObject Library にチェックを入れてください。 なお、日付については"yyyy/mm/dd"のようにクエリに表示されている ものとしています。違っていたら補足してください。 Sub test() Dim db As DAO.Database Dim rs As DAO.Recordset Dim objExcel As Excel.Application Dim wkb As Excel.Workbook Dim i As Long Dim strFileName As String Dim strName As String Dim strDate As String Dim objFSO As Object Set objExcel = CreateObject("Excel.Application") Set wkb = objExcel.Workbooks.Open(Filename:=CurrentProject.Path & "\報告書.xls") Set db = CurrentDb Set rs = db.OpenRecordset("qry_expt") If rs.RecordCount > 0 Then Do Until rs.EOF For i = 0 To rs.Fields.Count - 1 If rs.Fields(i).Name = "顧客番号" Then wkb.Sheets("Sheet1").Range("B10") = rs.Fields(i).Value End If If rs.Fields(i).Name = "氏名" Then 'ファイル名用にデータの取り出し strName = rs.Fields(i).Value wkb.Sheets("Sheet1").Range("E10") = rs.Fields(i).Value End If If rs.Fields(i).Name = "住所" Then wkb.Sheets("Sheet1").Range("B13") = rs.Fields(i).Value End If If rs.Fields(i).Name = "電話番号" Then wkb.Sheets("Sheet1").Range("B14") = rs.Fields(i).Value End If If rs.Fields(i).Name = "利用日" Then 'ファイル名用にデータの取り出し '"yyyy/mm/dd"ままだとファイル名の設定でエラーを起こすので"yyyy-mm-dd"のようにフォーマット strDate = Format(rs.Fields(i).Value, "yyyy-mm-dd") wkb.Sheets("Sheet1").Range("B20") = rs.Fields(i).Value End If '以下必要に応じてデータを設定してください。 Next i rs.MoveNext Loop '保存してデータを確定 wkb.Save objExcel.DisplayAlerts = False 'ファイルのコピー作業 strFileName = "報告書_[" & strName & "]_[" & strDate & "]" Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.CopyFile CurrentProject.Path & "\報告書.xls", CurrentProject.Path & "\" & strFileName & ".xls" objExcel.DisplayAlerts = True Else MsgBox ("レコードがありません") Exit Sub End If wkb.Close: Set wkb = Nothing objExcel.Quit Set objExcel = Nothing rs.Close: Set rs = Nothing db.Close: Set db = Nothing Set objFSO = Nothing End Sub わからないところがあれば補足してください。

aka_ao
質問者

補足

初歩的な質問ですみません。 Microsoft DAO XXXObject Libraryですが、既にあるモジュールで使われています。と出てしまうので、設定しなくて大丈夫ということでしょうか? また、それに関連するのか・・ Dim objExcel As Excel.Application Dim wkb As Excel.Workbook でもエラーで止まってしまうので、コメントアウトしてテスト作動してみましたが、大丈夫でしょうか? また、 エクセルのテンプレーとファイルがアクセスとは別のパスにある場合は、Set wkb = FileName:=CurrentProject.Path部分を修正すれば良いのでしょうか? ちなみに、フォームのtxt_Pathというテキストボックスに作成するのですが、どのように修正するとよろしいでしょうか? あれもこれもで申し訳ありませんが、よろしくお願いします。

関連するQ&A

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

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

  • ACCESS Excelの出力について

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

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

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

  • Accessで作りたい資料があります!

    仕事で至急作らないといけない資料なので、よろしくお願いします。 概要を説明しますと、 ・A店・B店・C店の各顧客IDの一覧表を作る ・A店には900人の顧客、B店には350人の顧客、C店には145人の顧客がいる。 ・顧客は,だぶっていることがある。(A店の顧客でもあり、B店の顧客でもある場合がある) ・今つくったテーブルは以下の4つです。  1、(延べ)全顧客の名前フィールドと顧客番号フィールド  2 、顧客番号フィールドとA店の顧客IDフィールド  3 、顧客番号フィールドとB店の顧客IDフィールド  4 、顧客番号フィールドとC店の顧客IDフィールド 顧客番号とは全店共通の番号です。顧客IDは各店でおのおのつけています。最終的に作りたい表は横軸が「全顧客名」「顧客番号」「A店」「B店」「C店」となります。そして該当する店舗のところに顧客IDがはいります。むろん空欄もあります。 どのようにクエリを作成すればいいのでしょうか。Access初心者のため本当に困っています。わかりにくい説明ですがぜひよろしくお願いします。

  • アクセス ACCESS VBAで入力の簡略化

    お盆休みに失礼します。 OS: WinMe ACCESS:2000 簡単な会員制の予約システムを作りたいのですが、 予約登録画面で、顧客の情報を入力するのではなく 入力を簡略化したいと考えています。 予約登録時に顧客番号が分かればいいのですが そうもいかないので、 顧客検索画面から検索結果を選択して 予約登録画面に移行して、その時に 顧客の氏名、住所、電話等は画面に 入力済み(又は表示済み)にしたいと考えています。 現在、検索結果(顧客情報)を持って予約画面に 入る処ができません。 1)VBAの書き方のサンプル    か 2)もっと易しい予約登録の方法  が ありましたらご指導ください。 ■顧客テーブル 1:顧客番号 2:顧客名 3:顧客住所 4:顧客電話 ■予約テーブル 1:予約番号 2:顧客番号(リレーション) 3:受付日 4:旅行日 5:行き先 ○予約登録クエリー 1:予約番号 2:顧客番号 3:顧客名 4:顧客住所 5:顧客電話 6:受付日 7:旅行日 8:行き先

  • Access 項目ごとにフォールド全データ表示

    Access2010で質問です。 よろしくお願いいたします。 Tabにある顧客番号フィールド全てに対して、 商品番号ごとに、実績が無いデータも表示させたいです。 --------------------- ・Tab(顧客情報テーブル) 顧客番号 顧客名 ・Q1(売上実績クエリ) 顧客番号, 商品名(抽出条件 Forms![フォーム1]![商品番号] Or Forms![フォーム1]![商品番号2] ) 売上実績 ・Q2(完成クエリ) 顧客番号,商品名,売上実績 1 ,商品A ,0 2 ,商品A ,2 3 ,商品A ,10 1 ,商品B ,1 2 ,商品B ,0 3 ,商品B ,5 --------------------- 選択クエリでTabフィールドを全て表示させるように結合させると、 --------------------- ・Q2(完成クエリ) 顧客番号,商品名,売上実績 1 ,商品B ,1 2 ,商品A ,2 3 ,商品A ,10 3 ,商品B ,5 --------------------- という表示になりますが、 顧客番号×商品数(A、B)のデータ数を出したいです。 単純に商品名ごとにTabとQ2結合クエリを作成し、 後でまとめるという方法もありますが、 Q1「商品名」の抽出条件は今後増える予定があるため、 できるだけ少ない数のクエリで処理できるようにしたいと思っています。 もしお分かりになれば、教えていただけないでしょうか。 どうぞよろしくお願いいたします。

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

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

  • Access]2つのテーブルを比較してフィールドの一部が一致したデータを抽出

    2つの名簿テーブルを比較してどちらのテーブルにも含まれている個人を抽出したいと考えております。 テーブル名とフィールドは以下のとおりです。 ==================== テーブル名「名簿A」 氏名 電話番号 住所 メールアドレス ==================== テーブル名「名簿B」 姓 名 電話番号 住所 メールアドレス ==================== たとえば、この2つの名簿をメールアドレスで一致したものを抽出する場合は選択クエリのデザインビューで「名簿A」のフィールドを読み込ませ、 メールアドレスフィールドの抽出条件として Like [名簿B].[メールアドレス] を入れれば抽出ができたのですが、メールアドレスは、名簿ごとに記入されていたりしなかったりするので、名前での一致を行いたいと思っています。 ここで問題なのが、名簿Aは「氏名」で入力されているのに対し、名簿Bでは「姓」と「名」が別フィールドになっております。 そこで自分なりにやってみたのが、選択クエリのデザインビューで「氏名」のフィールドの抽出条件として Like (*[名簿B].[姓]*) を設定するものでした。 これがうまくいけば最終的には Like (*[名簿B].[姓]*) And Like (*[名簿B].[名]*) という風にして、名簿Aの「氏名」フィールドに名簿Bの「姓」も「名」も入っているものを抽出できるかな?と考えたのですが、上記のように入力すると、自動的に Like ("*[名簿B].[姓]*") となってしまい、何も抽出されなくなってしまいました。 このような方法では希望する抽出は行えないのでしょうか? お分かりのかた、よろしくお願いいたします。

  • テンプレートについて

    つまらない質問なのですが宜しくお願いします。 先日、ヤフオクで落札して出品者の方からご連絡頂いたんですが、その中に【(住所等の記載は)下記のテンプレートをご利用下さい。】と書かれていました。 住所: 氏名: 電話番号: みたいな感じです。 当方パソコンを持っていないので、携帯から参加しているのですが、この場合、この順番通りに書けば良いという事でしょうか? それともPCからだと空白の部分に入力できるようになっているんでしょうか? モバオクの利用が主で、ヤフオクでもテンプレートで…という出品様は初めてなので良く分からず困っています。 拙い文章で申し訳ないですが、どうぞご教授ください。

  • Access2003でのフォーム作成について(再度です)

    民宿の顧客管理をAccessでしようかと思っています。 氏名、住所、来客日などのフィールドを持つ顧客テーブル。 来客日、その日の献立1~17までを持つ日別献立テーブル。 この2つのテーブルからクエリーを作成し、 それを基にフォームを作ってデータを両方のテーブルに振り分けしようとしたんですが、うまくいきません。 クエリーで来客日同士を結ぶとデータは表示されますが新規の入力が出来ません。 顧客テーブルの顧客ID(オートナンバー)と 日別献立テーブルに顧客ID(数値型)を挿入し、2つを結んでも一方のデータしか表示されません。 おかしいとは思いますが、何がおかしいかわかりません。 何か良い方法があればお教え下さい。

専門家に質問してみよう