[[20060301183031]] 『該当する氏名を一覧表に抽出』(Kさん) ページの最後に飛ぶ

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

 

『該当する氏名を一覧表に抽出』(Kさん)

いつもお世話になります。今回も初歩的な質問で吸いませんがお助け願います。

A    B   C

田中      100

吉田       95

広瀬       98

黒木      100

今岡       75

という100名程度の表があります。B列にはいろいろ数字が入っています。
この表から「100点」の人や「90点台の人」の氏名を抽出したいのです。
INDEX関数を使うのかな、と思うのですが、私の力では思うようにはなりませんでした。


個別に抽出はだめですか。
 「データ」「フィルタ」「オートフィルタ」にチェックを入れる。
 マウスポインタは表の中に入れてから行ってください。
 (shota)


(shota)様、ありがとうございました。この方法で、確かにできました。できれば、数式で抽出したいのです。数式では難しいですか?

 こんばんは
例えば 90点台なら
=SUMPRODUCT((B1:B5<100)*(B1:B5>90)*(B1:B5))
                      (oni)


oni様、ありがとうございます。具体的に、この式をどのように使うかが分からないので説明していただけると助かります。(一見したところ、名前が抽出できるか分からないので)K


 C1に入れる式
 =IF(COUNTIF($B$1:$B$5,">=90")<ROW(),"",INDEX($A$1:$A$5,SMALL(IF($B$1:$B$5>=90,ROW($A$1:$A$5)),ROW())))
 として、Shift+Ctrlキー押しながらEnterキーで確定させて配列数式にします。
 あとは、下方向にコピー

 (川野鮎太郎)

この式もセル番地をAC31101に持っていくと空欄になります。
 なぜでしょう
 (shota)


 回答者の皆さんは、データが A1:B5 にあるものとして、回答をされていますが!
 Kさんの実際のデータはどのにあるのでしょうか?
 (pockey)

もちろんデータも移動しています。
      AA    AB   AC 
 31102 田中    100    =IF(COUNTIF($AB$31102:$AB$31106,">=90")<ROW(),"",INDEX($AA$31102:$AA$31106,SMALL(IF($AB$31102:$AB$31106>=90,ROW($AA$31102:$AA$31106)),ROW())))
 31103 吉田    95 
 31104 広瀬    98 
 31105 黒木    100 
 31106 今岡    75 
 という具合にセル番地も変えていますが、
 なぜか大きなセル番地になると反応してくれません。
 何故でしょうか
 (shota)


 配列に関する過去ログです。
[[20050212191618]]『理解に苦しんでます』(頭いたい子)

 (川野鮎太郎)


おはようございます。Kです。皆さん、いろいろとアイディアありがとうございます。----
いくつか質問があります。初歩的でスミマセン。shota様の式の最後の方に$$がありますが、2つ必要なのはなぜですか。鮎太郎様、shota様の式を入力しましたが、90点以上の氏名を正しく抽出できませんでした。ちなみにB列には他のデータが並んでいます。
無知な私に、お時間がある時で結構ですので、式の意味をどなたか解説して頂けると助かります。これらの式を参考に、頑張ってみます。よろしくお願いします。

Kです。
実際の表では、氏名がA5から入力されているのですが、そのことがなにか影響するでしょうか。

 A列に名前でC列に点数で、5行目からですね!
=IF(COUNTIF($C$5:$C$9,">=90")<ROW(A1),"",INDEX($A$5:$A$9,SMALL(IF($C$5:$C$9>=90,ROW($C$5:$C$9)-ROW($C$4)),ROW(A1))))
配列数式として確定は同じです。

 ★IF(COUNTIF($C$5:$C$9,">=90")<ROW(A1),""
『C5:C9の範囲で90以上の数がROW(A1)=1より小さい』という条件に対し、
TRUEならば空白を返し、 
   ※""を空白と表現しましたが、何も入力しない文字列です。
   何も入力していないC1に対し、D1セルに =TYPE(IF(C1="","",1)) としてC1に入力したりDeleteしたりして試してください。
  結果は、TYPE関数のEXCELヘルプでご確認下さい。

 FALSEならば↓
 ★INDEX($A$5:$A$9,SMALL(IF($C$5:$C$9>=90,ROW($C$5:$C$9)-ROW($C$4)),ROW(A1))))
