複数回のコンボボックス選択(エリアごと)→出力を1クリックで
- 評価
- クリップ 0
- VIEW 592
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"
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
具体的なところはコードを提示していただかないと的確なアドバイスができませんが、実現方法としては以下のような流れになるのではないかと思います。
'リストボックス内の項目数分ループ処理
For idx = 0 to Listbox1.Count -1
'①初期化処理(連続処理するにあたり前回の処理結果を引きずらないよう、必要に応じて変数やテーブルのクリアを行う)
'②リストボックスを選択する
Listbox1.index = idx
'③データ抽出(実行ボタンの処理を行う。または必要な処理のみ流用する)
Button1.Click
'③PDF出力(抽出したデータをもとに帳票をPDFとして出力する)
DoCmd.OutputTo acOutputReport, "レポート名", acFormatPDF, "PDFファイル名.pdf"
'④次の処理を行うための準備(作成データのクリアなど。閉じるボタンで行っている処理を参考に、連続処理に必要なものを行う。)
Next
このような処理をフォーム上に新たに追加した「連続実行」ボタンなどの処理として作成すれば、とりあえず目的の動作となるのではないでしょうか。
かなりアバウトなアドバイスなうえ、机上で作成したコードなのでそのままでは動かない部分もあると思います。
適宜手直ししてください。
具体的なテーブル構成などがわかればより効果的なアドバイスができるかもしれませんが、現時点では実現方法ひとつとして、参考になれば幸いです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
1)フォームのコンボボックス(リスト)から「○○エリア」を選択→実行
エリアをマスターのテーブル化する。※コンボボックスのレコードソースはそのテーブルにしておく。
2)エリアで抽出されたクエリ、レポート表示
自動で出力ならプレビューは不要なので処理は削除
3)レポートのボタンでPDFに出力し指定フォルダーに保存。
エリアのテーブルを元にループする。
ループ内ではコンボボックスの値を変更。
※現状はコンボボックスを利用しているという事なので、コンボボックスのイベント処理が特に無ければ
一番影響が無い。イベント処理があるようなら、非表示のダミーのコンボボックスを追加して、クエリーを合わせる。
上記により4)は不要になりますね。
追記
'リストボックス内の項目数分ループ処理
For idx = 0 To cmbエリア.ListCount - 1
'②リストボックスを選択する
cmbエリア = cmbエリア.ItemData(idx)
'④PDF出力(抽出したデータをもとに帳票をPDFとして出力する)
DoCmd.OutputTo acOutputReport, "オーダー抽出作成", acFormatPDF, "要求書出力" & cmbエリア & Format(Date, "yyyymmdd") & ".pdf"
Next
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.96%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/02/28 15:16
どこにコードを書き込むか?そんなレベルですが一部オブジェクトなども追記致しました。
2019/02/28 17:30
「実行」ボタンをクリックしたときの処理(実行_Click)として、
・プレビューの表示処理
・PDFの出力処理
が両方とも行われている、ということでしょうか?
PDFの出力は別ボタンで行っているという認識でいましたが、`Private Sub 実行_Click()`の中に記述されているようでしたので念のため確認です。
---
コードを記述する位置ですが、回答本文にも書いたように新しいボタン(一括実行ボタン)を新設してしまうのがラクだと思います。
そのボタンを押した時の処理`一括実行_Click()`として、
①「cmbエリア」の項目を上から順に1つずつループ
~ループここから~
②「cmbエリア」の項目を選択
③PDF出力する
~ループここまで~
④すべての項目を処理したら終了
といった処理を記述すれば、目的の動作となりそうです。
新しいボタンが作れないのなら、既存の実行ボタンの処理を書き換えることになると思います。
2019/02/28 18:23
書き方が悪かったのでしょうか?
フォームからのレポートの表示、
レポートの出力(印刷)ボタンという意味でした。
関係者に確認したところ、個別でチェックしたい場合と一括、両パターンの方か良さそうです。
明日、作業したいと思います。
ご丁寧にありがとうございました。
2019/02/28 18:34
>Private Sub 実行_Click()
では
>'レポートをデータベースウィンドウから選択します
>DoCmd.SelectObject acReport, "Q_抽出作成", acViewPreview
を行っていて、
>'[PDF]メニューを実行します
>DoCmd.OutputTo acOutputReport, "Q_抽出作成", acFormatPDF, "○○\" & [エリア] & Format(Date, "yyyymmdd") & ".pdf"
は別ボタンからの処理で実行されているということですかね。
それならこちらの認識とも一致です。
機能は新規ボタンで作れば良さそうということですね。
まずは頑張ってみて、また詰まるところがあればお気軽にご質問ください。
2019/02/28 20:56
2019/03/01 14: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
2019/03/01 16: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
```
イメージとしてはこんな感じになるのではないかと思います。
如何でしょうか?
2019/03/01 21:33
本日は別の業務に取り掛かり、自宅へは持ち帰れないので月曜日の作業になります。
ありがとうございました。
2019/03/05 12: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」で"コンパイルエラー、メゾネットまたはメンバーがみつかりません"と出てしまいます。
2019/03/05 13:09 編集
申し訳ありません。
意図としては、「コンボボックスに表示される候補の件数」を取得し、ループしたいというものでした。
cmbエリア.ListCount に置き換えれば動作するのではないかと思います。
もうひとつ、cmbエリア.Index も cmbエリア.ListIndex の誤りでした。
こちらも読み替えをお願いします。
2019/03/05 14:41
今度は「cmbエリア.ListIndex = idx」でエラーです。
この辺は意味を理解出来ず、自分の力不足ですが・・・
2019/03/05 15:23
実行エラー ”7777”
ListIndex プロパティの使い方が正しくありません。
以上です。
2019/03/05 16:21
このプロパティの値を変更すると、コンボボックスの選択も変更されるというわけです。
```
For idx = 0 To cmbエリア.ListCount - 1
cmbエリア.ListIndex = idx
MsgBox cmbエリア.SelText
Next
```
今回は机上ではなく、こちらの環境で上記のようなコードで動作確認をとれています。
差支えなければ変更後のコードを提示いただけますか?
2019/03/05 16:25
Listindexを変更する前に、cmbエリア.SetFocus でフォーカスを与えればエラーにならなくなると思います。
2019/03/06 10: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番目のファイルのみとなりました。
2019/03/06 11:15
単に、& [エリア] &の代わりに& cmbエリア & を指定すれば良さそうですが。
2019/03/06 11:48 編集
エラーがでたらまずは自分で調べるというのも、自分の力をつけるために必要なことです。
それでもわからなければ、もしくは何を調べたらいいのかもわからなければ、その旨遠慮なく質問してください。
---
今回やろうとしていることは「コンボボックスの候補を上から順に選択していき、それぞれに対してPDFを出力していく」という処理ですよね。
ここまでは大丈夫でしょうか?
そのうえで、「コンボボックスを順に選択する」という部分が前回のコメントで提供したコードです。
繰り返し処理をするのがFor~Nextです。
コンボボックスの中の候補の数だけ繰り返しています。
候補を選択しているのが.ListIndexプロパティです。
ただ、候補を変える前にコンボボックスにフォーカスがないとエラーが発生するため、事前にSetFocusしています。
ループ内最後のMsgboxは、ちゃんと選択が変化していっているか確認するために、選択されているリスト項目を表示するものです。
つまりデバッグ用の1行ですので、確認ができれば最終的には不要となります。
以上でコンボボックスを上から順に選択していくところまではできたと思います。
そのうえで、本来は「選択した項目をメッセージ表示」したいのではなく、「PDF出力」したいのですよね?
では、どこに何を記述すればいいのか?
がんばってみてください。
2019/03/06 17:00
結論から申し上げますが無事、作動致しました。
>繰り返し処理をするのがFor~Nextです。
>どこに何を記述すればいいのか? を理解出来ていなかったようです。
出力実行コードの後に「Next」を入れ、繰り返し処理が出来ました。
又、日付フォルダーに入らなかった件も指定フォルダの後の「"\"」も抜けていました。
情報も少ない中ご丁寧に何度も相手をして下さり、面倒でしたでしょうが感謝しております。
おかげさまで自分でも調べながら確認し、少しはコードも理解出来るようになりました。
まだまだこの件で細かい修正点・機能追加希望はありますのでがんばりたいと思います。
このたびはありがとうございました。
2019/03/06 17:12
コーディングは行き詰っては調べて、行き詰っては調べてのループ処理です(^-^;
しかもFor~Nextではなく終わりの見えないDo~Loop。(←意味がわからなければ調べてみましょう!
でも苦労したことは無駄にはならないので、ひとつずつがんばってください。