• ベストアンサー

【Excel】該当データ表示方法について

Excelの表で、(A)列にデータ名、(B)列にデータ値が入力されているとして、 1.(C)列に(B)列のデータ値の種類を昇順で表示、 2.(D)列に(C)列のデータ値を持つ(A)列の文字を表示、 3.(E)列に(D)列のデータ種類の数を表示 という3つの内容を実現したいのですが、(1つでも) ご存知の方、教えて下さい。よろしくお願いしますm(__)m 【イメージ】   | (A) (B) (C)  (D)   (E) ――――――――――――――――――― (1)| A 10 10 A、D、E   3 (2)| B 20 20 B、G    2 (3)| C 30 30 C、F    2 (4)| D 10 (5)| E 10 (6)| F 30 (7)| G 20

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

(データ)A1: A列   B列   C列    D列   E列   G列 (空白行) A 10 1 10 A、D、E 3 B 20 2 20 B、G 2 C 30 3 30 C、F 2 D 10 50 H 1 E 10 F 30 G 20 H 50 4 (関数式)C列 C2に=IF(COUNTIF($B$2:B2,B2)=1,MAX($C$1:C1)+1,"") といれて、C3以下最下行まで式を複写する。 結果は上記C列の通り (関数式)D列 D2に=INDEX($B$2:$B$100,MATCH(ROW()-1,$C$2:$C$100,0),1)といれて、D3以下C列の最大値まで式を複写する。$B$100の100はデータ数より多ければよい。 結果上記D列の通り。 (関数式)F列 F2に=COUNTIF($B$2:$B$100,D2)といれf3以下にD列の最下行まで式を複写する。 結果上記F列の通り。 問題はE列だが、複雑になりそうなので、考えて出来れば、別回答にします。

katti178
質問者

補足

ご回答有難う御座います。もう一つ知りたいのですが、D列のデータは昇順に表示することは、出来ないのでしょうか。よろしくお願いします。m(__)m

その他の回答 (4)

回答No.5

ANo.2の続きです。 E列の1つのセルにA、D、Eなどと表示することはやっぱりマクロを使わないと出来ないようですが、G列以降に1列に1つずつ該当するデータの種類を表示することは可能です。 F1セルに以下の式を入力して、F2以下にコピーします。 =IF(E1>0,INDEX($A$1:$A$20,MATCH($C1,$B$1:$B$20,0),1),"") ifでE1セルの個数が1以上の場合に表示する判定をしています。あとはMATCH関数でC列の数値に合致するA列の種類を表示します。これで、最初の1つ目の種類は表示されます。上記の式では範囲を1~20行までのしていますので、必要に応じて設定してください。 次にG1セルに以下の式を入力し、G2以下および、H,I・・・と以降の列に予測される種類の数分だけコピーします。 =IF($E1-COUNTA($F1:F1)>0,INDEX(INDIRECT("$A$"&TEXT(MATCH(F1,$A$1:$A$20,0)+1,"###")&":$A$20"),MATCH($C1,INDIRECT("$B$"&TEXT(MATCH(F1,$A$1:$A$20,0)+1,"###")&":$B$20"),0),1),"") 少々式が複雑ですが、INDIRECT関数で自分より前にある種類をのぞいた残りの行でのF1セルと同じことをしています。 例えば、G1せるでは、F1セルにすでに"A"が表示されていますので、このAがある1行目+1から範囲をさだめて、 =IF($E1-COUNTA($F1:F1)>0,INDEX($A$2:$A$20,MATCH($C1,$B$2:$B$20,0),1),"") という式になります。 あとどうしてもE列に表示したいときは、F列以降の文字を連結する式をE列に書いておけば(例えば =F1&G1&H1&I1 とか)、ほぼ質問の内容になるかと思います。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