INDEXの配列A5:A9に対し、
C5:C9が90以上ならばその行ナンバーからROW($C$4)=4を引いた値の中で、
一番小さい値(ROW(A1)=1)の順番にあるものを返す。
  ※今回、IF関数のFALSE部分の指定をしていないので、FALSEの場合はFALSEと返りますが、
    実際には、最初のIF(COUNTIF($C$5:$C$9,">=90")<ROW(A1),""により、""が返されています。

 INDEX関数は、配列内の上端が1、左端が1になり、この行(列)位置を指定することにより該当するものが返されます。
例えば、A1:B2の配列に対し、B1を返したい場合は、 =INDEX($A$1:$B$2,1,2) となります。
従って、範囲の一番目A5位置【ROW(C5)=5】を1にするために【ROW($C$4)=4】を引いています。単純に-4としても当然OKです。
これもINDEX関数のヘルプを一読下さい。

 また、全体の式に中に''相対参照($の付いていないセル指定)''になっている ROW(A1) 部分は、
下にコピーする事により1,2,3・・・という値を得るためにあります。
これを右にコピーする場合は、COLUMN(A1) に置き換えれば、同様に1,2,3・・・を得る事が出来ます。
 鮎太郎さんが当初 A1 部分を省略しているのは、 >C1に入れる式
という、条件を提示していますから、当然この場合にROW()は、ROW(C1)の意なのです。
 >実際の表では、氏名がA5から入力されているのですが、そのことがなにか影響するでしょうか。 
に関しては、大いに影響します。 実感されてますよね?

 指定が無い場合、回答される皆さんは○○の範囲として但し書を入れているか、
暗黙の了解として、A1から始まる範囲での回答をされています。
必要性を判断できない場合等には、シート名やセル番地・諸条件は、必ず書き込んだ方がお互いに時間の節約になります。
ただし、必ず提示された条件通りの回答が付くとは限りません。
手取り足取りだと自分のものにしようとする努力を惜しむ方もいらっしゃる様ですから・・・

 $$に関しては、修正されていますので、ご確認下さい。
(sin)  拙い説明でごめんなさいね。ペコリ〜


sin様、大変お手数を掛けました。バッチリ抽出できました。また、詳しい説明ありがとうございます。少しずつエクセルが自分でできはじめると、また壁にぶつかるということを繰り返しています。今度は自分で数式を作って、応用していきたいと思います。本当にありがとうございました。(K)

sinさん やはり私のぼんくら頭では配列数式が理解できません。
詳しく教えてくださっているのに理解力が無いのでだめでした。
これに懲りずまたご指導お願いいたします。
今回はありがとうございました。
(shota)


たびたびスミマセン。この数式を利用して、例えば80点から90点の間の人を抽出する事はできますか。チャレンジしたのですが、サッパリでした。(K)

 shotaさん、これだとどうでしょう???
   A	B	C	 a	  b	    c	           d
 5 田中    	100	4<1=FALSE	 TRUE→5-4=1 SMALL({1,2,3,4},1)=1	INDEX($A$5:$A$9,1)=A5
 6 吉田	          95	4<2=FALSE TRUE→6-4=2 SMALL({1,2,3,4},2)=2	INDEX($A$5:$A$9,2)=A6
 7 広瀬	          98	4<3=FALSE TRUE→7-4=3 SMALL({1,2,3,4},3)=3	INDEX($A$5:$A$9,3)=A7
 8 黒木	         100	4<4=FALSE TRUE→8-4=4 SMALL({1,2,3,4},4)=4	INDEX($A$5:$A$9,4)=A8
 9 今岡            75	4<5=TRUE  FALSE

 a:IF(COUNTIF($C$5:$C$9,">=90")<ROW(A1) 部分	
通常の関数式と同じです。COUNTIFの結果『4』と、表示したい上からの順番(数)とを比較しています。		

 b:IF($C$5:$C$9>=90,ROW($C$5:$C$9)-ROW($C$4)) 部分	
IF($C$5>=90,ROW($C$5)-ROW($C$4))という式の
『範囲C5』を『範囲C5:C9』に広げて一度に計算結果を保持する(?)為に配列数式にしています。

 c:SMALL(IF($C$5:$C$9>=90,ROW($C$5:$C$9)-ROW($C$4)),ROW(A1)) 部分	
『 {1,2,3,4} 』は配列定数ですが、bの配列数式の結果を受けたものです。

 d:INDEX($A$5:$A$9,SMALL(IF($C$5:$C$9>=90,ROW($C$5:$C$9)-ROW($C$4)),ROW(A1))) 
各セルの1,2,3,4は、cの結果です。		

 配列数式にしない場合には、		
D5セルにbの部分にも書いた、 =IF($C$5>=90,ROW($C$5)-ROW($C$4)) を入力しD9まで下方コピーすると、
表の結果と同じ 1,2,3,4,FALSE が各セルに返るはずです。その結果を利用して、	
 =INDEX($A$5:$A$9,SMALL($D$5:$D$9,ROW(A1))) とすれば配列数式ではない方法で求める事が出来ます。	
※FALSE部分でエラーが出ると思いますが・・・		
 (sin)			


 90以上、100未満で出してしまいました。これで応用してください。
=IF((COUNTIF($C$5:$C$9,">=90")-COUNTIF($C$5:$C$9,">=100"))<ROW(A1),"",INDEX($A$5:$A$9,SMALL(IF(($C$5:$C$9>=90)*($C$5:$C$9<100),ROW($C$5:$C$9)-ROW($C$4),10^9),ROW(A1))))
 配列数式で確定です。
90以上から100以上の数を引いてます。
AND関数と配列数式は相性が悪かったと思うので、掛けてみました。TRUE=1,FALSE=0を元に計算します。
(sin)

sinさん すみません わざわざ回答をいただいたのに理解できませんでした。
自分のふがいなさに腹が立ちます。
本当にありがとうございました。
(shota)

 >理解できませんでした。
これでは、何が理解できないのか 理解できません。
理解する為の一つの方法として、上記で私が書いている表部分をご自分で実際に入力して試されては如何でしょう?
そして、数式バー上で関数にカーソルを合わせ、左にあるfx(もしくは =)をクリックして出てくる窓で確認したり、
[ツール]-[ワークシート分析]-[数式の検証]を使ってみては如何でしょうか?
(sin)


 sinさん、フォローありがとうございます。(o_ _)o))

 (川野鮎太郎)


    A     B        C
 1 田中	70	=IF(COUNTIF($B$1:$B$5,">=90")<ROW(),"",INDEX($A$1:$A$5,SMALL(IF($B$1:$B$5>=90,ROW($A$1:$A$5)),ROW())))
 2 吉田	95	広瀬
 3 広瀬	98	黒木
 4 黒木	100	
 5 今岡	75	
 というふうにセルA1からだと出来るのに
        AA        AB      AC
 31102 田中	70	=IF(COUNTIF($B$1:$B$5,">=90")<ROW(),"",INDEX($A$1:$A$5,SMALL(IF($B$1:$B$5>=90,ROW($A$1:$A$5)),ROW())))
 31103 吉田	95	
 31104 広瀬	98	
 31105 黒木	100	
 31106 今岡	75
 セル番地を変えると名前が表示できなくなるんです。
 =IF(COUNTIF($B$1:$B$5,">=90")<ROW(),"",INDEX($A$1:$A$5,SMALL(IF($B$1:$B$5>=90,ROW($A$1:$A$5)),ROW())))
 この式をどう変えたら出来るのかわからないんです。
 sinさんがこと細かくご指導してくださいましたがいまいちわからないんです。
 大変あつかましいお願いですけど、式を書き換えていただけないでしょうか。
 完全にお手上げの状態です。
 (shota)


