Excelで、


[田中] | [国語] | [○]
[田中] | [算数] | [×]
[田中] | [理科] | [×]
[木村] | [国語] | [×]
[木村] | [算数] | [×]
[木村] | [理科] | [×]
[佐藤] | [国語] | [×]
[佐藤] | [算数] | [○]
[佐藤] | [理科] | [○]
[鈴木] | [国語] | [×]
[鈴木] | [算数] | [×]
[鈴木] | [理科] | [×]
[山田] | [国語] | [×]
[山田] | [算数] | [○]
[山田] | [理科] | [×]

のようになっているファイル(実際には行数がもっと多いです)で、
条件に1件でも該当する名前を上部に、

[田中] | [国語] | [○]
[田中] | [算数] | [×]
[田中] | [理科] | [×]
[佐藤] | [算数] | [○]
[佐藤] | [理科] | [○]
[佐藤] | [国語] | [×]
[山田] | [算数] | [○]
[山田] | [国語] | [×]
[山田] | [理科] | [×]
[木村] | [国語] | [×]
[木村] | [算数] | [×]
[木村] | [理科] | [×]
[鈴木] | [国語] | [×]
[鈴木] | [算数] | [×]
[鈴木] | [理科] | [×]

のようにさせたいのですが、

良いやり方がありましたらご教授ください。よろしくお願いします。

回答の条件
  • 1人3回まで
  • 登録:2007/07/10 00:43:12
  • 終了:2007/07/10 21:05:08

ベストアンサー

id:rikuzai No.6

りくっち回答回数1366ベストアンサー獲得回数1412007/07/10 10:10:49

ポイント400pt

関数と並び替えで出来る方法を一つ。


名前がA列、

教科がB列、

条件がC列、

にそれぞれ入っているとして、

D1=A1&C1

E1=COUNTIF(A:A,A1)-COUNTIF(D:D,A1&"×")

と入力し、該当行までコピーします。

(私のPCで10000行1分ちょっとでした)


D、E列を選択し、コピー、そのまま右クリック「形式を選択して貼り付け」で値貼り付けをします。


ツールバーの「データ」→「並び替え」で、

最優先されるキーを「列B」(教科)「昇順」でOK。


再度「並び替え」をクリックして、

最優先「列E」「降順」

2番目「列A」「昇順」

3番目「列C」「降順」

でOK。


これで例示の結果と同じ並びにになるかと思います。


以上ご参考まで。

id:Solais

ありがとうございます。

名前ごとの行数(科目の種類)が固定と思われて当然のように質問してしまい、

わかりにくくなったと思いますので、再度質問しなおしさせてもらいました。

よろしければそちらの方で再度回答いただければありがたいです。

http://q.hatena.ne.jp/1184068835

2007/07/10 21:03:59

その他の回答(5件)

id:Held No.1

Held回答回数13ベストアンサー獲得回数12007/07/10 01:03:04

ポイント10pt

Rank関数を使ってはいかがですか?

名前のところをドラッグしてRankで並び替えられると思います。

(解釈が間違っていたらごめんなさい)

id:Solais

文字上の都合上、説明不足ですみません。

実際の列数は10000行以上・名数が1000件以上あるものとしてお願いします。

2007/07/10 01:07:41
id:hokuraku No.2

hokuraku回答回数529ベストアンサー獲得回数972007/07/10 07:43:07

ポイント200pt

1列追加して、追加した列に名前ごとの○×判定を関数で入れてはいかがでしょうか。


名前をA列、科目をB列、○×をC列、追加する列をD列とします。

一番上に空行(項目名の行でもOK)を入れます。


(1)名前ごとの行数(科目の種類)が固定の場合

D2に以下の関数を入れます。

=IF(A2=A1,D1,IF(COUNTIF(C2:C4,"○")>0,1,0))

(質問文中の[ ]は無視しています。また、科目数が増えればcountifの中身を替えてください)

これを行末までオートフィルした後、並び替えで

D列:降順

A列:昇順(降順でも可)

C列:昇順

にすればOKです。

もし名前の順を今のまま保持したい場合は、

最初の列にIDとして連番を付けて、チェック列(上記のD)、ID列、○×列で並び替えをしてください。


(2)名前ごとの行数(科目数)が異なる場合

((1)にも使えるのですが)ピボットテーブル+vlookup関数でチェック列を作成します。

ピボットテーブルで名前ごとに○と×のデータの個数を数えて、○が1つ以上ある場合にチェック欄を1にするようにします。


「データ」>「ピボットテーブルとピボットグラフレポート」で「ピボットテーブル/ピボットグラフウィザード」を出します。

1/3は「次へ」

1/2ではデータの範囲を指定し、

3/3の「レイアウト」で「行」に名前、「列」に○×、「データ」にはどれか(どれでもいい)の個数を設定します。

できあがったピボットテーブルに対し、

=if(○の欄の数>0,1,0)

で名前ごとに判定をつけ、今度はこの名前と1or0の判定結果をもとにデータシートのチェック列にvlookupで1or0を反映させればOKです。

あとは(1)の並べ替えと一緒です。



※(2)のやり方は(1)にも適用できますが、データが多いとピボットテーブルは重くなるので(1)でできるなら(1)をお勧めします。

※多少細かいところは省略してしまいましたが、不明な点あればコメント欄で補足しますのでご指摘ください。

id:Solais

ありがとうございます。

名前ごとの行数(科目の種類)が固定と思われて当然のように質問してしまい、

わかりにくくなったと思いますので、再度質問しなおしさせてもらいました。

よろしければそちらの方で再度回答いただければありがたいです。

http://q.hatena.ne.jp/1184068835

2007/07/10 21:03:46
id:ugi1010 No.3

ugi1010回答回数39ベストアンサー獲得回数32007/07/10 07:46:50

ポイント50pt

A列の名前の並びを変えたくないという条件でしょうか?

それならば

①とりあえず、空いているD列のセルD1に1と入れます。

 (D列セル全体の書式は標準にしておいてください)

②D2のセルに次のような式を入力します。

 =IF(a1=a2,d1,d1+1)

③セルD2をコピーし、最終データがあるセルD10000まで

 貼り付けます。(もし10000行まであるとしたら)

④D列全体を選び、コピーした後、

 形式を選択して貼り付け→値、

 を実行するとD列が数値の並びに変わります。

⑤最後に、並び替えを実施します。

 最優先キー C列:降順、(○×)

 2番目のキー D列:昇順。(名前順を数値化したもの)

id:Solais

ありがとうございます。

名前ごとの行数(科目の種類)が固定と思われて当然のように質問してしまい、

わかりにくくなったと思いますので、再度質問しなおしさせてもらいました。

よろしければそちらの方で再度回答いただければありがたいです。

http://q.hatena.ne.jp/1184068835

2007/07/10 21:03:49
id:ugi1010 No.4

ugi1010回答回数39ベストアンサー獲得回数32007/07/10 08:19:05

ポイント50pt

ugi1010です、さっきの回答を訂正します。

間違い

⑤最後に、並び替えを実施します。

 最優先キー C列:降順、2番目のキー D列:昇順。

 

訂正

⑤最後に、並び替えを実施します。

 最優先キー D列:昇順、2番目のキー C列:降順。

 

再度書き直すと

①とりあえず、D列のセルD1に1と入れます。

②D2のセルに次のように入力します。=IF(a1=a2,d1,d1+1)

③セルD2をコピーし、最終データがある行までペーストします。

④D列全体を選び、コピーした後、

 形式を選択して貼り付け→値、を実行するとD列が数値の並びに変わります。

⑤最後に、並び替えを実施します。

 最優先キー D列:昇順、2番目のキー C列:降順。

でした。よって前回の回答は、なしにしてください。

id:Solais

ありがとうございます。

名前ごとの行数(科目の種類)が固定と思われて当然のように質問してしまい、

わかりにくくなったと思いますので、再度質問しなおしさせてもらいました。

よろしければそちらの方で再度回答いただければありがたいです。

http://q.hatena.ne.jp/1184068835

2007/07/10 21:03:53
id:ugi1010 No.5

ugi1010回答回数39ベストアンサー獲得回数32007/07/10 09:57:22

すみません、3、4番目に回答したugi1010です。さらに墓穴を掘ってしまいました。

id:Solais

ありがとうございます。

名前ごとの行数(科目の種類)が固定と思われて当然のように質問してしまい、

わかりにくくなったと思いますので、再度質問しなおしさせてもらいました。

よろしければそちらの方で再度回答いただければありがたいです。

http://q.hatena.ne.jp/1184068835

2007/07/10 21:03:56
id:rikuzai No.6

りくっち回答回数1366ベストアンサー獲得回数1412007/07/10 10:10:49ここでベストアンサー

ポイント400pt

関数と並び替えで出来る方法を一つ。


名前がA列、

教科がB列、

条件がC列、

にそれぞれ入っているとして、

D1=A1&C1

E1=COUNTIF(A:A,A1)-COUNTIF(D:D,A1&"×")

と入力し、該当行までコピーします。

(私のPCで10000行1分ちょっとでした)


D、E列を選択し、コピー、そのまま右クリック「形式を選択して貼り付け」で値貼り付けをします。


ツールバーの「データ」→「並び替え」で、

最優先されるキーを「列B」(教科)「昇順」でOK。


再度「並び替え」をクリックして、

最優先「列E」「降順」

2番目「列A」「昇順」

3番目「列C」「降順」

でOK。


これで例示の結果と同じ並びにになるかと思います。


以上ご参考まで。

id:Solais

ありがとうございます。

名前ごとの行数(科目の種類)が固定と思われて当然のように質問してしまい、

わかりにくくなったと思いますので、再度質問しなおしさせてもらいました。

よろしければそちらの方で再度回答いただければありがたいです。

http://q.hatena.ne.jp/1184068835

2007/07/10 21:03:59
  • id:takejin
    条件って?
  • id:hokuraku
    質問の例示から察するに、どれかの科目に○がついてれば条件に合致するということではないかと。
    かつ、並べ替えの時には○がついている科目を上位に持ってくるということだと思われます。
  • id:takejin
    田中と佐藤と山田の位置関係は、基の順を維持ですか。木村、鈴木も維持。佐藤の丸の数は関係ない。
    3個セットなのは、守られているの?それとも、下の方では2科目の人もいる?
    VBA組んじゃった方が早そうだな。
  • id:taknt
    名前、○×、教科の順でソートさせればいいんじゃない?

    それぞれ 降順、昇順の設定つけてさ。
  • id:ugi1010
    すみませ
    2,3番目に回答した者です。両方とも駄目です。途中で頭がショートしてしまって確かめる前に回答してしまいました(冷汗)

    さらに列を増やし、関数をかませて、それを値に変更するなどの、更なる処理が必要なのですが、これ以上説明すると墓穴を掘るので、やめます。
  • id:ugi1010

    すみません、3、4番目に回答した者です。

    の間違いでした。

    更なる墓穴を掘ってしまいました。
  • id:hokuraku
    takntさん
    >名前、○×、教科の順でソートさせればいいんじゃない?
    おっと、それはtakntさんらしからぬ早とちりでは。
    名前を第一優先でソートすると単に名前順に並んでしまって「条件」に合致する人が上位に来なくなってしまいますよ。
    「条件」をいかに表すかがカギですので。
  • id:Solais
    皆様ご回答ありがとうございました。

    名前ごとの行数(科目の種類)が固定と思われて当然のように質問してしまい、
    固定のときと固定でないときで、結果が大きく変わると思いましたので、
    再度質問しなおしさせていただきました。すみません。
    http://q.hatena.ne.jp/1184068835

    横の列数は同じですが、それぞれの名前ごとの行数は同じではありません。

    また「名前」等の位置順は維持しなくてもかまいません。
    1件でも条件に合う名前のデータのみを抽出したい、
    1件も該当しない名前のデータを除去したいのが目的です。
  • id:hokuraku
    あれ?たぶん私の(2)とrikuzaiさんのは名前ごとの行数が異なっていても使えるはず、ですが…。

    (rikuzaiさんの
    >>
    ツールバーの「データ」→「並び替え」で、
    最優先されるキーを「列B」(教科)「昇順」でOK。
    <<
    は不要なような気もしましたが…。私の勘違いでしょうか?)

    ちなみに、私の(2)かrikuzaiさんの方法かどちらかを選ばれるなら、rikuzaiさんのやりかたのほうがスマートですね。
  • id:rikuzai
    >Solaisさん
    hokurakuさんの言われるとおり、私の方法は名前の行数(出現数)に関係なく名前が一つでも○があったものを上位にするようにしてあります。

    >1件でも条件に合う名前のデータのみを抽出したい
    これが目的であるならばもっと簡単な方法があると思うので再質問の方を拝見させていただきますね。

    >hokurakuさん
    「列B」での並び替えは、教科単位での並び替えが必要な場合…
    例えば○が付与された名前の×がついた教科が二種類以上あった場合の順序が規定できないのと、
    並び替えは一回に3つまでしか通常機能では設定できないため、
    先に教科だけ並び替えるという手順を入れました。
    でも質問者さんのお話だと教科の順番は必要なさそうですね(*^。^*)
  • id:hokuraku
    >rikuzaiさん
    なるほど、名前のときと同様、教科も出席番号(?)順に並べる必要がある場合、ということなのですね。
    うーん、奥が深い!さすがです。
    (結果的には今回のご要望とは関係なさそうなので気にしないでくださいね>Solaisさん)
  • id:Solais
    ピボットテーブルは、私があまりよくわからなかったことと、
    COUNTIF関数よりもさらに重いことで使用をあきらめました。

    rikuzaiさんのやり方では、うまくできなかったような気がしたのですが、
    今やってみるとできますね。なにか数式を入れ間違ったのかもしれません。すみません…。

    いずれの回答も大変参考になり感謝しております。
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません