Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7全般 : Access 2016)
表形式で複数列の表示
投稿日時: 19/01/22 14:29:17
投稿者: パズル

回答よろしくお願いいたします。
  
表形式のフォームなのですが、表示件数が多いと縦に並び、スクロールして下のほうに行くと思います。
それを横にも表示さすことはできるでしょうか?
  
ID  種類  品名   ID  種類  品名
1   機械  A    6   治具  b
2   機械  B    7   治具  c
3   機械  C    8   治具  d
4   機械  D    9   治具  e
5   治具  a    10   治具  f
   
のように1画面で格子状に表示したいと思っています。
クエリでIDが1〜5のフォーム、6〜10のフォームを作ってサブフォームとして埋め込んだのですが、そうするとサブフォームが複数あるせいかVBAでのフィルタがうまく出来ませんでした。
  
上記ではIDが10までしかないですが、ID20程度までの4列表示させたいと思っています。
エクセルの格子状のようなイメージです。
こうのような形で表示させフィルタまで出来るようなフォームを作りたいです。
メインフォームで検索ボックスを作ってあり、サブフォームでこの形で表示したいと思っています。
  
難しいのかもしれませんが、よろしくお願い致します。

回答
投稿日時: 19/01/22 16:29:24
投稿者: Suzu

質問者さんは、VBAで解決したいのでしょうか。一般機能で解決したいのでしょうか。
 
なぜ、サブフォームを複数も使って、横にフォームをならべないといけないのでしょうか。
それにより、どんなメリットを期待できるのでしょうか。
 
 
そもそも、横に並べると言うのは 画面幅に使い勝手が左右されるので
ディスプレイの画面幅が変わったら。。と考えると、
あまり お勧めできる方法ではないです。
 
 
クエリにて
1. テキストボックスの値を参照し、その値をキーワードに検索する
   (テキストボックスが空白の場合には全レコード表示)
2. そのクエリを基に、順位を取得するクエリを作成
3. さらにそのクエリを基に、
    1番目〜 5番目
    6番目〜10番目
   11番目〜15番目
   16番目〜20番目
     それぞれ「のみ」を表示するクエリを作成。
4. 先に作成したクエリをそれぞれのサブフォームのレコードソースとする
 
 
【フォームのテキストボックスに入力された値をクエリの抽出条件に設定する】
https://www.moug.net/tech/acopr/0040014.html
 
【簡単にあいまいな検索をする】
https://www.moug.net/tech/acopr/0040030.html
 
【クエリで値(成績・実績・記録等)に順位をつける】
https://www.moug.net/tech/acopr/0040028.html
 
【クエリで順位を計算する】
https://www.moug.net/tech/acopr/0040034.html
 
 
あとは、テキストボックスの入力後に、再クエリを発行する様にすれば良いのでは?

投稿日時: 19/01/25 10:58:58
投稿者: パズル

Suzu様
 
有り難うございます。
部品リストを作っているのですが、必要なフィールドが少なく、横にスペースがかなり出来てしまい、リストとして見づらくなってしまうので横にも展開しようと思いました。
レポートなら横にも出来るようなのですが、印刷しないのでフォームで表示したいと思い質問させてもらいました。
 
教えていただいた方法で出来ました。
有り難うございました。
 
1点質問なのですが、
【簡単にあいまいな検索をする】
はテキストボックスでのあいまい検索はどのように記述すればよいでしょうか?
今は
 
SELECT Data.[キーNo], Data.型式, Data.部位, Data.品名, Data.必要数量
FROM Data
WHERE (((IIf(IsNull([Forms]![BuiListDetail]![キーNo検索]),True,[部位]=[Forms]![BuiListDetail]![キーNo検索]))=True));
 
として全部一致になっています。
部分一致のように前後に*を入れるようにしたいと思っています。
 
よろしくお願い致します。

回答
投稿日時: 19/01/25 14:23:39
投稿者: Suzu

一致の場合のWHERE句
 
WHERE
    部位 = [Forms]![BuiListDetail]![キーNo検索]
 
 
 
部分一致の場合のWHERE句
WHERE
    部位 LIKE "*" & [Forms]![BuiListDetail]![キーNo検索] & "*"
 
上記を参考に
【フォームのテキストボックスに入力された値をクエリの抽出条件に設定する】
に適応させてみましょう。
 
 
デザイン上の理由として、今回の機能を必要としているなら、賛同はしかねる手法です。
 
テキストボックスに入力が無い場合には、全レコード表示となります。
 
全レコードが20件を超えた状態でも、今回の手法の場合、20件を超したレコードは表示されない事になります
それをユーザーとしては、「20件しかない」のか、超えているのか 判断できませんよね?
 
ユーザーにとっての判り易さを 優先させた方が 良いと思いますがいかがでしょう。
 
 
そういう意味では、レコードソース側のSQLで抽出するのではなく、
ご質問にあった様に、フォームのフィルター機能を使用すれば、
サブフォーム下部の「移動ボタン」 (カレントレコード位置/レコード数) で
全レコード数が表示できるのか。。
 
その場合、移動ボタン上の(カレントレコード位置/レコード数) は
どんな表示になって欲しいのでしょうか。
 
それとも、表示無しにするのかな?
或いは、別に テキストボックスを配しそこに、レコード数を表示するとか?
 
なんか墓穴を掘っている感 満載 ^^;

回答
投稿日時: 19/01/29 20:54:57
投稿者: hatena
投稿者のウェブサイトに移動

横のスペースがもったいないといって、縦のデータを分割して横にならべても見やすいとは思えないです。
5レコード×4列 で20レコードの表示ですが、抽出結果がそれ以上あるとき、スクロールできないし。
 
どうしても、必要がある、という要求が来たなら、自分なら、下記のような設計にするかな。
 
ソースのテーブルに連番フィールドを追加します。
下記で、連番を自動入力する関数を紹介しています。
抽出条件を指定することもできますので、これで、連番を入力します。
 
グループ毎連番を自動入力する関数 - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-428.html
 
抽出条件(フィルター)が変化してたら、一度、連番をクリアしてから、
連番自動入力関数で連番を振りなおします。
 
連番があれば、それをもとに、4つのサブフォームのフィールターを設定すればいいだけです。
 
クエリで連番を計算する方法もありますが、抽出条件を動的に変更して連番出力するのは非常に複雑になりますし、重い処理になります。
 
4列表示ができたとして、
表示件数が20件を超える時、どのようにスクロールさせるのか、レコード移動はどうするのか、このあたりのUIをどうするのかは、考えているのでしょうか。

トピックに返信