Kさん oniさん 川野鮎太郎さん sinさん  みやほりん キリキさんどうもありがとうございました。 ありがとうございました。完璧になりました。どうもありがとうございました。何度お礼を言っても言い尽くせません。本当にありがとうございました。
 ところで以前Kさんからこんなのがありました
 「たびたびスミマセン。この数式を利用して、例えば80点から90点の間の人を抽出する事はできますか。チャレンジしたのですが、サッパリでした。(K)」 
 私も知りたいです。どうか今一度お力をお貸しください。
 お願いします。
 (shota)

	A	B	C
1	田中	70	吉田
2	吉田	85	広瀬
3	広瀬	88	
4	黒木	100	
5	今岡	75	

 C1=IF(SUMPRODUCT(($B$1:$B$5>=80)*($B$1:$B$5<=90))<ROW(),"",INDEX($A$1:$A$5,SMALL(IF(($B$1:$B$5>=80)*($B$1:$B$5<=90),ROW($A$1:$A$5)),ROW())))

	AA	AB	AC
31102	田中	70	吉田
31103	吉田	85	広瀬
31104	広瀬	88	
31105	黒木	100	
31106	今岡	75	

 AC31102=IF(SUMPRODUCT(($AB$31102:$AB$31106>=80)*($AB$31102:$AB$31106<=90))<ROW(A1),"",INDEX($AA$1:$AA$31106,SMALL(IF(($AB$31102:$AB$31106>=80)
 *($AB$31102:$AB$31106<=90),ROW($AB$31102:$AB$31106)),ROW(A1))))
 (Maron)

