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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

719閲覧

Accessのフォームでフィルタ結果を二次元の表型式で表示することは可能ですか?

退会済みユーザー

退会済みユーザー

総合スコア0

Access

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/09/27 09:17

編集2018/09/27 15:58

最近Excel VBAでは回答者をさせていただいておりますが、今回がはじめての質問です。
AccessやSQLについては詳しく無いため何卒宜しくお願いします。

前提・実現したいこと

Acessのフォームにおいて、次のようなマスターテーブルを区分で抽出した結果を次のような表型式で表示したいのですが、クエリのみで実現可能ですか?
VBAで二次元テーブルに変換するコードを書こうと考えていたのですが、せっかくのAccessなのでデータベースらしいやり方があるのではないか?というのと、もしクエリで出来るのであればVBAより高速になるのではないかと思い質問させていただいた次第です。

テーブル1

ID区分番号
1あああ1
2あああ2
3あああ3
4あああ4
5いいい1
6いいい2
7いいい3
8あああ5
9あああ6
10あああ7
11あああ8
12あああ9
13あああ10

フォームイメージ
[区分][区分を選択するコンボボックス][検索ボタン]
たとえば、ユーザーが[あ]を選択した場合・・・

サブフォーム(帳票フォーム)

番号1番号2番号3
□No.1□No.2□No.3
□No.4□No.5□No.6
□No.7□No.8□No.9
□No.10

※実際には[あ]の中には1~1000程度のデータが有り、縦に一直線に並べると長くなりすぎるので20列程度の二次元に表示することでスクロール量を抑えたいという目的です。
※□はチェックボックスを置き、No.1等のラベルにはハイパーリンクを設定する予定で考えていますので、実装に影響を与えない方法である必要があります。

クエリでは不可能/遅いのでVBAのほうが良いということであれば、バッサリ切っていただいて構いません。
SQLを組む場合のヒントがあれば、教えて頂けると助かります。

補足情報

Access 2016 32bit / Windows10

以下、sazi様のアドバイスを元に追記したもの

理想のクエリの実行結果

選択クエリ
|ID|区分|番号|COL|ROW|
|:--|:--:|--:|
|1|あ|1|1|1|
|2|あ|2|2|1|
|3|あ|3|3|1|
|4|あ|4|1|2|
|5|あ|5|2|2|
|6|あ|6|3|2|
|7|あ|7|1|3|
|8|あ|8|2|3|
|9|あ|9|3|3|
|10|あ|10|1|4|

クロス集計クエリ

ID番号1番号2番号3CHK1CHK2CHK3
1123falsefalsefalse
2456falsefalsefalse
3789falsefalsefalse
410false

作成したクエリ

イメージ説明
※[区分]をフィルタするパラメータを[P区分]で設定しています。
※クロス集計クエリはまだ動作検証できていません。

実際の実行結果

選択クエリの実行結果
|ID|区分|番号|COL|ROW|
|:--|:--:|--:|
1|あ|1|連番1|1
10|あ|7|連番1|4
11|あ|8|連番2|4
12|あ|9|連番3|4
13|あ|10|連番1|5
2|あ|2|連番2|1
3|あ|3|連番3|1
4|あ|4|連番1|2
8|あ|5|連番2|3
9|あ|6|連番3|3

問題点

・IDが文字列型で出力されてしまう。Intで囲っても変化無しでした。
・IDが連番にならない。

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

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

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

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

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

guest

回答1

0

ベストアンサー

サブフォームの列名を固定にできるなら、クロス集計クエリーが使えます。
クロス集計クエリの列見出しを固定するには?

複雑な場合は、クエリー内でのiif()による列の内容を編集するようにすれば、クロス集計の代替えができます。

投稿2018/09/27 09:31

編集2018/09/27 09:33
sazi

総合スコア25138

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

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

退会済みユーザー

退会済みユーザー

2018/09/27 09:49 編集

ありがとうございます。列名は固定できます。クロス集計を少しさわってみたのですが、列0,1,2の表を作るとして、[区分]のフィルタ結果のレコード番号をnとした時、(n Mod 3)となりますが、nの部分はどんな関数を使えばよいのでしょうか。それと、チェックボックスのチェック状態をYes/No型で持たせたいのですが、その場合は後者のIIFを使った方法が適切ですか?
sazi

2018/09/27 11:15

