Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
1つのコンボボックスで2つの絞りこみ
投稿日時: 20/12/21 12:39:05
投稿者: d193168

いつもお世話になっています。
 
タイトルにあるように
「1つのコンボボックスで2つの絞りこみ」が出来るようにしたいのですがマクロだけで可能でしょうか?
 
テーブルは
T_文言マスタ
フィールド名は
分類番号、分類、文言番号、文言
 
フォームで1つのコンボボックスでまず分類がでて次に分類を選択するとその文言が表示されて選べるように出来るものをイメージしています。
2つのコンボボックスを使用する方法は調べられたのですが、1つでやるのは難しいのでしょうか?

回答
投稿日時: 20/12/21 13:27:10
投稿者: sk

引用:
「1つのコンボボックスで2つの絞りこみ」が出来るようにしたいのですが
マクロだけで可能でしょうか?

1 つのコンボボックスにおける連結列(ドロップダウンリストから
任意の行が選択された際に、値集合ソースのどの列の値を
コンボボックスの値として代入するか)は 1 つだけに限られますので、
マクロを使おうが使わまいが無理でしょう。
 
引用:
フォームで1つのコンボボックスでまず分類がでて次に分類を選択すると
その文言が表示されて選べるように出来るものをイメージしています。

(コンボボックスを使うかどうかについてはひとまず置くとして)
いわゆるサジェスト機能みたいなもの、あるいは多階層型の
ドロップダウンメニューのような UI を実装なさりたい、
ということなのでしょうか。
 
いずれにせよ、何故「 1 つのコンボボックスで」なのか、
その理由や目的についても具体的に明記されることをお奨めします。

回答
投稿日時: 20/12/21 15:03:49
投稿者: Suzu

できない事は無いです。
 
1. コンボボックスの他に、コンボボックスにて選択した値を保存しておくテキストボックス(txt)を用意。
2. マクロ
    値の代入
      アイテム =[Forms]![フォーム名]![txt] 式 =[Forms]![フォーム名]![コンボボックス名]
 
  値の代入
      アイテム =[Forms]![フォーム名]![コンボボックス名]
      式 =Null
 
  値の代入
      アイテム =[Forms]![フォーム名]![コンボボックス名].[RowSource]
      式 ="SELECT 第二抽出フィールド名 FROM テーブル名 WHERE 第一抽出フィールド名=" & [Forms]![フォーム名]![txt]
 
 
にて、コンボボックスの更新後や、ボタンクリック時 に、マクロを指定。
 
或いは、ふつうにコンボボックスを2つ作り、重ねてしまい 表示/非表示 を入れ替えて対応
 
 
でも。。
 
コンボボックスを 一個にしたい思いの元に、コントロールの数を減らしたいのだと思います。
仮に実現できたとして、「入力ミス」が起きたとき、ユーザーは第一週出のコンボボックスを選びなおしたい。
その時、ユーザーにどの様な操作で戻らせるか。 ボタンになると思います。
この場合は、そのボタンは小さくても良いので、コンボ2つを並べるよりは、表示面積は小さくできます。
でも、ユーザーにとっては、判りづらいのではないかと思います。
 
また、
・制御的に、初期化(次のレコードに移動したとき)等の処理を用意する必要がある。
 
・単票フォームであれば、気にはなりませんが、帳票フォームの場合
  他の行のコントロールの表示も変わります。
 
・値集合ソース変更の処理の場合
   第一抽出の場合のレコードの型と、第二抽出のレコードの型が違う場合、
   第二抽出を選択したとき 型が違うのエラーが発生してしまう。
  連結コントロールにするには、無理がある。
 
skさんが既に仰っていますが、目的を提示して貰えれば、代案があるかもしれません。

投稿日時: 20/12/22 20:04:01
投稿者: d193168

sk様

