プロが教えるわが家の防犯対策術!

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

A 回答 (5件)

(データ)A1:


A列   B列   C列    D列   E列   G列
(空白行)
A10110A、D、E3
B20220B、G2
C30330C、F2
D1050H1
E10
F30
G20
H504
(関数式)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列だが、複雑になりそうなので、考えて出来れば、別回答にします。

この回答への補足

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

補足日時:2004/12/12 13:52
    • good
    • 0

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 とか)、ほぼ質問の内容になるかと思います。
    • good
    • 0

#3です。


#3で予告した、質問のD列の回答を上げます。
式が長くなって、いっそVBAでやりたい誘惑に駈られますが。
(データ)
A列   B列   C列   D列  E列
(空白行)#3と合わす為でなくても良いが式が変わる

A101000110ADE
B202000120BG
C303000130CF
D101000250H
E1010003
F3030002
G2020002
H5050001
(関数式)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回とかまでにも容易に変えられます。

この回答への補足

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

補足日時:2004/12/12 13:02
    • good
    • 0

質問の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列については、先に書きましたように関数では難しいと思います。
    • good
    • 0

マクロを作ってみました


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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!