Microsoft Access 掲示板

AccessのクエリデータをExcelのテンプレートに挿入したい

5 コメント
views
4 フォロー

お世話になっております。
表題の件について質問致します。

Excelでもともと作成していたテンプレートですが、データ管理の点からAccessに移行したほうが使いやすいと考え
Accessでデータを管理することになりました。
しかし、データの管理はAccessでいいのですがテンプレートはAccessだと扱いずらく、色々と加工もしたいのでExcelで行いたいです。

そこで色々調べた結果こちらのサイト↓
AccessからExcelのテンプレートシートを利用するプログラム例

が一番近いのかなと思いました。

ここで質問ですが、私の場合は種別フィールドの入力されているデータごとにExcelのファイルを出力したいです。

例えば
ID   氏名    種別   ・・・
1    ○○    特別会員
2    ○△    通常会員
3    ○    通常会員
4    ○□    特別会員
5    □    ビジター

とあった場合Excelファイルは特別会員のExcelファイル、通常会員のExcelファイル、ビジターのExcelファイル3つを出力したいです。
シートを分けるのではなく、ファイルを分けるということです。

分かりずらく申し訳ありませんが、こちらの方法がわかる方教えていただければと思います。

【3/11追記】

上の質問と別件になりますが、

URL先のコードですが実行するとエラーが出てしまいました。

'テンプレートの保存先フォルダ
  Const cstrTemplateDir As String = "C:\テスト\"
  'テンプレートのファイル名
  Const cstrTemplateBook As String = "受注伝票テンプレート.xlsx"
  'データが代入されたファイルの保存先フォルダ
  Const cstrSaveBookDir As String = "C:\テスト\"

ここで指定したファイルパスが間違っていると出ます。
実行時エラーは1004です。
しかし、確かにここに格納されていますし、Shift+右クリックでパスのコピーをしてそのまま貼り付けています。
そしてデバッグを押すと、

'テンプレートファイルを開く
    .Workbooks.Open cstrTemplateDir & cstrTemplateBook

ここが黄色くなります。

この原因がわかる方いましたら教えて頂きたいです。

bunta
作成: 2021/03/10 (水) 16:47:57
最終更新: 2021/03/11 (木) 10:22:36
通報 ...
1
hiroton 2021/03/11 (木) 09:16:28 26d02@f966d

質問がざっくりなので回答もざっくりになりますが

「共通部分はひとまとめに、処理を変えたいところは変数にしてプログラム内で任意に変更できるように」します

リンク先のコードを参考にするなら

  'データ元のクエリを開く
  Set dbs = CurrentDb
  Set rst = dbs.OpenRecordset("qsel受注伝票")


    '保存するファイル名のフルパスを組み立て
    strSaveBookPath = cstrSaveBookDir & "受注伝票_" & Format$(lngOrderID, "00000") & ".xlsx"

この部分が変数にする(固定では困る)部分ですかね

例えば

Public Sub ExcelTemplateSample(queryName As String, fileName As String)

  'データ元のクエリを開く
  Set dbs = CurrentDb
  Set rst = dbs.OpenRecordset(queryName)


    '保存するファイル名のフルパスを組み立て
    strSaveBookPath = cstrSaveBookDir & fileName & ".xlsx"

のように変更して

Sub test()
  ExcelTemplateSample "qsel特別会員", "特別会員"
  ExcelTemplateSample "qsel通常会員", "通常会員"
  ExcelTemplateSample "qselビジター", "ビジター"
End Sub

と、出力処理を3回実行してやればファイルを3つ作ることができます

2
bunta 2021/03/11 (木) 10:21:16 3e392@fa49d

回答いただきありがとうございます。

Sub test()
  ExcelTemplateSample "qsel特別会員", "特別会員"
  ExcelTemplateSample "qsel通常会員", "通常会員"
  ExcelTemplateSample "qselビジター", "ビジター"
End Sub

こちらですが、特別会員、通常会員、ビジターの3つのクエリを作成するということでしょうか?

また、質問で提示したURL先のコードですが実行するとエラーが出てしまいました。

'テンプレートの保存先フォルダ
  Const cstrTemplateDir As String = "C:\テスト\"
  'テンプレートのファイル名
  Const cstrTemplateBook As String = "受注伝票テンプレート.xlsx"
  'データが代入されたファイルの保存先フォルダ
  Const cstrSaveBookDir As String = "C:\テスト\"

ここで指定したファイルパスが間違っていると出ます。
実行時エラーは1004です。
しかし、確かにここに格納されていますし、Shift+右クリックでパスのコピーをしてそのまま貼り付けています。
そしてデバッグを押すと、

'テンプレートファイルを開く
    .Workbooks.Open cstrTemplateDir & cstrTemplateBook

ここが黄色くなります。

原因が分からず困っています・・・
もしこの原因がわかるようでしたら教えて頂けるとありがたいです。

重ねての質問になり申し訳ありません。

元の質問にも追記しました。

3
hiroton 2021/03/11 (木) 11:04:12 26d02@f966d >> 2

こちらですが、特別会員、通常会員、ビジターの3つのクエリを作成するということでしょうか?

考え方として、3つファイルを出力したいのなら3回出力処理をすればいいですよ。という内容ですね(質問がざっくりだったので)

「種別」が決め打ちできる程度なら決め打ちで作成してもいいですし、出力内容を自動認識させたいならそれはそれでやり方もあります。参考コードだけでやり取りするのは齟齬の元なのでまずは1ファイルでもいいので出力できるコードができてからですね


エラーが出ている部分は特別な処理をしていないよくあるEXCELファイルを開くだけなので原因はよくわかりません

.Workbooks.Open "C:\テスト\受注伝票テンプレート.xlsx"

のように直接記述すると動作しますか?

Debug.Print cstrTemplateDir & cstrTemplateBook
.Workbooks.Open cstrTemplateDir & cstrTemplateBook

として、エラーが出る直前でcstrTemplateDir & cstrTemplateBookの内容を確認すると実際に存在するファイルパスになっていますか?

4
bunta 2021/03/11 (木) 11:22:29 3e392@fa49d

回答ありがとうございます。
ファイルの件提示してい頂いた内容をもとに考えてみたいと思います。
ありがとうございました。

エラーの件ですが、

.Workbooks.Open "C:\テスト\受注伝票テンプレート.xlsx"

こちらに書き換えたところエラーが移り変わりました。

 'ワークシートをコピー
    .Workbooks(cstrTemplateBook).Worksheets("sheet1").Copy

次はこれにエラーが出て、実行時エラー9「インデックスが有効範囲にありません」と出ます、、
やはりファイルが悪さしてるのでしょうか?
ちなみにシート名も間違いがないようコピーして貼り付けています、、

5
hiroton 2021/03/11 (木) 14:58:53 26d02@f966d

ファイル自体が悪さをしているというのはあまり経験がありません。コード自体は単純な処理なので、パス、ファイル名の作り方や単純なタイプミスをまず疑ってしまいます

コピー処理の前後を次のようにするとどうなりますか?

If Dir(cstrTemplateDir & cstrTemplateBook) = "" Then
    MsgBox cstrTemplateDir & cstrTemplateBook & "は存在しません"
End If

Dim xlBook As Object

 'ワークシートをコピー
    Set xlBook = .Workbooks(cstrTemplateBook)
    xlBook.Worksheets("sheet1").Copy
    Set xlBook = Nothing