引用:
1 つのコンボボックスにおける連結列(ドロップダウンリストから
任意の行が選択された際に、値集合ソースのどの列の値を
コンボボックスの値として代入するか)は 1 つだけに限られますので、
マクロを使おうが使わまいが無理でしょう。
アクセスに機能として備わっていないのですね。
引用:
サジェスト機能みたいなもの、あるいは多階層型の
ドロップダウンメニュー
のような UI を実装なさりたい、
ということなのでしょうか。
まさにこのことです。
引用:
いずれにせよ、何故「 1 つのコンボボックスで」なのか、
その理由や目的についても具体的に明記されることをお奨めします。
ひとつの測定での面談があり、その際の面談記録も一緒に取り込んでいます。
しかもこの回(初回)は入力項目が多く、単票フォームで2画面?使っています。
ですのでできるだけ少なくしたいと思い質問させていただきました。
suzu様
引用:
仮に実現できたとして、「入力ミス」が起きたとき、ユーザーは第一週出のコンボボックスを選びなおしたい。
その時、ユーザーにどの様な操作で戻らせるか。 ボタンになると思います。
この場合は、そのボタンは小さくても良いので、コンボ2つを並べるよりは、表示面積は小さくできます。
でも、ユーザーにとっては、判りづらいのではないかと思います。
実は定型文が多いと聞いたのでコンボボックスからダブルクリック時にテキストに入力(値の代入)を利用して作成するように作っていました。しかし担当が持ってきたもは100レコードくらいあり、気を利かせて分類毎に分けてもありました(分類が違っても一つのテキストボックスに入力します)。ですのでそれを利用して作成出来たらと思いました。また使用法は、テキストにコンボボックスの文言を代入しそれをそのままでも構わないし、文字を追加しても構わないので単純に文言を入れるだけでした。
引用:
・制御的に、初期化(次のレコードに移動したとき)等の処理を用意する必要がある。
  
・単票フォームであれば、気にはなりませんが、帳票フォームの場合
  他の行のコントロールの表示も変わります。
これらは単純にテキストに入れてそれを加工してもよいし、そのままでも良いので間違えたらテキストごと消去し、また改めて作業をすればよいと思いました。
 
そこで質問ですが
引用:
2. マクロ
    値の代入
      アイテム =[Forms]![フォーム名]![txt]
   式 =[Forms]![フォーム名]![コンボボックス名]
  
  値の代入
      アイテム =[Forms]![フォーム名]![コンボボックス名]
      式 =Null
  
  値の代入
      アイテム =[Forms]![フォーム名]![コン ボボックス名].[RowSource]
      式 ="SELECT 第二抽出フィールド名 FROM テーブル名 WHERE 第一抽出フィールド名=" & [Forms]![フォーム名]![txt]
これらのマクロで2番目と3番目のマクロはどこに設定するのですか?
 
引用:
・値集合ソース変更の処理の場合
   第一抽出の場合のレコードの型と、第二抽出のレコードの型が違う場合、
   第二抽出を選択したとき 型が違うのエラーが発生してしまう。
  連結コントロールにするには、無理がある。
これはどのような意味でしょうか?
 
相談したい理由は、単純に画面上のスペースの問題です。
 
わからないことばかりですみません。
よろしくお願いいたします。

回答
投稿日時: 20/12/23 11:25:41
投稿者: sk

引用:
多階層型のドロップダウンメニュー

「ドロップダウンリスト上の任意の行(フォルダ)に
カーソルを移動(マウスオーバーまたはクリック)させると、
次の階層のドロップダウンリストがその行(フォルダ)の
右側(または左側)に展開表示される」といった動作を
期待されているのであれば、Access に組み込まれている
コントロールやマクロアクションによって
それを実現するのはまず無理でしょう。
( VBA を使っても難しいと思います)
 
引用:
ひとつの測定での面談があり、その際の面談記録も一緒に取り込んでいます。
しかもこの回(初回)は入力項目が多く、単票フォームで2画面?使っています。
ですのでできるだけ少なくしたいと思い質問させていただきました。

引用:
実は定型文が多いと聞いたのでコンボボックスからダブルクリック時に
テキストに入力(値の代入)を利用して作成するように作っていました。

引用:
また使用法は、テキストにコンボボックスの文言を代入し
それをそのままでも構わないし、文字を追加しても構わないので
単純に文言を入れるだけでした。

引用:
単純にテキストに入れてそれを加工してもよいし、
そのままでも良いので間違えたらテキストごと消去し、
また改めて作業をすればよい

・単票フォームのレコードソースである[面談記録テーブル]には、
 任意の文字列(質問への回答、意見、要望、所見、評価など)を
 格納するためのテキスト型のフィールドが定義されている。
 ([分類番号]や[文言番号]などのコードを格納するための
 フィールドが定義されているわけではない)
 
