[[20061209132302]] 『連続したドロップリスト』(困ったさん) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『連続したドロップリスト』(困ったさん)
 いつも、いろいろ勉強させてもらってます。
 ただいま、商品管理表を作っております。
 下記の表があるとします。

 sheet1(商品リスト)
      A     B     C
 1 メーカー  商品名   単価
 2 AAA     釘    200
 3 AAA     ネジ   300
 4 BBB     釘    150
 A列〜C列まで商品と名前を付けます。  
 続いて
 sheet2(メーカーリスト)
      A    
 1 メーカー
 2 AAA 
 3  BBB
 A列をメーカーと名前を付けます。  

 上記の表を検索sheetでA1セルに入力規則からメーカーでリスト化し
 A2セルでメーカー名が一致した商品名だけをドロップリストに表示が
 したいのですが、他の質問を見るとメーカーごとで名前を付ける方法
 は見つけたのですが出来れば商品リストを利用したいと思っております。
 是非、どなたか教えてください。
 (使用しているのはExcel2003 OSはWindowsXP です。)

 A2 を、入力規則でリストのドロップダウンで選択させて
 B列 以降を、A2 で出てきたメーカー名に対応したものを、ドロップダウンで選ばせる
 って事でしょうか?
 
 そうであれば、こちらの純丸さんの方法が参考になりませんか?
[[20051024111302]]『リストから選択』(若葉マーク)
 
 (キリキ)(〃⌒o⌒)b


 今、見てきました。
 参考になりますね〜。なんとかなりそうです。
 ちょっとやってみます。
 キリキさんありがとうございました。
 (困ったさん)

 う〜ん。キリキさんに教えてもらったものでメーカごとのリストを作って
 ボスにお伺いをかけたのですが希望通りではないと言われてしまいました。
 商品リストは一つしかなくそこから検索させろとの事です。
 自分で考えればいいのに・・・。
 とボヤいてもしょうがないのでもう一度知恵を貸していただけないでしょうか?
 キリキさんのおっしゃるように
 A2 を、入力規則でリストのドロップダウンで選択させて
 B列 以降を、A2 で出てきたメーカー名に対応したものを、ドロップダウンで選ばせる
 って事でしょうか?
 その通りの内容なのです。
 ぜひ、どなたか教えてください。

 出先なので、携帯から、、、

 上司は、なぜリストを一つと?
 そしてそのリストはどのようなリスト?
 どのようなシート構成?
 作業列を作成することは可能?
 等々。。。

 分からないことだらけですよ^^;

 もう少し具体的に書いた方が、レスが付きやすいかな〜

 (キリキ)(〃⌒o⌒)b

 衝突したけど、そのままペッタンコ。
我儘上司君が、コレを認めてくれないと、全部無駄レスになります。
Sheet1の商品リストが、A1のメーカーをキーとして並び替えられている事が絶対条件となります。

 Sheet1のA1セルに 基準 、A1:A4に メーカー検索 と名前を付けます。
検索用のシートのB2セルにリストを設定するとして、
元の値を、
=OFFSET(基準,MATCH($A$2,メーカー検索,FALSE)-1,1,COUNTIF(メーカー検索,$A$2),1)
とすれば、出来るはず???
(sin)

 vbaで一発
 1) Sheet2のシート名タブを右クリック「コードの表示」
 2) 右空白部分に下記コードを貼り付けxをクリックしてエクセルに戻る
 3) 一度他のシートを選択してからSheet2を選択しなおす

 Private dic As Object 'Sheet2モジュール内でのGlobal 変数の宣言

 Private Sub Worksheet_Activate() 'シートを選択時に実行
 Dim a, i As Long
 With Sheets("Sheet1")
     If .Range("a1").CurrentRegion.Rows.Count < 2 Then
         'Sheet1にデータがない場合は object 変数 dic をNothing にして終了
         Set dic = Nothing
         Exit Sub
     End If
     Set dic = CreateObject("Scripting.Dictionary")
     'Object 変数 dic に Dictionary object を参照させる
     a = .Range("a2",.Range("a" & Rows.Count).End(xlUp)).Resize(,2).Value
     '配列 a にsheet1のA,B列の値を格納(処理高速化のため)
 End With
 For i = 1 To UBound(a,1) ' 配列内のループ開始
     If Not dic.exists(a(i,1)) Then
         ' 配列1列目の値がdictionary objectに無ければ、key に格納, item に2列目の文字
         dic.add a(i,1), a(i,2)
     Else
         ' 既に存在すれば、itemの文字列にカンマ","をつけて2列目の文字列を繋げる
         dic(a(i,1)) = dic(a(i,1)) & "," & a(i,2)
     End If
 Next
 With Range("a2:a10").Validation ' A2:A10へ入力規則の設定
     .Delete ' 削除
     .Add type:=xlValidateLlist, formula1:=Join(dic.keys,",")
     ' formula1 に dic.keyを","でつなげた文字列を挿入
 End With
 End Sub

 Private Sub Worksheet_Change(ByVal Target As Range)' セルに変化が生じた時に実行
 If dic Is Nothing then Exit Sub 'dic object がNothingの場合は終了
 With Target.Cells(1,1)
     If .Column <> 1 Then Exit Sub 'A列以外は無視
     If .Row = 1 Then Exit Sub '一行目も無視
     .Offset(,1).Value = "" ' B列の値をクリア
     If IsEmpty(.Value) Then Exit Sub 'A列の値が Empty であれば終了
     With .Offset(,1).Validation ' B列に入力規則を設定
         .Delete '既に設定されていたら削除
         .Add type:=xlValidateList, formula1:=dic(Target.Cells(1,1).Value)
         '変更されたA列の値をdic objectで参照してitemに格納されている文字列に設定
     End With
 End With
 End Sub
 (seiya)
 修正:16:30

 メーカーリスト列方向へメーカーごとの商品リストを作成。
