質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

1017閲覧

複数回のコンボボックス選択(エリアごと)→出力を1クリックで

masayan_pyonz

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/02/28 04:20

編集2019/02/28 06:12

Access2010を使用中です

毎日、システムから取込んだCSVをツールにインポートしその日分の抽出データをフォームでエリアごとに選択し
[エリア]+[日付].PDFで指定フォルダに保存しています。

現状の流れ
1)フォームのコンボボックス(リスト)から「○○エリア」を選択→実行
2)エリアで抽出されたクエリ、レポート表示
3)レポートのボタンでPDFに出力し指定フォルダーに保存。
4)閉じるボタンでクエリ、レポートを閉じさせフォームに戻り、各エリア(12)ごとに同作業を繰り返す。

リストの例:
中央1;中央2;東1;東2;南1;南2;北1;北2;西1;西2;西3;西4

望むべき姿
1)コンボボックスに作ってある12エリアを実行ボタンひとつで同じように指定フォルダに保存。
※繰り返しの作業を1クリックですべてのエリアを出力し時短化をしたい。

以上となります。

よろしくお願い致します。

追記
Accessオブジェクト
※作動関連の一部
T_基礎データ
F_エリア選択
Q_抽出作成
<抽出条件>
DMax("受付日","データ","エリア='" & [エリア] & "'")
[Forms]![エリア選択]![cmbエリア]

実行ボタン(出力)
Private Sub 実行_Click()

'レポートをデータベースウィンドウから選択します
DoCmd.SelectObject acReport, "Q_抽出作成", acViewPreview

'[PDF]メニューを実行します
DoCmd.OutputTo acOutputReport, "Q_抽出作成", acFormatPDF, "○○" & [エリア] & Format(Date, "yyyymmdd") & ".pdf"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

具体的なところはコードを提示していただかないと的確なアドバイスができませんが、実現方法としては以下のような流れになるのではないかと思います。

'リストボックス内の項目数分ループ処理 For idx = 0 to Listbox1.Count -1 '①初期化処理(連続処理するにあたり前回の処理結果を引きずらないよう、必要に応じて変数やテーブルのクリアを行う) '②リストボックスを選択する Listbox1.index = idx '③データ抽出(実行ボタンの処理を行う。または必要な処理のみ流用する) Button1.Click '③PDF出力(抽出したデータをもとに帳票をPDFとして出力する) DoCmd.OutputTo acOutputReport, "レポート名", acFormatPDF, "PDFファイル名.pdf" '④次の処理を行うための準備(作成データのクリアなど。閉じるボタンで行っている処理を参考に、連続処理に必要なものを行う。) Next

このような処理をフォーム上に新たに追加した「連続実行」ボタンなどの処理として作成すれば、とりあえず目的の動作となるのではないでしょうか。


かなりアバウトなアドバイスなうえ、机上で作成したコードなのでそのままでは動かない部分もあると思います。
適宜手直ししてください。

具体的なテーブル構成などがわかればより効果的なアドバイスができるかもしれませんが、現時点では実現方法ひとつとして、参考になれば幸いです。

投稿2019/02/28 04:48

編集2019/02/28 08:06
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masayan_pyonz

2019/02/28 06:16

ありがとうございます。 どこにコードを書き込むか?そんなレベルですが一部オブジェクトなども追記致しました。
jawa

2019/02/28 08:30

コードの追記ありがとうございます。 「実行」ボタンをクリックしたときの処理(実行_Click)として、 ・プレビューの表示処理 ・PDFの出力処理 が両方とも行われている、ということでしょうか? PDFの出力は別ボタンで行っているという認識でいましたが、`Private Sub 実行_Click()`の中に記述されているようでしたので念のため確認です。 --- コードを記述する位置ですが、回答本文にも書いたように新しいボタン(一括実行ボタン)を新設してしまうのがラクだと思います。 そのボタンを押した時の処理`一括実行_Click()`として、 ①「cmbエリア」の項目を上から順に1つずつループ ~ループここから~ ②「cmbエリア」の項目を選択 ③PDF出力する ~ループここまで~ ④すべての項目を処理したら終了 といった処理を記述すれば、目的の動作となりそうです。 新しいボタンが作れないのなら、既存の実行ボタンの処理を書き換えることになると思います。
masayan_pyonz

2019/02/28 09:23

ありがとうございます。 書き方が悪かったのでしょうか? フォームからのレポートの表示、 レポートの出力(印刷)ボタンという意味でした。 関係者に確認したところ、個別でチェックしたい場合と一括、両パターンの方か良さそうです。 明日、作業したいと思います。 ご丁寧にありがとうございました。
jawa

2019/02/28 09:34

実行ボタン(出力)の処理 >Private Sub 実行_Click() では >'レポートをデータベースウィンドウから選択します >DoCmd.SelectObject acReport, "Q_抽出作成", acViewPreview を行っていて、 >'[PDF]メニューを実行します >DoCmd.OutputTo acOutputReport, "Q_抽出作成", acFormatPDF, "○○\" & [エリア] & Format(Date, "yyyymmdd") & ".pdf" は別ボタンからの処理で実行されているということですかね。 それならこちらの認識とも一致です。 機能は新規ボタンで作れば良さそうということですね。 まずは頑張ってみて、また詰まるところがあればお気軽にご質問ください。
masayan_pyonz

2019/03/01 05:31

実際にやってみました。 再度、現状のF_エリア選択のコンボBOX(エリア)選択後の作動 ① Private Sub 実行_Click() 'Q_要求オーダー抽出作成の表示 DoCmd.OpenQuery "オーダー抽出作成", acViewNormal 'R_要求オーダー抽出作成の表示 DoCmd.OpenReport "品要求オーダー抽出作成", 5 End Sub →抽出のデーターシートビューとレポートが表示 ②レポートの出力 Private Sub 実行_Click() DoCmd.SelectObject acReport, "要求オーダー抽出作成", acViewPreview DoCmd.OutputTo acOutputReport, "要求オーダー抽出作成", acFormatPDF, "要求書出力" & [エリア] & Format(Date, "yyyymmdd") & ".pdf" End Sub ご指導頂きましたコンボの一括実行ボタンを下記のように設置しましたが 全く的外れでしょうか? Private Sub 一括実行_Click() 'リストボックス内の項目数分ループ処理 For idx = 0 To cmbエリア.Count - 1 '①初期化処理(連続処理するにあたり前回の処理結果を引きずらないよう、必要に応じて変数やテーブルのクリアを行う) '②リストボックスを選択する cmbエリア.Index = idx '③データ抽出(実行ボタンの処理を行う。または必要な処理のみ流用する) 一括実行.Click '③PDF出力(抽出したデータをもとに帳票をPDFとして出力する) DoCmd.OutputTo acOutputReport, "要求オーダー抽出作成", acFormatPDF, "フォルダ名" & [エリア] & Format(Date, "yyyymmdd") & ".pdf" '④次の処理を行うための準備(作成データのクリアなど。閉じるボタンで行っている処理を参考に、連続処理に必要なものを行う。) Next End Sub
jawa

2019/03/01 07:05

まず、 データ抽出用のクエリ:「オーダー抽出作成」 レポート名:「要求オーダー抽出作成」 という認識でアドバイスしますが、あっているでしょうか? もうひとつ、実行ボタンのクリックイベントを①と②の2種類提示いただきましたが、これはそれぞれ ①コンボボックス選択後に押す「実行ボタン」 ②PDF出力するときに押す「実行ボタン」 で、それぞれの実行ボタン_Clickイベントが記述されている、ということですよね? 一応、この前提でアドバイスさせていただきます。 --- >全く的外れでしょうか? そんなに的外れにはなっていないと思いますよ。 ただ、 >'③データ抽出(実行ボタンの処理を行う。または必要な処理のみ流用する) >一括実行.Click の部分がちょっと違いますね。 これだと「一括実行ボタン」を押した処理の中で、さらに「一括実行ボタン」を押しなおすような流れになってしまいます。 ここでやりたかったことは、もともとある「実行ボタン」と同じような処理を、ループ処理の中で何度も繰り返し実行したかったのです。 ですので、そのまま書くなら ``` For ~ ’(中略) '③データ抽出(実行ボタンの処理を行う。または必要な処理のみ流用する) 実行_Click() ’(中略) Next ``` といった形になります。 しかし実際には「実行ボタン」の処理では「クエリの抽出」と「プレビュー表示」を行っています。 これをそのまま実行してしまうと、1件処理するたびに「プレビュー表示」されてしまうことになります。 それでは面倒ですよね。 なので、「実行ボタン」で行っている処理を全部やるのではなく、「クエリの抽出」の部分だけを行って、PDF出力するようにします。 ``` For ~ ’(中略) '③データ抽出(実行ボタンの処理を行う。または必要な処理のみ流用する) 'Q_要求オーダー抽出作成の表示 DoCmd.OpenQuery "オーダー抽出作成", acViewNormal '④PDF出力(抽出したデータをもとに帳票をPDFとして出力する) DoCmd.OutputTo acOutputReport, "要求オーダー抽出作成", acFormatPDF, "フォルダ名" & [エリア] & Format(Date, "yyyymmdd") & ".pdf" Next ``` イメージとしてはこんな感じになるのではないかと思います。 如何でしょうか?
masayan_pyonz

