• ベストアンサー

(EXCEL)あるもの一覧

EXCELでデータベースに存在する値を一つずつ取り出して、並べることって可能ですか? 例) ------------------ 1 佐々木 2 佐々木 3 石田 4 鈴木 5 山田 6 加藤 7 加藤 8 佐藤 9 佐藤 10 佐藤 11 渡辺 12 石田 13 山田 14 佐々木 15 鈴木 16 鈴木 17 鈴木 18 山田 19 山田 20 渡辺 21 佐藤 22 加藤 23 石田 24 佐々木 ----------------------- ↓ ----------------------- 1 佐々木 2 石田 3 鈴木 4 山田 5 加藤 6 佐藤 7 渡辺 ----------------------- 一行だけのピポッドテーブルをつくり、値だけを得ることは可能でしたが、 リアルタイムに変化するものが欲しいので 関数や計算を使ってなんとかできないでしょうか?

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

  • ベストアンサー
  • Poer
  • ベストアンサー率45% (72/157)
回答No.1

 元のリストがC1から入っているとし、F列とG列に結果を出すとします。   (1)A1に =IF(COUNTIF(D$1:D1,D1)=1,1,0) と入力し、表に必要な行だけ縦にコピー。   (2)B1に =SUMIF(A$1:A1,1)  と入力し、必要な行だけ縦にコピー。   (3)F1に =IF(G1="","",C1)  と入力し、必要な行だけ縦にコピー。   (4)G1に =IF(ISERROR(VLOOKUP(ROW(B1),$B$1:E$24,COLUMN(C1),0)),"",VLOOKUP(ROW(B1),$B$1:E$24,COLUMN(C1),0))  と入力し、必要な行だけ縦にコピー。   (5)A列B列は列幅をゼロにするなどして隠す。 でいかがでしょうか。

G-ISZ
質問者

お礼

ありがとうございます。 数式が一番シンプルで理解しやすかったです。 片方だけ固定の相対指定(?) の発想がなかったんで、驚かされました。

その他の回答 (4)

  • sakeman
  • ベストアンサー率43% (67/153)
回答No.5

オートフィルターを使えば簡単でしょうが、関数を使うとなると、なかなか面倒ですね。一案です。 B列を作業列とし、セルB1に「=IF(COUNTIF($A$1:A1,A1)=1,ROW(A1),"")」と入力する。 COUNTIF関数,ROW関数でそれぞれの名前の最初の名前のある行番号を取得します。 セルC1に「=IF(COUNT($B$1:$B$50)>=ROW(B1),INDEX($A$1:$A$50,SMALL($B$1:$B$50,ROW(B1))),"")」と入力し、下にオートフィルします。 B列に取得した行番号のあるA列の名前をINDEX関数で取得し、SMALL関数で名前が出てきた順に表示しています。取得した行番号数以上ではエラーが出るので、IF関数で処理しています。

G-ISZ
質問者

お礼

連番をつけるのではなくて、初出現のときの行番号&順位ですか!! おみごとアイデアですね。 いろんな方法があるのにビックリしました。 全ての肩にポイントを差し上げられないのが残念です。

回答No.4

こんにちは。 私なりの少ない知識で回答させていただきます。 A1~A24までデータと仮定します。 B1~B24にその行より上に同じ名前がない場合、番号を つけます。  B1はその上に名前がないのですから、無条件に  1 と入力します  B2セルに  =IF(COUNTIF(A$1:A2,A2)>1,"",    MAX(B$1:B1)+1) と入れます。  B2をドラックして、B24までコピーします。  これで番号付けはOKです。 次にこの番号の名前をB30~B53で取出すとします。 A1~A53に 1~24を入力します。 B30に  =INDEX(A$1:A$24,MATCH(A30,B$1:B$24,0)) と入れ、B53までドラックしてコピーします。  1個だけの名前が取り出せるはずです。  但しこのままでは、人数以上でERRORとなりますので  =IF(A30>MAX(B$1:B$24),"",INDEX(A$1:A$24,MATCH( A30,B$1:B$24,0)))とB30に入れてコピーしてくださ い。   =MAX(B$1:B$24)を、例えば A29に入れておけば   =IF(A30>A$29,"",INDEX( )))と簡略化   されます。 説明が下手でごめんなさい。 又ご要望の趣旨と違う回答でしたら、どうぞ無視して ください。     

G-ISZ
質問者

お礼

回答ありがとうございます。 MAX+1というのも良いアイデアですね。 その部分だけ使わせてもらいました。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

こんにちは。maruru01です。 一応出来ます。 元のリストがA1~にあるとして、B1~に一覧を表示するとします。 B1に、 =IF(SUM(IF(LEN($A$1:$A$30),1/COUNTIF($A$1:$A$30,$A$1:$A$30)))>=ROW(A1),INDEX(A:A,SMALL(IF(LEN($A$1:$A$30),IF(MATCH($A$1:$A$30,$A$1:$A$30,0)=ROW($A$1:$A$30),ROW($A$1:$A$30))),ROW(A1))),"") と入力して、[Ctrl]と[Shift]を押しながら[Enter]をクリックします。 (数式の両端に「{}」が付いて配列数式になります。) これを適当な行までコピーします。 数式中の元データ範囲($A$1:$A$30)については、追加入力するのに十分な行数を指定しておいて下さい。 なお、この数式だとデータ数が多いと重くなります。 No.1の方のように作業列を使用するか、フィルタオプションで重複なしリストを抽出する操作をマクロ記録して、都度実行するようにした方がいいと思います。

G-ISZ
質問者

お礼

実際にやってみたんですけど かなり重いですね。 作業列がいらないっていうメリットもあるんですけどね。 回答ありがとうございました。

  • Poer
  • ベストアンサー率45% (72/157)
回答No.2

 #1です。少し訂正します。  (4)のROW(B1)は「ROW(A1)」でも構いません。同じくCOLUMN(C1)は「3」でも構いません。