・上記のフィールドに対して入力するテキストは自由に編集可能であるが、
 「面談」という性質上、ある特定の文字列(文章)を頻繁に入力することがある。
 
・そうした入力頻度の高い文字列を「定型文」として扱い、
 (キーボード入力ではなく)何らかの GUI を用いることで
 入力操作の簡略化を行ないたい。
 
以上のような前提であると仮定するなら、少なくとも
その単票フォーム上に連結コンボボックスを配置して
実現するようなことではないでしょう。
 
性質的には、Word における「あいさつ文の挿入」機能の
イメージに近いと思います。
 
引用:
担当が持ってきたもは100レコードくらいあり

引用:
相談したい理由は、単純に画面上のスペースの問題です。

1. [分類番号]を選択するための非連結コンボボックスや、
   [文言]を選択するための非連結リストボックスなどの
   コントロールが配置された非連結フォームを新たに作成する。
   (リストボックスのリストに表示されるレコードは、
   [分類番号]の値によって切り替わるようにしておく。
   これは最初に述べられた「2つのコンボボックスを使用する方法」を
   応用すれば可能であるはず)
 
2. [面談記録テーブル]と連結している単票フォーム上の
   連結テキストボックスの[ダブルクリック時]イベントが
   発生した際に、1 のフォームを呼び出すようにする。
 
3. 1 のフォーム上の非連結リストボックスに表示されているリストから
   任意の行が選択された状態で、何らかのイベントが発生した際に
   そのリストボックス([文言])の値を 2 のフォームの
   連結テキストボックスに代入するアクションを実行するようにする。
 
今のところ、以上のような例が挙げられます。

回答
投稿日時: 20/12/23 15:52:15
投稿者: Suzu

引用:
これらのマクロで2番目と3番目のマクロはどこに設定するのですか?

 
どこ?とは?
3つのマクロの命令を連続で実行する事により、コンボボックスの値集合ソースを変更する処理を実現しています。
全てを コンボボックスの更新後処理 にて実行する事になります。
 
 
引用:
引用:
・値集合ソース変更の処理の場合
   第一抽出の場合のレコードの型と、第二抽出のレコードの型が違う場合、
   第二抽出を選択したとき 型が違うのエラーが発生してしまう。
  連結コントロールにするには、無理がある。
これはどのような意味でしょうか?

 
例えば、
 第一抽出のコンボボックスについて、【文字型】 の フィールド のリストが与えられている状態とします。
 
 先のマクロを設定しておき
  第一抽出のコンボボックスの値を更新のタイミングで、値集合ソースを替える。
  このとき、値集合ソース を 【日付時刻型】のフィールドに変更したとき
  変更後のリストとして、日付時刻型の データのリストは表示されますが、
 リストから値を選択しようとすると、
  「このフィールドに入力した値が正しくありません。
        たとえば、数値型のフィールドに文字列を入力しました。」となり、入力できません
 
 
単に、表示項目を減らしたいだけなら、先に述べていますように、
コンボボックスを 重ねた上で、表示/非表示 の制御を行う事で 事 足りますよね。
 
 
VBAではなく、マクロにて実現したいのであれば
skさんが提示してくださっている様に、
  別フォームに、今回のコンボボックス2つ を配置し、表示する方法が 良いと思いますよ。
 
 
引用:
「ドロップダウンリスト上の任意の行(フォルダ)に
カーソルを移動(マウスオーバーまたはクリック)させると、
次の階層のドロップダウンリストがその行(フォルダ)の
右側(または左側)に展開表示される」といった動作を
期待されているのであれば、Access に組み込まれている
コントロールやマクロアクションによって
それを実現するのはまず無理でしょう。
( VBA を使っても難しいと思います)
 TreeView Control で 似た様な事はできますけど、、VBAでないと 辛いですね。

投稿日時: 20/12/28 19:50:12
投稿者: d193168

sk様 suzu様
いろいろアドバイスありがとうございます。
 
まだお聞きしたいことがあるのでお伺いいたします。
suzu様

引用:
1. コンボボックスの他に、コンボボックスにて選択した値を保存しておくテキストボックス(txt)を用意。
2. マクロ
    値の代入
      アイテム =[Forms]![フォーム名]![txt] 式 =[Forms]![フォーム名]![コンボボックス名]
  
  値の代入
      アイテム =[Forms]![フォーム名]![コンボボックス名]
      式 =Null
  
  値の代入
      アイテム =[Forms]![フォーム名]![コンボボックス名].[RowSource]
      式 ="SELECT 第二抽出フィールド名 FROM テーブル名 WHERE 第一抽出フィールド名=" & [Forms]![フォーム名]![txt]
suzu様のこのマクロを利用して作成いたしました。
これで満足なのですが、
引用:
単に、表示項目を減らしたいだけなら、先に述べていますように、
コンボボックスを 重ねた上で、表示/非表示 の制御を行う事で 事 足りますよね。
とあるのですが、種類を抽出したあとに文言を表示すると思われますが、
表示/非表示を入れ替える?はどのようにするのでしょうか?
また
引用:
・制御的に、初期化(次のレコードに移動したとき)等の処理を用意する必要がある。
はどのように初期化するのでしょうか?
確かにコンボボックスで種類や文言を選択するとそのコンボボックスは
変更できなくなってしまいます。
 
sk様
引用:
2. [面談記録テーブル]と連結している単票フォーム上の
   連結テキストボックスの[ダブルクリック時]イベントが
   発生した際に、1 のフォームを呼び出すようにする。
  
3. 1 のフォーム上の非連結リストボックスに表示されているリストから
   任意の行が選択された状態で、何らかのイベントが発生した際に
   そのリストボックス([文言])の値を 2 のフォームの
   連結テキストボックスに代入するアクションを実行するようにする。
別フォームを呼び出しそのフォームで操作して元のフォームに代入するということは、
目の移動が少し多くクリックも増えてしまうと思い一つのフォーム上で
完結するようにした方が使用する際楽ではと思ったのです。
実はこのテキストへの代入は3個と別の集合値の4個の合計7個あるので
都度フォームを移動するのはどうかと・・・。
 
しかしお二人はこちらの情報の足りない部分を確実に理解していただき、そして
それ以上のこちらがやろうとしている事を詳しくアドバイスしていただき
非常に感謝しています。

回答
投稿日時: 20/12/30 13:52:56
投稿者: hatena
投稿者のウェブサイトに移動

d193168 さんの引用:
別フォームを呼び出しそのフォームで操作して元のフォームに代入するということは、
目の移動が少し多くクリックも増えてしまうと思い一つのフォーム上で
完結するようにした方が使用する際楽ではと思ったのです。
実はこのテキストへの代入は3個と別の集合値の4個の合計7個あるので
都度フォームを移動するのはどうかと・・・。

標準の機能にはないことなので、そのような機能を実装しようとするとVBAは必須になりますね。
どうしてもやりたいのなら、下記のリンク先が参考になるでしょう。
 
カレンダーダイアログ日付入力関数の改良版 - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-116.html
 
上記では別フォーム(カレンダーフォーム)をコンボボックスのドロップダウンリストのように表示しています。これの方法を使って見た目はコンボボックスのようなUIにできます。

回答
投稿日時: 21/01/04 11:21:58
投稿者: Suzu

当方のどことは?の問い及びそれに続く説明に対し

引用:
これで満足なのですが、〜〜表示/非表示を入れ替える?はどのようにするのでしょうか?
の様に問いで返されていると言う事は、
引用:
これらのマクロで2番目と3番目のマクロはどこに設定するのですか?
が的外れな問いだった事は理解して頂けたと認識して良いでしょうか。
 
 
引用:
表示/非表示を入れ替える?はどのようにするのでしょうか?

 
 
今回の表示/非表示を制御するプロパティーは Visible プロパティーで
そこに True を与えれば 表示/ False を与えれば 非表示にする事が可能です。
 
VBAでも、マクロでも、
  プロパティーへはそのプロパティーが属するオブジェクトから
  オブジェクトへは、そのオブジェクトが属するコレクションから アクセスする事が可能なので
 
Forms![フォーム名]![コントロール名].Visible = Treu/False
 にて、表示/非表示 が制御できます。
 
なので、
 
値の代入
 アイテム = [Forms]![フォーム名]![コンボボックス名].Visible
      式 = False
 
にて、コンボボックスを 非表示にできます。
逆に True であれば表示にできます。
 