2019/03/01 12:33

ご丁寧にありがとうございます。 本日は別の業務に取り掛かり、自宅へは持ち帰れないので月曜日の作業になります。 ありがとうございました。
masayan_pyonz

2019/03/05 03:58

色々と要望などが有り返答遅くなりました。 このように設置致しました。↓ Private Sub 実行_Click() Dim p As String s = Me!責任者 p = InputBox("パスワードを入力してください", "入力") i = s & p MsgBox i If DCount("*", "T_承認", "[ID]='" & i & "'") > 0 Then MsgBox "パスワードOK", Buttons:=vbInformation Else MsgBox "パスワードが違います!", Buttons:=vbCritical End If 'リストボックス内の項目数分ループ処理 For idx = 0 To cmbエリア.Count - 1 '①初期化処理(連続処理するにあたり前回の処理結果を引きずらないよう、必要に応じて変数やテーブルのクリアを行う) '②リストボックスを選択する cmbエリア.Index = idx '③データ抽出(実行ボタンの処理を行う。または必要な処理のみ流用する) 'Q_要求オーダー抽出作成の表示 DoCmd.OpenQuery "オーダー抽出作成", acViewNormal '④PDF出力(抽出したデータをもとに帳票をPDFとして出力する) DoCmd.OutputTo acOutputReport, "オーダー抽出作成", acFormatPDF, "要求書出力" & [エリア] & Format(Date, "yyyymmdd") & ".pdf" Next End Sub ですが、「For idx = 0 To cmbエリア.Count - 1」の「.Count」で"コンパイルエラー、メゾネットまたはメンバーがみつかりません"と出てしまいます。
jawa

2019/03/05 04:19 編集

机上コードなので、.NET的な文法になってしまっていましたね。 申し訳ありません。 意図としては、「コンボボックスに表示される候補の件数」を取得し、ループしたいというものでした。 cmbエリア.ListCount に置き換えれば動作するのではないかと思います。 もうひとつ、cmbエリア.Index も cmbエリア.ListIndex の誤りでした。 こちらも読み替えをお願いします。
masayan_pyonz

2019/03/05 05:41

早速にご回答ありがとうございました。 今度は「cmbエリア.ListIndex = idx」でエラーです。 この辺は意味を理解出来ず、自分の力不足ですが・・・
masayan_pyonz

2019/03/05 06:23

エラー補足です。 実行エラー ”7777” ListIndex プロパティの使い方が正しくありません。 以上です。
jawa

2019/03/05 07:21

cmbエリア.ListIndex は、コンボボックスの候補の中で現在何番目が選択されているかを表すプロパティです。 このプロパティの値を変更すると、コンボボックスの選択も変更されるというわけです。 ``` For idx = 0 To cmbエリア.ListCount - 1 cmbエリア.ListIndex = idx MsgBox cmbエリア.SelText Next ``` 今回は机上ではなく、こちらの環境で上記のようなコードで動作確認をとれています。 差支えなければ変更後のコードを提示いただけますか?
jawa

2019/03/05 07:25

調べてみたところ、コンボボックスにフォーカスがないとListindexを変更できないようです。 Listindexを変更する前に、cmbエリア.SetFocus でフォーカスを与えればエラーにならなくなると思います。
masayan_pyonz

2019/03/06 01:05

作動確認致しました。 コードは下記の通りです。 -------------------------------------------- Private Sub 実行_Click() For idx = 0 To cmbエリア1.ListCount - 1 cmbエリア.SetFocus cmbエリア.ListIndex = idx MsgBox cmbエリア1.SelText Next DoCmd.OpenQuery "要求オーダー抽出作成", acViewNormal DoCmd.OutputTo acOutputReport, "要求オーダー抽出作成", acFormatPDF, "要求書出力" & "\" & Format(Date, "yyyymmdd") & [エリア] & Format(Date, "yyyymmdd") & ".pdf" End Sub -------------------------------------------- 結果は・・・ 順次エリアのMsgboxでOKを押し出力画面が出ましたが出力されたPDFはフォルダー外に1番目のファイルのみとなりました。
sazi

2019/03/06 02:15

[エリア] って何ですか? cmbエリアと連動しているものですか? 単に、& [エリア] &の代わりに& cmbエリア & を指定すれば良さそうですが。
jawa

2019/03/06 02:50 編集

そのまま期待する動作となるコードを提供しているわけではないので、もうすこしコードを理解して自分のものにしていきましょう。 エラーがでたらまずは自分で調べるというのも、自分の力をつけるために必要なことです。 それでもわからなければ、もしくは何を調べたらいいのかもわからなければ、その旨遠慮なく質問してください。 --- 今回やろうとしていることは「コンボボックスの候補を上から順に選択していき、それぞれに対してPDFを出力していく」という処理ですよね。 ここまでは大丈夫でしょうか? そのうえで、「コンボボックスを順に選択する」という部分が前回のコメントで提供したコードです。 繰り返し処理をするのがFor~Nextです。 コンボボックスの中の候補の数だけ繰り返しています。 候補を選択しているのが.ListIndexプロパティです。 ただ、候補を変える前にコンボボックスにフォーカスがないとエラーが発生するため、事前にSetFocusしています。 ループ内最後のMsgboxは、ちゃんと選択が変化していっているか確認するために、選択されているリスト項目を表示するものです。 つまりデバッグ用の1行ですので、確認ができれば最終的には不要となります。 以上でコンボボックスを上から順に選択していくところまではできたと思います。 そのうえで、本来は「選択した項目をメッセージ表示」したいのではなく、「PDF出力」したいのですよね? では、どこに何を記述すればいいのか? がんばってみてください。
masayan_pyonz

2019/03/06 08:00

@jawaさん、おっしゃる通りでございます。 結論から申し上げますが無事、作動致しました。 >繰り返し処理をするのがFor~Nextです。 >どこに何を記述すればいいのか? を理解出来ていなかったようです。 出力実行コードの後に「Next」を入れ、繰り返し処理が出来ました。 又、日付フォルダーに入らなかった件も指定フォルダの後の「"\"」も抜けていました。 情報も少ない中ご丁寧に何度も相手をして下さり、面倒でしたでしょうが感謝しております。 おかげさまで自分でも調べながら確認し、少しはコードも理解出来るようになりました。 まだまだこの件で細かい修正点・機能追加希望はありますのでがんばりたいと思います。 このたびはありがとうございました。
jawa

2019/03/06 08:12

無事動作したようで、何よりです。 コーディングは行き詰っては調べて、行き詰っては調べてのループ処理です(^-^; しかもFor~Nextではなく終わりの見えないDo~Loop。(←意味がわからなければ調べてみましょう! でも苦労したことは無駄にはならないので、ひとつずつがんばってください。
guest

0

1)フォームのコンボボックス(リスト)から「○○エリア」を選択→実行

エリアをマスターのテーブル化する。※コンボボックスのレコードソースはそのテーブルにしておく。

2)エリアで抽出されたクエリ、レポート表示

自動で出力ならプレビューは不要なので処理は削除

3)レポートのボタンでPDFに出力し指定フォルダーに保存。