列制限のため各メーカー255アイテムまで。メーカー配列ランダム可。
 
商品リストシートで挿入>名前>定義
「名前」   メーカー名
「参照範囲」 =INDIRECT("商品リスト!$A2:$A"&COUNTA(商品リスト!$A:$A))
「名前」   商品名
「参照範囲」 =INDIRECT("商品リスト!$B2:$B"&COUNTA(商品リスト!$B:$B))
 
商品リスト
	A	B	C
1	メーカー	商品名	単価
2	AAA	釘A1	200
3	AAA	ネジA1	300
4	BBB	釘B1	150
5	AAA	ボルトA1	170
6	BBB	ナットB1	190
7	AAA	釘A2	210
8	AAA	ネジA2	230
9	BBB	釘B2	250
10	AAA	ボルトA2	270
11	BBB	ナットB2	290
12	AAA	釘A3	310
13	AAA	ネジA3	330
14	BBB	釘B3	350
 
メーカーリスト
	A	B	C	D	E	F	G	H	I
1	メーカー								
2	AAA	釘A1	ネジA1	ボルトA1	釘A2	ネジA2	ボルトA2	釘A3	ネジA3
3	BBB	釘B1	ナットB1	釘B2	ナットB2	釘B3		
 
メーカーリストシートのB2へ下記数式。
=IF(COUNTIF(メーカー名,$A2)>=COLUMN(A1),INDEX(商品名,SMALL(IF(メーカー名=$A2,ROW(商品名)-1),COLUMN(A1))),"")
 
Enterで確定したいところを我慢して Ctrl と Shift を押しながらEnter。
B2の数式をメーカーの数だけB列へコピー、同じく、列方向右側へ同じくコピー。
各メーカーの商品名が抽出されます。
2行目以下、メーカー名の入力されている範囲を行範囲選択して
挿入>名前>作成 、左端列にチェックしてOK。
商品選択の入力規則でリストの元の値を =INDIRECT(A2) などとします。
件数によっては動作が重くなりそうではある。
(みやほりん)(-_∂)b

 あららっ。今、わかりづらいかと思ってもう一度整理しようと思っていました。
 逆にわかりづらくなるなと諦めて戻ってきたらこんなにたくさんのレスが。
 有り難うございます。ちょっと一つ一つ確認してみます。とりあえず少々時間
 を頂きます。(困ったさん)

 検証しました。
 全部思い通りに出来ました。
 (キリキ)さん、(sin)さん、(seiya)さん、(みやほりん)さん
 本当に有り難うございました。これでボスをギャフ〜ンと言わせられそうです。
 本当に助かりました。

 さて、 一つ質問なのですが(seiya)さんvba有り難うございます。
 早速なのですがこの記述文の解説をしていただけないでしょうか?
 例題では出来たのですがこれから加工するにあたり何がどうでどうなんだか
 ちょっとはわかるのですがって言うかほとんどわからないので是非教えて
 いただきたいなと・・・。
 厚かましいお願いですが今後の勉強の為、宜しくお願いいたします。(困ったさん)

 簡単に説明文を付けました。
 Dictionary objectに付いては、VB HELP を参照してください。
 (seiya)


 (seiya)さん
 有り難うございます。
 勉強させていただきます。
 なにからなにまで本当に有り難うございました。
 また、ご教授いただいた皆様ありがとうございましたm(__)m
 また何かありましたら教えてください。
 では!(困ったさん)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.