- ベストアンサー
EXCELで重複したデータの処理について
氏名 | 点数 ----------- 山田 | ----------- 鈴木 | ----------- 小林 | ----------- 高橋 | ----------- 田中 | という表があるとします。 氏名 | 点数 ------------ 山田 | 80 ------------ 鈴木 | 100 ------------ 小林 | 70 ------------ 高橋 | 80 ------------ 田中 | 80 というように点数を入力すると 順位 | 名前 | 点数 ------------------- 1 | 鈴木 | 100 ------------------- 2 | 山田 | 80 ------------------- 2 | 高橋 | 80 ------------------- 2 | 田中 | 80 ------------------- 5 | 小林 | 70 のような表を自動的に作成できるようにしたいのですが、どうもうまくいきません。 順位と点数の並び替えは比較的簡単にできたのですが、それに対応した名前の並び替えがうまくできないのです。 VLOOKUP関数を使用して得点に対応した名前を表示させようとしたのですが、 順位 | 名前 | 点数 -------------------- 1 | 鈴木 | 100 -------------------- 2 | 山田 | 80 -------------------- 2 | 山田 | 80 -------------------- 2 | 山田 | 80 -------------------- 5 | 小林 | 70 となってしまい、80点の取得者が全て山田になってしまいました。 このような場合、どのようにすれば正常に並び替えを行うことができるのでしょうか。 言葉足らずで申し訳ありませんが、よろしくお願い致します。 OSはWindowsXP、ソフトはEXCEL2002を使用しています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわぁ。 VLOOKUPは検索範囲の中に同じ値がある場合、一番上にある値しか 表示できません。 今回、rank関数により順位が2の人が3人いるので、一番上の 山田さんしか表示できないということになります。 この場合、一番左にもう一列作業列を使用して 重複しない数字で改めて順位(仮順位とした)をつけて この仮順位でVLOOKUPを使用してはいかがですか? 仮順位 | 順位 | 氏名 | 点数 ------------------------ 2 | 2 |山田 | 80 ------------------------ 1 | 1 |鈴木 | 100 ------------------------ 5 | 5 |小林 | 70 ------------------------ 3 | 2 |高橋 | 80 ------------------------ 4 | 2 |田中 | 80 氏名と点数が入力データでセルC2:D6に入力されているとします。 セルB2には次式を入力し、下へコピーしています。 =rank(D2,D$2:D$6) これが順位の列となります。 次にセルA2に次式を入力し、下へコピーします。 =B2+COUNTIF(D$2:D2,D2)-1 そうすると仮順位の数値がえられます。 これは重複することのない数字となりますので、 =VLOOKUP(数字,$A$2:$D$6,x,0) とすれば80点の山田さんが三人出てくることはないと思います。 (x=2で順位、x=3で氏名、x=4で点数、数字は仮順位の番号です) ただし、シートが異なるようなので、シートの設定もして下さいね。
その他の回答 (3)
- happypoint
- ベストアンサー率36% (521/1422)
こんにちは。 まずご質問の件でVLOOKUPを使用しても山田が3人出てきたとのことですが、この式にはRank関数を使用したのでしょうか? そうすると、山田・高橋・田中の3人が順位2位タイで並びますね。このRankをもとにVLOOKUPしても、同じ2位でも最初のほうにでてくる山田しか表示されないと。そういうことですね。 VBAで処理すればできなくはないです。 ワークシートのchangeイベントに、マクロ記録したコピー&ペースト処理と、ソートの処理を書き込めばいいでしょう。
お礼
回答ありがとうございます。 >まずご質問の件でVLOOKUPを使用しても >山田が3人出てきたとのことですが、 >この式にはRank関数を使用したのでしょうか? >そうすると、山田・高橋・田中の3人が >順位2位タイで並びますね。 >このRankをもとにVLOOKUPしても、 >同じ2位でも最初のほうにでてくる山田しか >表示されないと。そういうことですね。 まさにその通りです!!! 順位にRANK関数を使用してVLOOKUP関数でその順位に対応した名前を表示させようとしたのですが、80点取得者の名前が山田しか表示されなかったので、本当に困っていました。 VBAのchangeイベントというものを使えば良いのですね。VBAは全くの素人ですのでこれから勉強しようと思います。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
C1:D5に 山田 | 80 ------------ 鈴木 | 100 ------------ 小林 | 70 ------------ 高橋 | 80 ------------ 田中 | 80 とデータを入れ B1に関数式 =RANK(D1,$D$1:$D$5) をいれB5まで複写しました。 B1:D5を範囲指定して、ソート(データ-並び替え-B列 )をやると、 1 鈴木 100 2 山田 80 2 高橋 80 2 田中 80 5 小林 70 となりました。どこがお気に召さないのでしょうか。 それともこんな問題じゃないのでしょうか。 本件はエクセルVBAの問題ですか。であればコードを載せないと、原因を指摘できないのでは。
お礼
回答ありがとうございます。 mousengokeさんへのお礼でも書きましたが、点数を入力後手動で並び替え作業を行うのではなく、点数を入力した時点で自動的に並び替え作業を行い、それを別の場所に表示するようにしたかったのです。分かりにくい文章で申し訳ありませんでした。 例えば鈴木の点数を100点から50点に変えると表全体が並び替えられて自動的に鈴木が最下位になる、というような感じです。 このようなことはVBAじゃないとできないのでしょうか。VBAは全く分かりませんので、これから勉強していきたいと思っています。 ありがとうございました。
- mousengoke
- ベストアンサー率50% (197/388)
エクセルで標準で並べ替え機能がついてるんですが。 横にAとZ書いて↓がついてるのです。 あるいは データ→並び替え でもっと詳細に並び替えが出来ます。 もしかしてマクロでやりたかったてこと?マクロを記録してそれを使った方が早いかもしれないよ。
お礼
回答ありがとうございます。 点数を入力した後、手動で並び替え作業をするのであれば、mousengokeさんのおっしゃるとおりの方法でうまくいくのですが、今回は点数を入力すれば入力した時点で自動的に並び替え処理を行い、その表を別の場所に表示するようにしたかったのです。分かりにくい説明で本当に申し訳ありません。 マクロを記録するということもできるんですね。マクロのことは全くの素人ですので、そんな便利な機能があるなんて知りませんでした。さっそく試してみようと思います。 ありがとうございました。
お礼
おぉー!!! できましたー!!! ちゃんと正常に表示されました。感動!!! ありがとうございました!!!