エリアのテーブルを元にループする。
ループ内ではコンボボックスの値を変更。
※現状はコンボボックスを利用しているという事なので、コンボボックスのイベント処理が特に無ければ
一番影響が無い。イベント処理があるようなら、非表示のダミーのコンボボックスを追加して、クエリーを合わせる。

上記により4)は不要になりますね。

追記

VBA

1 'リストボックス内の項目数分ループ処理 2 For idx = 0 To cmbエリア.ListCount - 1 3 '②リストボックスを選択する 4 cmbエリア = cmbエリア.ItemData(idx) 5 '④PDF出力(抽出したデータをもとに帳票をPDFとして出力する) 6 DoCmd.OutputTo acOutputReport, "オーダー抽出作成", acFormatPDF, "要求書出力" & cmbエリア & Format(Date, "yyyymmdd") & ".pdf" 7 Next

投稿2019/02/28 04:42

編集2019/03/05 06:58
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masayan_pyonz

2019/02/28 06:22

1)の >エリアをマスターのテーブル化する。 とは・・・ 2)については理解いたしました。 >エリアのテーブルを元にループする。 >ループ内ではコンボボックスの値を変更。 >※現状はコンボボックスを利用しているという事なので、コンボボックスのイベント処理が特に無けれ >ば一番影響が無い。 >イベント処理があるようなら、非表示のダミーのコンボボックスを追加して、クエリーを合わせる。 イベント処理はありません。
masayan_pyonz

2019/02/28 06:25

Q; 書き方は値集合ソースみたいに書いてしまってますがエリアは「T_エリア」であります。
sazi

2019/02/28 06:53 編集

イベントが無くテーブルの内容という事なら、jawaさんの書かれているようにコンボボックスの選択状態を変更するやり方の方が、手間いらずだと思います。
sazi

2019/03/05 07:04 編集

jawaさんのところのコメントのコードに対しての添削を追記しました。 ListIndexは参照しかできません。
masayan_pyonz

2019/03/06 02:06

追記ありがとうございました。 For idx = 0 To cmbエリア1.ListCount - 1 cmbエリア.SetFocus cmbエリア.ListIndex = idx MsgBox cmbエリア1.SelText Next 順次エリアのMsgboxでOKを押し出力画面が出ましたが出力されたPDFはフォルダー外に1番目のファイルのみとなってしまいました。 すべてのファイルが保存できませんでした。
sazi

2019/03/06 02:08 編集

何故私が追記したものとは違うコードなんですか?
sazi

2019/03/06 02:11

ああ、jawaさんの方で新たにやっている部分ですか。 私の提示したコードは試されました?
jawa

2019/03/06 02:55

saziさん、補足ありがとうございます。 なるほど、そうすればフォーカスを当てなくても選択を変えられるのですね。 ちなみに同名の選択候補があっても大丈夫なんですかね? コンボボックスの性質上、同名の候補が複数あること自体避けるべきなので、あまり考える必要もないことかもしれませんが(^-^;
sazi

2019/03/06 03:20

@jawaさん プロパティ変更について、コントロールをactiveにすれば設定できるものがあるパターンを失念していました。 同名があっても、何れかが選択されたと思います。 今回は、コンボボックスの内容をファイル名の一部にするようなので同名は無いと思いますけど。
masayan_pyonz

2019/03/06 04:12

試しましたが下記がエラーになりました cmbエリア = cmbエリア.ItemData(idx)
sazi

2019/03/06 04:16

cmbエリアの表示内容と連結列が異なっているんでしょう。 では、jawaさんの回答での対応ですね。
masayan_pyonz

2019/03/06 08:02

@saziさん 結論から申し上げますが無事、作動致しました。 繰り返し処理をするのがFor~Next。 「どこに何を記述すればいいのか? 」を理解出来ていなかったようです。 出力実行コードの後に「Next」を入れ、繰り返し処理が出来ました。 又、日付フォルダーに入らなかった件も指定フォルダの後の「"\"」も抜けていました。 情報も少ない中ご丁寧に何度ものお付き合い、面倒でしたでしょうが感謝しております。 おかげさまで自分でも調べながら確認し、少しはコードも理解出来るようになりました。 まだまだこの件で細かい修正点・機能追加希望はありますのでがんばりたいと思います。 前回の質問と合わせ、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問