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

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

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

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

Q&A

2回答

4197閲覧

Accessのレポートで列の数が動的に変化するときの作成方法

moge56

総合スコア4

Access

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

0グッド

0クリップ

投稿2022/08/11 08:32

編集2022/08/11 08:35

前提

Microsoft Accessを使ってレポート作成をしています。
クロス集計した結果をレポートに反映させたいのですが、
列の数が動的に変化するため、改ページして2枚目以降のレポート作成をどのようにすればいいのか試行錯誤しています。
クロス集計で表示したい内容を出すところまではできましたが、
レポートの表示列が固定(?)なため、何列ごとに改ページするというような内容をVBでコードを書いていくしかないと思いますが、何列目が終わったら改ページして再度同様の内容で続きの集計結果を描写するという方法が思いつきません。
お知恵をお貸しいただけますと幸いです。

実現したいこと

  • 指定した年月の範囲を抽出条件としてクロス集計する
  • 一番左の列(日)は固定で、1日~31日を表示
  • 次の列から指定した年月日の範囲を表示

 <例> 2017年05月~2019年03月を抽出条件として指定して、その範囲の検索結果を表示

  • 指定した年月の範囲はクエリの列固定とする
  • 1枚の列表示は「日」の項目を合わせて5列表示とする

クロス集計結果

2021-012022-022022-032022-042022-052022-06---
金額金額金額金額金額金額
1日700001000000
2日3000060000100000
3日50000100000
4日1000080000
5日20000
6日40000
7日200000
8日

上記内容を下記のような形にレポート作成することは可能でしょうか?

  • 1枚目
2021-012022-022022-032022-04
金額金額金額金額
1日70000
2日3000060000
3日50000
4日1000080000
5日20000
6日40000
7日200000
8日
  • 2枚目
2021-052022-06
金額金額
1日1000000
2日10000030000
3日100000
4日
5日20000
6日
7日
8日

該当のソースコード

  • 日付テーブル(内容は1-31)
  • 販売テーブル
ID取引先コード取引先名商品コード商品名単価数量日付
11A商店11111商品A100102022/7/1
21A商店11111商品A10052022/7/14
31A商店11111商品A10062022/7/21
41A商店11111商品A10012022/6/16
51A商店11111商品A100222022/6/10
61A商店11111商品A10032022/6/14
71A商店11111商品A10072022/5/18
81A商店11111商品A10082022/5/27
91A商店11111商品A10092022/8/5
101A商店11111商品A100162022/8/9
111A商店11111商品A10052022/8/7
  • 集計クエリ
SELECT Format$(販売クエリ.日付, "yyyy-mm-01") AS [month], Day(販売クエリ.日付) AS 日, 販売クエリ.日付, 販売クエリ.取引先コード, 販売クエリ.取引先名, 販売クエリ.商品コード, 販売クエリ.商品名, [数量]*[単価] AS 値 FROM 販売クエリ;
  • クロス集計
TRANSFORMMin(Q_1.値) AS 値の最小 SELECT F_日付.日付 FROM F_日付 LEFT JOIN Q_1 ON F_日付.日付 = Q_1.日 GROUP BY F_日付.日付, Q_1.日付 PIVOT Q_1.Month IN ("2022-01-01","2022-02-01","2022-03-01","2022-04-01","2022-05-01","2022-06-01")

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

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

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

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

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

hatena19

2022/08/11 11:05

1ページは4か月分(4列)の表示ですが、列数は最大何列までですか。 また、行数は最小は何行、最大は何行でしょう。最大の場合は、1ページに収まりますか。
moge56

2022/08/11 11:34

列数はユーザーが指定する年月の範囲なので1つ以上~で最大何列になるかは不明です。 また、行数は1日~31日の31行で固定です。 1ページに31行と4か月分毎に表示したいと考えております。
hatena19

2022/08/11 11:36

日付テーブル(内容は1-31) とのことですので、行は31行固定ということですね。 この31行は1ページに収まりますか。
hatena19

2022/08/11 11:37

あっ、かぶりました。 状況は把握できました。
moge56

2022/08/11 11:39

最初は、1日~31日の行を列にして(31行と固定なため)、何か月分のデータを行にして・・と考えていましたが、 1日~31日を縦表示にしたいためぐるぐる悩み中です。。。
moge56

2022/08/15 04:54 編集

hatena19様 もし可能であれば、追加で質問させていただきたいのですが、 Accessのクエリは、100個UNION ALLするのと、数千回ループして一時テーブルにインサートするのはどちらが好ましいかご存じでしょうか?UNION ALLは重い処理で有名なのであまりするべきではないと思うのですが、かといってループを何千回するのもどうかと思いお尋ねしました。(年月と日の組み合わせを作成するときにふと思いました)
guest

回答2

0

とりあえずアイデアだけいつくか提案しておきます。
自身でやりやすそうなものにチャレンジしてみてください。(人により得意、不得意があるで)
そこで行き詰ったら、どこまでできて、どこが分からないか、再質問してください。

案1

(日、列1、列2、列3、列4) というフィールドを持つ一時テーブルを作成しておいて、
そこにVBAでクロス集計クエリをレコードセットとして開いて、
最初の4か月分の値を31日分追加する、
次の4か月分を31日分追加する、・・・・
というのを最後の年月まで繰り返す。
この一時テーブルをレポートのレコードソースにする。

案2

集計クエリで(列、ページ)の演算フィールドを追加して、下記のような出力になるようにする。

日付年月ページ
2022/1/1102022-0111
・・・・・・・・・・・・・・・
2022/1/31102022-0111
2022/2/1102022-0221
・・・・・・・・・・・・・・・
2022/2/28102022-0221
2022/3/1102022-0331
・・・・・・・・・・・・・・・
2022/3/31102022-0331
2022/4/1102022-0441
・・・・・・・・・・・・・・・
2022/4/30102022-0441
2022/5/1102022-0512
・・・・・・・・・・・・・・・
2022/5/31102022-0512

これから、列見出しに「列」を、行見出しに「Day(日付)」でクロス集計クエリを作成。
これをレポートのレコードソースにして、ページでグループ化して、グループフッターで改ページ。

案3

日フィールド(1日~31日)を列見出しにして、年月を行見出しにする。

各テキストボックスのプロパティを下記のように設定する。

縦書き → はい
フォント → @マーク付きの等幅フォントを選択
縦、横の数値を入れ替えて縦長の長方形にする。

これで、通常の表示から右に90度回転させた状態にできます。

ページレイアウトで横を選択します。(もともと横だった場合は縦に)
これでプレビューでは通常の状態から90度回転した状態で表示されますが、
これを印刷すれば通常のものと同じレイアウトになります。

投稿2022/08/12 08:23

編集2022/08/12 08:24
hatena19

総合スコア33699

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

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

moge56

2022/08/15 04:50

3案も出していただきありがとうございます! レポートの列は固定で、VBAでゴリゴリ横に追加するということができなさそうなため、 「案2」に近いことを考えて試していました。なんとか形になりそうなのでまた出来上がりましたらご報告させていただきます。
guest

0

列の数が動的に変化するため、改ページして2枚目以降のレポート作成をどのようにすればいいのか試行錯誤しています。

とのことですが、提示のクロス集計クエリは、
`PIVOT Q_1.Month IN ("2022-01-01","2022-02-01","2022-03-01","2022-04-01","2022-05-01","2022-06-01")‘で列を固定していますが、この部分をVBAで動的に書き換えているということでしょうか。
抽出条件によっては、列名も変化しますよね。

投稿2022/08/11 08:57

hatena19

総合スコア33699

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

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

moge56

2022/08/11 08:59

はい、抽出条件によっては列名も変化するため、下記部分をVBAで動的に書き換えています。 `PIVOT Q_1.Month IN ("2022-01-01","2022-02-01","2022-03-01","2022-04-01","2022-05-01","2022-06-01")‘
hatena19

2022/08/11 10:57

まちがえて「質問への追記・修正の依頼」へ書くべきことを回答に書いてしまいました。 「質問への追記・修正の依頼」へさらに確認事項を描きますので、そちらで続けましょう。 不明点が確認出来たら、こちらに回答を書きます。
moge56

2022/08/11 11:34

ありがとうございます。 ご助言をいただけますとたいへん助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問