Excelで動的な依存データ検証リストを実装する方法


2

Web上のソースは、依存データ検証リストの実装方法を示していますが、私が遭遇したすべては静的であり、自動的には更新されません。

この質問に答えることができる人は誰でも、データ検証リストが専門的な程度にどのように機能するかをすでに知っていると思いますが、私のような学習者の目的のために、簡単な説明をします(GoogleとYouTubeのビデオをさらに読むことをお勧めします)。

データ検証リストを使用すると、ワークブックに定義済みのデータ構造を作成できます。これらは、ユーザーとの対話を基本としています。ワークブックユーザーに、たとえばドーナツ、ケーキ、マフィン、クランペットなどの特定のデータセットのみを挿入したい場合は、「スナック」という名前付き範囲を使用してリストを作成するか、テーブルを作成してテーブルに「スナック」という名前を付けることができます。名が1つの単語である場合(つまり、名にスペースが存在しない場合)

リストを使用することの欠点は、クロワッサンと呼ばれる別のスナックをリストに追加する必要がある場合、最初に作成したリストを再定義する必要があることです。テーブルは、新しい行を最後の行から追加するか、現在のテーブル行に続いて次の行を書き込みEnterキーを押すことで簡単に追加できるという意味で、この非効率性を回避します。

現在、データの検証については、以下のリンクを参照して詳細を公開することをお勧めします。説明によりこの質問が長すぎるためです。http://analyticsdemystified.com/excel-tips/excel-dropdowns-done-right/

したがって、依存検証リストは、以前の検証リストからユーザーが選択した値に基づくリストです。たとえば、ドーナツタイプには、アイスリング、チョコレート艶出し、ジャム、カスタードドーナツが含まれます。マフィンの種類には、バナナ、ブルーベリー、チョコレートが含まれます。ケーキの種類には、赤いベルベット、ニンジン、ココナッツが含まれます。最後に、Crumpetsのタイプには、英語、スコットランド語、およびパイクレットが含まれます。

したがって、セルにメインカテゴリリストのドロップダウンがある場合、サブカテゴリに基づいて動的依存検証リストをどのように作成しますか。

動的依存検証リストとは、すべての列リストが以下に示すテーブルであることを意味します。

テーブルとしてのデータリスト

ここでの質問は、たとえばセルC13にスナックテーブルの検証リストがある場合、隣接セルをどのように実装するかです。C13のユーザー選択入力に基づいてセルD13を検証リストにする方法D13の検証リストの可能な選択は、ドーナツテーブルの列データになります)。

C13の元の検証リストは、名前付き範囲ではなくテーブルであるため、INDIRECT関数を使用して作成されていることに注意してください。


contextures.com/xlDataVal02.html 動的な名前付き範囲に、=Sheet1!$A$2:INDEX(Sheet1!$A:$A,MATCH("ZZZ",Sheet1!$A:$A))Sheet1の列AのすべてをA2からその列のテキストの最後のセルまで含めることができます。それを名前付き範囲の数式として入力します。
スコット

回答:


2

4つの簡単なステップで簡単に

ステップ1 テーブルを作成します。

ここに画像の説明を入力してください

ステップ2 テーブルに名前を付ける:テーブルを選択して名前を変更し、プライマリテーブルTable1の値と一致するようにします。ヘッダー「Cakes」を持つTable2 は、プライマリテーブルTable1の値であるため、Cakeという名前にする必要があります。 しかし、どのように?テーブルの角をクリックして選択し、Table2または同様の場所に新しいラベルを入力してEnter キーを押します。まだ「Table2」などと表示されていても心配しないでください (注!これは、Table1などのプライマリテーブルには必要ありません)。

ここに画像の説明を入力してください

ステップ3 最初のリストを配置する場所を選択し、[データ]タブに移動して、データ検証に進みます。「リスト」を選択=INDIRECT("Table1")し、ソースウィンドウで次を入力します。

ここに画像の説明を入力してください

ステップ4 最初のリストに依存する2番目のリストのセルを選択します。データ検証に戻り、「リスト」を選択して=INDIRECT(K2)、「K2」が最初のリストの場所を入力します。

ここに画像の説明を入力してください

完了

2番目のリストに依存する3番目のリストについては、手順4を繰り返し、代わりに2番目のリストを参照します。幸運を!


ご回答有難うございます。これかもしれないと思ったが、確かではなかった。私が持っている唯一のクエリは、セカンダリテーブルのテーブル名がプライマリテーブルのデータと同じである必要はないのですか?
MrMarho

@MrMarhoそうですね。手順2でそれを正しく説明しなかったので、更新します。
クリストファーウェーバー

0

これが機能するという事実について、私の言葉を受け取らなければなりませんが、この正確な目的のために(非常に乱雑なスパゲッティコード)マクロを記述しました。残念ながら、コードはまったくエレガントではありませんが、動作します!彼らが言うように...「それを機能させ、正しくし、速くしなさい」。

ステップ1:VBAコード

次の3つが必要です。

  1. チップピアソンのアレイモジュール ---実際のVBAコードは終わりに近づいています。

  2. チップピアソンの並べ替えモジュール -実際のVBAコードも最後に向かっています。

  3. 私のひどく組織化されたマクロ

これらをワークブックのVBAモジュールに貼り付けるには、Alt+を押しF11、プロジェクトエクスプローラーでプロジェクトを見つけ、モジュールフォルダーを右クリックして[モジュールの挿入]を選択します。上記の3つの各リンクのコードを個別のモジュールに貼り付けます。