Maronさん お手数をおかけしました。
ありがとうございます。
本当にありがとうございます。
(shota)


おはようございます。皆さんのおかげで、サッパリだった80点から90点の間の氏名の抽出がバッチリできました。(^o^)本当にありがとうございました。COUNTIF、SUMPRODUCTのどちらでもできるのがエクセルのおもしろさなのでしょうか。このサイトは本当に勉強になります。自分でこういう関数がスラッと作れるように、頑張ってみます。(K)

Kさん良かったですね
私のほうはなぜかできませんでした。
 AC31102=IF(SUMPRODUCT(($AB$31102:$AB$31111>=80)*($AB$31102:$AB$31111<=90))ROW(A1),"",INDEX($AA$31102:$AA$31111,SMALL(IF(($AB$31102:$AB$31111>=80)*$AB$31102:$AB$31111<=90),ROW($AB$31102:$AB$31111)),ROW(A1))))
 色々と考える範囲で数字を書き換えたりしたんですがなぜかエラーになります。
 Maronさんお手数でしょうが、今一度教えてください。
 宜しくお願いします。
 (shota)


 式の意味(数式内の各関数の意味)を理解されていないから出来ないのです。
=IF(SUMPRODUCT(($AB$31102:$AB$31111>=80)*($AB$31102:$AB$31111<=90))<ROW(A1),"",INDEX($AA$1:$AA$31111,SMALL(IF(($AB$31102:$AB$31111>=80)*($AB$31102:$AB$31111<=90),ROW($AB$31102:$AB$31111)),ROW(A1))))

 (川野鮎太郎)


 ◆川野鮎太郎さんの式と、shotaさんの式を比べてください!
 ◆違うところがありますよね!!
 (Maron)

川野鮎太郎さん 何から何までやってもらって本当にありがとうございます。
 完璧に出来ました。
 式の意味を今一度ひもほどいで理解に勤めようと思っております。
 どうもありがとうございます。
 涙が出そうなほど嬉しいです。
 今後ともご指導をお願いします。
 (shota)

コメント返信:

[ 一覧(最新更新順) ]


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