#3です。 #3で予告した、質問のD列の回答を上げます。 式が長くなって、いっそVBAでやりたい誘惑に駈られますが。 (データ) A列   B列   C列   D列  E列 (空白行)#3と合わす為でなくても良いが式が変わる A 10 10001 10 A D E B 20 20001 20 B G C 30 30001 30 C F D 10 10002 50 H E 10 10003 F 30 30002 G 20 20002 H 50 50001 (関数式)C列 C2に=B2&LEFT("00",3-LEN(COUNTIF($B$2:B2,B2)))&COUNTIF($B$2:B2,B2) といれて最下行まで式を複写する。結果は上記C列の通り。 (D列) #3で回答した方法で出す。 (関数式)E列以右 E2に=IF(ISERROR(INDEX($A$1:$A$100,MATCH($D2&TEXT(COLUMN()-4,"000"),$C$1:$C$100,0),1)),"",INDEX($A$1:$A$100,MATCH($D2&TEXT(COLUMN()-4,"000"),$C$1:$C$100,0),1)) といれる。適当に右方向に式を複写する。Z列まで複写した とすると、E2:Z2を範囲指定して、Z2で+ハンドルを出し D列の最下行まで引っ張る。 結果は上記のE,F、G列・・の通り。 B列の10,20,30・・の出現回数は999回以下の仮定となっています。001とかの連番を振る仕組みのため。9999回とかまでにも容易に変えられます。

katti178
質問者

補足

ご回答有難う御座います。教えて頂いた『#3』はできたのですが、『#4』のD列の設定で、D2に【=INDEX($B$2:$B$100,MATCH(ROW()-1,$C$2:$C$100,0),1)】を入力したのですが、#N/Aと表示されてしまいます。勝手なお願いで申し訳ないですが、原因を教えて頂けないでしょうかm(__)m

回答No.2

質問の1.および3.は下記の方法で可能です。 2.については再帰できる関数というものがないので、関数ではかなり難しいと思います。これだけは#1で回答されているようにマクロを使うしかないと思いますが。 3.について 参照の都合上、こちらを先に書きます。 まず、E1セルにsmall関数を使って最小値を探し、それと同じ数値をcountif関数で数えます。 具体的には、 =COUNTIF([範囲],SMALL([範囲],1)) です。[範囲]にはデータのあるB列を指定してください。例→ B1:B7 とか、 E2は、 =COUNTIF([範囲],SMALL([範囲],SUM($E$1:E1)+1)) として、これをデータ数分だけ下にコピーしてください。small関数は第2引数で指定した順位のデータを返す関数なので、第2引数にすでにカウントした分+1を設定しています。 1.について C1セルについては、最小値を得ればいいので、 =SMALL([範囲],1) とします。 C2セルは、 =IF(E2=0,"",SMALL([範囲],SUM($E$1:E1)+1)) として、C3以下にコピーします。 if関数はエラーを表示させないためだけに使っています。 D列については、先に書きましたように関数では難しいと思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

マクロを作ってみました Public Sub 処理() Dim base As Range, i, pos Dim NumList, max, min, wk Set NumList = CreateObject("Scripting.Dictionary") max = -999999999 min = 999999999 Set base = Range("A1") i = 0 Do While (base.Offset(i).Value <> "") If Not NumList.Exists(base.Offset(i, 1).Value) Then '始めてでてくる数値を登録 NumList.Add base.Offset(i, 1).Value, base.Offset(i).Value If max < base.Offset(i, 1).Value Then max = base.Offset(i, 1).Value If min > base.Offset(i, 1).Value Then min = base.Offset(i, 1).Value Else '重複する場合、連結する NumList.Item(base.Offset(i, 1).Value) = NumList.Item(base.Offset(i, 1).Value) & "," & base.Offset(i).Value End If Range(base.Offset(i, 2), base.Offset(i, 4)).ClearContents i = i + 1 Loop pos = 0 For i = min To max Do Until NumList.Exists(i) i = i + 1 If i > max Then Exit Sub Loop base.Offset(pos, 2).Value = i base.Offset(pos, 3).Value = NumList.Item(i) wk = Split(NumList.Item(i), ",") base.Offset(pos, 4).Value = UBound(wk) + 1 pos = pos + 1 i = i + 1 Next End Sub

関連するQ&A