ここに画像の説明を入力してください

VBAエディターを使用しているときに、[参照設定]ダイアログボックスを開き(Alt+ Tその後Enter)、[Microsoft Scripting Runtime ]をオンにします。

ここに画像の説明を入力してください

ステップ2:データの構造化

邪魔にならないように、今必要になるのは、データ(たとえば「データ」と呼ばれる)が適切に構造化されたデータベースであるかのようなシートです。私がそれをする方法は次のとおりです。

ここに画像の説明を入力してください

さらに2つのシートを作成したことに注意してください。1つは、ドリルダウン検証ロジックが行われる場所の検証と呼ばれ、もう1つは、エンドユーザーにとって重要な実際のコンテンツのメインと呼ばれます。

ステップ3:メインシート

データシートに移動して、次の構造を設定しましょう。

ここに画像の説明を入力してください

セルC2を選択して名前を付けSnack.Selectedます。セルに名前を付けるには、セルを選択してからを押しAlt M M D、表示されたダイアログに画像のように名前を入力します。とりあえず、次のステップがより理にかなっているように、「ケーキ」などの値を入力します。

先に進み、セルにC3「Type.Selected」という名前を付けますが、ここでは空のままにします。

ステップ4:データシートのテーブルから値を取得する

検証シートに移動して、次の構造を設定します。

ここに画像の説明を入力してください

スクリーンショットを見るとわかるように、セルB3:B20を選択して次の数式を入力する必要があります。ここで、マクロが実際に使用されます。

=MultiLookup("Data","Snack",TRUE,TRUE)

代わりにEnterキーを押すと、これがあるので、Ctrlキー+ Shiftキーをヒット+ Enterキー配列数式

広告どおりに機能する場合は、スナックのリストに続いて#N / Aエラーが表示されます。エラーは予想されています-それらはちょうどあなたのサイズに基づいてあなたが予想していたより少ないスナックを持っていることを意味しますB3:B20

数式のパラメーターの説明:

  1. データが配置されているシート(「データ」)
  2. そのシートから必要なフィールド(「スナック」)
  3. 重複を削除(グループ化)しますか?(真)
  4. アルファベット順にソートされていますか?(真)

わかりました、それは少しの価値のための多くの仕事のように思えます、しかしここに壮大なフィナーレが来ます。cells C3:C20には、次の数式を配置します。

=MultiLookup("Data","Type",TRUE,TRUE,"Snack",Snack.Selected)

これにより、利用可能なCakeのタイプが表示されます。これは、前のステップでメインシートに入力した値です。覚えていますか?

これは、式に2つの引数を追加することで機能します。

  1. フィルタリングするフィールド(「スナック」)
  2. (Snack.Selected)と等しい値のみを選択します

したがって、Mainでデータを変更すると、Types列が自動的に更新されます!

ステップ5:検証のまとめ

最後に、Snack.Choicesとを作成してデータ検証を終了しましょうType.Choices。それぞれセルB1C1検証に名前を付けてください。この小さなボックスに入力してセルに名前を付けることもできます。

ここに画像の説明を入力してください

cell B1には、次の式を配置する必要があります。

="Validation!"&CELL("address",B3)&":"&CELL("address",OFFSET(B$2,COUNTIF(B3:B50,"*"),0))

ここに画像の説明を入力してください

これが行うことは、Validation!$ B $ 3:$ B $ 6へのテキスト参照を作成することです。これは、スナックの選択肢がある場所です。その式を右にコピーすれば完了です!

メインシートに戻り、スナックとタイプの検証ルールでこれらのセルを参照しましょう。

セルC2とkbd> Alt A V Vを選択して、データ検証を作成します。「リスト」を選択し、ソースをに設定し=INDIRECT(Snack.Choices)ます。引用符がないことに注意してくださいSnack.Choices

ここに画像の説明を入力してください

セルで同じ操作を行いますC3が、ソースをに設定し=INDIRECT(Type.Choices)ます。

INDIRECT()の値はSnack.ChoicesType.Choicesワークブックの範囲への間接(テキスト)参照であるため、使用します。

検証オプションをいじって、実際の動作全体を確認してください。

ご質問があればお知らせください!


注:Excelを初めて使用した直後に、このモジュールの作成を開始しました。当時、私も知らなかったOption Explicitので、物事は非常に乱雑であり、それをきれいにするために周りに行っていません。しかし、それは機能します!パッチを歓迎します。
アンディテラ

@Andre Terraにご回答いただきありがとうございます。私はそれが完璧に動作すると確信していますが、私には少し複雑すぎるように見えますか、言い換えるとVBAの世界を掘り下げる準備ができていませんブックで実行するマクロ。あなたはそうしているかもしれませんが、Excelの私の限られた知識を考えると、あなたが持っているようにそれは私には思えない。私はこれを試して、それがどうなるか見てみましょう。
MrMarho

@MrMarho親切なコメントをありがとう。コードはユーザー定義関数(MultiLookupの1つ)を介してアクセスできるため、VBAに触れる必要はありません。関数の動作を変更する場合にのみ、コードを編集する必要があります。設定したらどう思うか教えてください。それまでの間、これらの機能が優れている理由を説明するより徹底的なガイドをまとめています。私はこの答えでかろうじて表面をかきました。
アンディテラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.