チェックボックスは更新させるということなら連結フォームという事になりますから、クエリーを使用するには更新可能なクエリーである必要があります。 それは無理っぽいので、サブフォームに合わせたテーブルが必要です。 そもそも、チェックボックスの状態は保存した状態にするのかどうか要件がちょっと不明ですね。
sazi

2018/09/27 11:21 編集

>[区分]のフィルタ結果のレコード番号をnとした時、(n Mod 3)となりますが 3つで折り返すってことですか? (n Mod 3)で演算したものを元にクロス集計すれば良いと思います。
退会済みユーザー

退会済みユーザー

2018/09/27 13:55

>そもそも、チェックボックスの状態は保存した状態にするのかどうか要件がちょっと不明ですね。 失礼しました。チェックボックスの状態は使い捨てで大丈夫です。チェックされた項目を元に単票に投げることになりますが、自力でなんとかなりそうなので、チェックボックスに関しては忘れてください。 >3つで折り返すってことですか? そのとおりです。実際には件数が1000件以上になるので、参考URLで上げていただいたような方法では1行・1000列以上のテーブルが出来てしまうため固定長で折り返さなければなりません。 問題は(n Mod 3)で演算すれば出来るという理論は分かるのですが、nに相当する関数が分からなくて検索しても上手く見つけられないのです・・・
退会済みユーザー

退会済みユーザー

2018/09/27 14:28

ちょっと意味がわかったかもしれません。 先のnの部分は選択クエリで、"連番"&(DCount("*","テーブル1","[ID] <=" & [テーブル1]![ID])-1)で生成出来ました。 この結果をクロス集計クエリで処理すれば良いということでしょうか。なんとか出来そうな気がしてきました。
sazi

2018/09/27 14:45 編集

>チェックボックスの状態は使い捨てで大丈夫です。 複数行を出力する帳票フォームだと、連結しないと全ての行に対して操作が反映されますけど、大丈夫なんですか?
退会済みユーザー

退会済みユーザー

2018/09/27 15:13

意味が分かりませんでしたが、適当に帳票フォームを作って配置したら確認できました。これは確かにダメですね・・・。となるとクエリと連結しなければならないのですね。まだそこまで進んでいなくてクロス集計ができ次第試してみます。
退会済みユーザー

退会済みユーザー

2018/09/27 16:05

先の「DCount("*","テーブル1","[ID] <=" & [テーブル1]![ID])」ではレコード番号(1~の連番)が生成できず元のテーブルのID値がそのまま表示されてしまいました。この方法は誤っているのでしょうか。詳細は質問文を修正しましたので参照をお願いいたします。
退会済みユーザー

退会済みユーザー

2018/09/28 01:40

朝起きて試行錯誤していたら出来ました!区分の判定が不足していたみたいです。 ID: DCount("*","テーブル1","[ID]<=" & [テーブル1]![ID] & " And [区分]='" & [区分] & "'" ROW: Int(((DCount("*","テーブル1","[ID]<=" & [テーブル1]![ID] & " And [区分]='" & [区分] & "'")-1)/3)+1) COL1: "NUM" & (((DCount("*","テーブル1","[ID]<=" & [テーブル1]![ID] & " And [区分]='" & [区分] & "'")-1) Mod 3)+1) IDが文字列になってしまう謎と、チェックボックスとフォームの連動に関してはSQLでなんとかするのは私にはハードルが高そうだったので、VBAでテーブルを生成する方向でなんとかしようと思います。 以上、ありがとうございました。
sazi

2018/09/28 02:13

>IDが文字列になってしまう 上記についての原因は分かりませんが、クロス集計クエリーで ID:CInt([選択クエリ].[ROW]) とすれば改善されないでしょうか。
退会済みユーザー

退会済みユーザー

2018/09/28 05:52

すいません。クロス集計クエリのROWは問題ありません。選択クエリのIDの方です。Int関数やCInt関数でCInt(DCount(・・・・))とすると、 クエリを実行した時に「クエリに、集計関数の一部として指定された式~~が含まれていません。」とエラーメッセージが表示されます。Intで囲っているのはIDなのに、ROWとCOLの列でエラーが出ているためID列だけにするとエラーが出ないようです。
sazi

2018/09/28 08:46 編集

グループ化されていない項目なので当然のエラーですね。 dcount()を掛けたものに対して集計するようにしないとだめです ですので、選択クエリの前段としてクエリーを作成し、それを元にして現状の選択クエリーの状態にします。
退会済みユーザー

退会済みユーザー

2018/09/28 08:54

そういうものなのですね。まだ仕組みを理解していなくて。ひとまず解決です。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問