Access (一般機能) |
![]() ![]() |
(指定なし : 指定なし)
1つのコンボボックスで2つの絞りこみ
投稿日時: 20/12/21 12:39:05
投稿者: d193168
|
---|---|
いつもお世話になっています。
|
![]() |
投稿日時: 20/12/21 13:27:10
投稿者: sk
|
---|---|
引用: 1 つのコンボボックスにおける連結列(ドロップダウンリストから 任意の行が選択された際に、値集合ソースのどの列の値を コンボボックスの値として代入するか)は 1 つだけに限られますので、 マクロを使おうが使わまいが無理でしょう。 引用: (コンボボックスを使うかどうかについてはひとまず置くとして) いわゆるサジェスト機能みたいなもの、あるいは多階層型の ドロップダウンメニューのような UI を実装なさりたい、 ということなのでしょうか。 いずれにせよ、何故「 1 つのコンボボックスで」なのか、 その理由や目的についても具体的に明記されることをお奨めします。 |
![]() |
投稿日時: 20/12/21 15:03:49
投稿者: Suzu
|
---|---|
できない事は無いです。
|
![]() |
投稿日時: 20/12/22 20:04:01
投稿者: d193168
|
---|---|
sk様
引用:アクセスに機能として備わっていないのですね。 引用:まさにこのことです。 引用:ひとつの測定での面談があり、その際の面談記録も一緒に取り込んでいます。 しかもこの回(初回)は入力項目が多く、単票フォームで2画面?使っています。 ですのでできるだけ少なくしたいと思い質問させていただきました。 suzu様 引用:実は定型文が多いと聞いたのでコンボボックスからダブルクリック時にテキストに入力(値の代入)を利用して作成するように作っていました。しかし担当が持ってきたもは100レコードくらいあり、気を利かせて分類毎に分けてもありました(分類が違っても一つのテキストボックスに入力します)。ですのでそれを利用して作成出来たらと思いました。また使用法は、テキストにコンボボックスの文言を代入しそれをそのままでも構わないし、文字を追加しても構わないので単純に文言を入れるだけでした。 引用:これらは単純にテキストに入れてそれを加工してもよいし、そのままでも良いので間違えたらテキストごと消去し、また改めて作業をすればよいと思いました。 そこで質問ですが 引用:これらのマクロで2番目と3番目のマクロはどこに設定するのですか? 引用:これはどのような意味でしょうか? 相談したい理由は、単純に画面上のスペースの問題です。 わからないことばかりですみません。 よろしくお願いいたします。 |
![]() |
投稿日時: 20/12/23 11:25:41
投稿者: sk
|
---|---|
引用: 「ドロップダウンリスト上の任意の行(フォルダ)に カーソルを移動(マウスオーバーまたはクリック)させると、 次の階層のドロップダウンリストがその行(フォルダ)の 右側(または左側)に展開表示される」といった動作を 期待されているのであれば、Access に組み込まれている コントロールやマクロアクションによって それを実現するのはまず無理でしょう。 ( VBA を使っても難しいと思います) 引用: 引用: 引用: 引用: ・単票フォームのレコードソースである[面談記録テーブル]には、 任意の文字列(質問への回答、意見、要望、所見、評価など)を 格納するためのテキスト型のフィールドが定義されている。 ([分類番号]や[文言番号]などのコードを格納するための フィールドが定義されているわけではない) ・上記のフィールドに対して入力するテキストは自由に編集可能であるが、 「面談」という性質上、ある特定の文字列(文章)を頻繁に入力することがある。 ・そうした入力頻度の高い文字列を「定型文」として扱い、 (キーボード入力ではなく)何らかの GUI を用いることで 入力操作の簡略化を行ないたい。 以上のような前提であると仮定するなら、少なくとも その単票フォーム上に連結コンボボックスを配置して 実現するようなことではないでしょう。 性質的には、Word における「あいさつ文の挿入」機能の イメージに近いと思います。 引用: 引用: 1. [分類番号]を選択するための非連結コンボボックスや、 [文言]を選択するための非連結リストボックスなどの コントロールが配置された非連結フォームを新たに作成する。 (リストボックスのリストに表示されるレコードは、 [分類番号]の値によって切り替わるようにしておく。 これは最初に述べられた「2つのコンボボックスを使用する方法」を 応用すれば可能であるはず) 2. [面談記録テーブル]と連結している単票フォーム上の 連結テキストボックスの[ダブルクリック時]イベントが 発生した際に、1 のフォームを呼び出すようにする。 3. 1 のフォーム上の非連結リストボックスに表示されているリストから 任意の行が選択された状態で、何らかのイベントが発生した際に そのリストボックス([文言])の値を 2 のフォームの 連結テキストボックスに代入するアクションを実行するようにする。 今のところ、以上のような例が挙げられます。 |
![]() |
投稿日時: 20/12/23 15:52:15
投稿者: Suzu
|
---|---|
引用: どこ?とは? 3つのマクロの命令を連続で実行する事により、コンボボックスの値集合ソースを変更する処理を実現しています。 全てを コンボボックスの更新後処理 にて実行する事になります。 引用:引用:これはどのような意味でしょうか? 例えば、 第一抽出のコンボボックスについて、【文字型】 の フィールド のリストが与えられている状態とします。 先のマクロを設定しておき 第一抽出のコンボボックスの値を更新のタイミングで、値集合ソースを替える。 このとき、値集合ソース を 【日付時刻型】のフィールドに変更したとき 変更後のリストとして、日付時刻型の データのリストは表示されますが、 リストから値を選択しようとすると、 「このフィールドに入力した値が正しくありません。 たとえば、数値型のフィールドに文字列を入力しました。」となり、入力できません 単に、表示項目を減らしたいだけなら、先に述べていますように、 コンボボックスを 重ねた上で、表示/非表示 の制御を行う事で 事 足りますよね。 VBAではなく、マクロにて実現したいのであれば skさんが提示してくださっている様に、 別フォームに、今回のコンボボックス2つ を配置し、表示する方法が 良いと思いますよ。 引用:TreeView Control で 似た様な事はできますけど、、VBAでないと 辛いですね。 |
![]() |
投稿日時: 20/12/28 19:50:12
投稿者: d193168
|
---|---|
sk様 suzu様
引用:suzu様のこのマクロを利用して作成いたしました。 これで満足なのですが、 引用:とあるのですが、種類を抽出したあとに文言を表示すると思われますが、 表示/非表示を入れ替える?はどのようにするのでしょうか? また 引用:はどのように初期化するのでしょうか? 確かにコンボボックスで種類や文言を選択するとそのコンボボックスは 変更できなくなってしまいます。 sk様 引用:別フォームを呼び出しそのフォームで操作して元のフォームに代入するということは、 目の移動が少し多くクリックも増えてしまうと思い一つのフォーム上で 完結するようにした方が使用する際楽ではと思ったのです。 実はこのテキストへの代入は3個と別の集合値の4個の合計7個あるので 都度フォームを移動するのはどうかと・・・。 しかしお二人はこちらの情報の足りない部分を確実に理解していただき、そして それ以上のこちらがやろうとしている事を詳しくアドバイスしていただき 非常に感謝しています。 |
![]() |
投稿日時: 20/12/30 13:52:56
投稿者: hatena
|
---|---|
d193168 さんの引用: 標準の機能にはないことなので、そのような機能を実装しようとするとVBAは必須になりますね。 どうしてもやりたいのなら、下記のリンク先が参考になるでしょう。 カレンダーダイアログ日付入力関数の改良版 - hatena chips https://hatenachips.blog.fc2.com/blog-entry-116.html 上記では別フォーム(カレンダーフォーム)をコンボボックスのドロップダウンリストのように表示しています。これの方法を使って見た目はコンボボックスのようなUIにできます。 |
![]() |
投稿日時: 21/01/04 11:21:58
投稿者: Suzu
|
---|---|
当方のどことは?の問い及びそれに続く説明に対し
引用:の様に問いで返されていると言う事は、 引用:が的外れな問いだった事は理解して頂けたと認識して良いでしょうか。 引用: 今回の表示/非表示を制御するプロパティーは 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様
引用: 的外れでしたし、現在も理解しているかと言えば理解できていないです。 引用: まったくその通りです。「できそう」と思い「相談」して 「できました」と、やればいいやと安易に投稿してしまいました。 本日のsuzu様のアドバイスを参考にこれから頑張ってみます。 本当にものすごく色々丁寧に教えていただきありがとうございました。 |