なので、
1. 第一抽出コンボ、第二抽出コンボを予め 重ねておき 第二抽出コンボを非表示設定
2. 第一抽出コンボの値が 正しい場合
     ・第二抽出コンボを表示に変更
     ・第二抽出コンボにフォーカスを移動
     ・第一抽出コンボを非表示に変更
     ・第二抽出コンボに再クエリを与える
とします。
 
引用:
また
引用:
・制御的に、初期化(次のレコードに移動したとき)等の処理を用意する必要がある。
はどのように初期化するのでしょうか?
確かにコンボボックスで種類や文言を選択するとそのコンボボックスは
変更できなくなってしまいます。

 
前述の 表示/非表示 のマクロも同じなのですが
マクロで強制的にプロパティー値を変えていますが、これはそのレコードの入力後も変わったままです。
 
入力が終えた後には、
抽出コンボが表示されている状態ではなく、第抽出コンボが表示されている状態になっていないといけません。
上記の様に、入力初期状態の画面に戻す処理が初期化です。
 
マクロを使い 初期状態のプロパティーを代入する事で 戻した様に見せます。
この初期化を どのイベントに実装するのか を きちんと考える必要があります。
 
 
 
マクロで別フォーム【フォーム2】を呼び出し、
そこで得た値を 呼び出したフォームの適正なコントロールへ代入する
 
これもマクロで可能ではあります。
 
が、気をつけなければならないのが、
 マクロ は 特別な指定をしない限り
  フォーカスが存在する オブジェクト/コントロール に対して操作が実行されます。
 
マクロの途中で、ユーザーが別のフォーム/コントロールに移動する事が可能な場合があり
意図しない別のコントロールに移動されると、
 その後のマクロの一部にエラーが発生しマクロ処理が中断(場合に依っては、一部成功/一部失敗 が混在)
となり、意図しないデータが生み出される事にもなりえます。
操作であればエラーが発生します。
 
対し、VBAは
・対象のコントロールを明確に処理する事ができる
・エラーの発生に対し、マクロより詳細に制御が可能
 
何にしても、
 質問者さんの要望としては、『入力画面の表示を入力しやすくする』なんだと思いますが
開発者側の想定と、使用者側の希望は違う事も多くあります。
 
画面の大きさ、画面の解像度、入力者の練度、入力のし易さ、誤入力時の修正方法
も踏まえ UIを設計する事が必要と思います。
 
前に、コンボボックスの誤入力時の対処に対し
引用:
そのままでも良いので間違えたらテキストごと消去し、また改めて作業をすればよいと思いました。
の発言がありました
コントロールを小さくしたいほど、入力項目が多いのに
入力した内容がご破算 となると、入力者にとっては破算にするしかない設計の方がストレスだと思います
 
このまま進める事も可能ではありますが
 
他から得られた 既存レコードの修正 との事ですので
 
・データのマスター化や 更新クエリを用いる事で、入力項目を減らせないか
・入力者にとって入力しやすいか を 入力者の意見も聞きながら考える
・希望の動作を行う為にマクロ/VBAを使う事 勉強する事は必要でしょうが
  あくまでも、そのマクロ・VBA の機能を使用し実現するのは あなたです。
 
 一から十まで掲示板で 処理内容を聞いて実装しても、
 スキルを大幅に超えた機能であり 後日不具合が生じたい際に対処できなくなります。
 
 スキルを考慮し、機能設計を行う事をお勧めします。

投稿日時: 21/01/04 17:53:30
投稿者: d193168

hatena様
今はVBAは全く解らないので参考として
参照させていただきました。
ありがとうございます。
 
suzu様

引用:
引用:
これらのマクロで2番目と3番目のマクロはどこに設定するのですか?
が的外れな問いだった事は理解して頂けたと認識して良いでしょうか。

的外れでしたし、現在も理解しているかと言えば理解できていないです。
 
引用:
一から十まで掲示板で 処理内容を聞いて実装しても、
 スキルを大幅に超えた機能であり 後日不具合が生じたい際に対処できなくなります。
  
 スキルを考慮し、機能設計を行う事をお勧めします。

まったくその通りです。「できそう」と思い「相談」して
「できました」と、やればいいやと安易に投稿してしまいました。
本日のsuzu様のアドバイスを参考にこれから頑張ってみます。
本当にものすごく色々丁寧に教えていただきありがとうございました。