ここから本文です

エクセル2013を使用しています。

son********さん

2015/11/2012:29:50

エクセル2013を使用しています。

品名・色名・コードがあり、
数が多いため品名と色名を紐付し
品名に対してプルダウンで色名をだし
それに対してのコードが自動で出てくるようにしたいのですが、
表の形はどのようなものでもいいので
できる方法がありましたら教えてください。

説明がわかりにくく申し訳ありませんがよろしくお願いします。

閲覧数:
133
回答数:
2
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

ask********さん

2015/11/2108:42:35

こんな感じでどうでしょう?

A列→品名のドロップリストから選択
B列→A列で選択した品名に対応する色をドロップリストで選択
C列→A・B列の値を元に、VLOOKUP関数でコード表からコードを探して表示

---模擬データの概要----
大分類
品名(Tシャツ,Yシャツ,ジャケットなど)

中分類
色(品名ごとに色が分かれています)

重複する色もあります。
Tシャツ(グレー)
ジャケット(グレー)
色は同じでもコードは異なります。

その品名にしか存在しない色もあります。
タオル(緑)
タオル(紫)

Tシャツには緑や紫が存在しないので、品名でTシャツを選択したら、色のドロップリストには表示されません。


--名前の定義----
大分類および中分類の項目を、1行目に入力します。
A1(品名) B1(Tシャツ)C1(Yシャツ)D1(ジャケット)……

そして各列に、一行目に対応する品名か色を入力します。(添付図①)

※品名や色の種類が多すぎて、図①の表作成に時間がかかる場合は補足してください。図①の作成法を返信します。

上端行の値を利用して名前を定義します。ただし、図①のように各項目の数が異なる場合は、図①のように選択した状態で名前を定義するとドロップリストに空白ができてしまいます。

図②のように、各項目のデータ範囲を選択した状態で名前を定義します。

項目が多い場合は、以下のコードを使ってください。

名前を定義したい範囲を選択した状態で実行します。

選択範囲の各列ごとに、2行目から最終行までの範囲を、1行目の値を使用して【名前を定義】します。

※添付図①ではA列から表を作成していますが、別の列から表を作成しても構いません。

-----
Sub 各項目列_名前を定義()
Dim T, LR, K
Application.DisplayAlerts = False
K = Selection.Cells(1).Column
For T = K To K + Selection.Columns.Count - 1
LR = Cells(Rows.Count, T).End(xlUp).Row
Cells(1, T).Resize(LR, 1).CreateNames Top:=True, Left:=False, Bottom:=False, Right:=False
Next
Application.DisplayAlerts = True
End Sub
-----

---入力規則の設定-----
データを入力するシートに、入力規則を設定します。

A2~データを入力予定の行まで選択します。

入力規則で【入力値の種類→リスト】
「元の値」と書かれた箇所のテキストボックスに次のように入力します。図③

=品名

B2~データを入力予定の行まで選択します。
テキストボックスに次のように入力します。図④

=INDIRECT(A2)

設定をすると、「元の値はエラーと判断されます…」というメッセージが表示されますが、これはA列に値を入力していないので表示されただけです。「はい」を選択します。

---コード表の作成---
品名・色・コードのように並んだ表を作成します。図⑤

※種類が多い場合は補足してください。表の作成法を返信します。

品名の一列前に、次式を入力します。(品名の列がK列、色の列がL列の場合です)

=K1&"●"&L1

[品名]と[●]と[色]を連結させた文字列ができました。
連結したら、形式を選択して貼り付けで【値】にします。

連結文字の列からコードの列までのデータ範囲(4列)を選択して名前を定義します。

名前は好きなようにつけてください。ここでは「コード表」と定義しました。


----
A列で選択した品名に対応する色だけが、ドロップリストで選択できます。図⑥⑦
----


---VLOOKUP関数の入力----
データを入力するシートのC2~データを入力予定の行までを選択します。

=IF(OR(A2="",B2=""),"",VLOOKUP(A2&"●"&B2,コード表,4,FALSE))

A列の値とB列の値を連結した文字を検索値にして、コード表の連結文字の列から該当データを探して、4列目の値を取り出します。
A列B列に空白がある場合は、空白を返します。

こんな感じでどうでしょう?

A列→品名のドロップリストから選択...

質問した人からのコメント

2015/11/26 13:16:11

何とか作成できました。丁寧なご説明ありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

mit********さん

2015/11/2013:57:42

例えばシート1が作成表としてA列からC列で1行目はお示しのような項目名があるとします。
ところでプルダウンなどで品名や色名を選択できるようにするためにはそのためのデータベースとなる表をシート2に用意することにします。
シート2では次のようにします。A2セルから下方には品名を入力します。
B1セルには次の式を入力して右横方向にドラッグコピーします。

=IF(COLUMN(A1)>COUNTA($A2:$A100)*2,"",IF(MOD(COLUMN(A1),2)=0,"",INDEX($A:$A,ROUNDUP(COLUMN(A1)/2,0)+1)))

1列おきに品名が表示されます。
その品名の入力された列で2行目は空白行にして3行目から下方にその品名にかかわる色名を入力します。
またその右隣の列にはその品名と色名に関係するコードを入力します。
その後に例えばB1セルからB20セルまでを範囲として選択してから「数式」タブで「名前の定義」をクリックします。
名前の窓にはB1セルのデータが表示されるでしょう。
参照範囲の窓にはSheet2!$B$1:$B$20のように表示されますがそれをSheet2!$B$2:$B$20のように変えてからOKします。
このような操作を1行目に品名が表示されている列について実施します。
これらの一連の操作が終わってからシート1に移ってA2セルから例えばA100セルまでを選択します。
「データ」タブで「データの入力規則」から入力値の種類のまででは「リスト」を選択したのちに下の窓には次の式を入力してOKします。

=Sheet2!A$1:A$100

次にB2セルからB100セルを選択します。
上記と同様にして「リスト」で下の窓には次の式を入力してOKします。

=INDIRECT(A2)

また、C2セルから下方にはコードを表示させるためC2セルには次の式を入力して下方にドラッグコピーします。

=IF(COUNTA(A2:B2)<>2,"",INDEX(Sheet2!B:ZZ,MATCH(B2,INDEX(Sheet2!B:ZZ,1,MATCH(A2,Sheet2!B$1:ZZ$1,0)):INDEX(Sheet2!B:ZZ,20,MATCH(A2,Sheet2!B$1:ZZ$1,0)),0),MATCH(A2,Sheet2!B$1:ZZ$1,0)+1))

以上の操作によってシート1のA2セルから下方では品名がプルダウンで、B2セルから下方では色名がそれぞれぷダウンの操作で選ぶことができますし、同時にC列には関係するコードが表示されますね。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる