• ベストアンサー

EXCELで顧客ごとにファイルを整理しており、ファイルをどこの棚に入れたかを管理するためのデータを作成中です。

EXCELで顧客ごとにファイルを整理しており、ファイルをどこの棚に入れたかを管理するためのデータを作成中なのですが、いい方法があれば教えてください。 データ上は日付ごとに名前と棚の名前があるのですが、ファイルの保管は家族は同じ棚に保管するようになっているので、データを加工する必要があります。 例:Aの列には買い物した日付、Bの列にたくさんの名前が入っており、重複した名前も入っています。Cの列にBの列で重複した名前や家族などで同じグループである名前の人には半角の数字1,2,…などの番号を振ってあり、そうでない人は空欄にしてあります。Dの列にAの棚、Bの棚、Cの棚などの棚の名前が入っています。Eの列に棚ごとに数字を振っており、Aの棚なら半角の数字で1、Bの棚なら2、Cの棚なら3としています。 具体的に図で説明すると、現在のデータ上 A列 |B列 |C列 |D列 |E列 1/2|田中一郎 |1 |Bの棚 |2 1/5|佐藤一郎 |2 |Bの棚 |2 1/10|田中二郎 |1 |Aの棚 |1 1/15|小田二郎 |3 |Cの棚 |3 1/20|佐藤二郎 |2 |Aの棚 |1 1/20|小田一郎 |3 |Cの棚 |3 1/22|田中一郎 |1 |Cの棚 |3 1/25|山本一郎 | |Cの棚 |3 目的としてはCの列で同じグループにした名前のファイルの中で、Eの列で最小の番号にある棚の番号をFの列に表示して、Gの列に棚の名前を表示したいと思っています。 A列 |B列 |C列 |D列 |E列 |F列 |G列 1/2|田中一郎 |1 |Bの棚 |2 | 1 |Aの棚 1/5|佐藤一郎 |2 |Bの棚 |2 | 2 |Bの棚 1/10|田中二郎 |1 |Aの棚 |1 | 1 |Aの棚 1/15|小田二郎 |3 |Cの棚 |3 | 3 |Cの棚 1/20|佐藤二郎 |2 |Cの棚 |1 | 2 |Bの棚 1/20|小田一郎 |3 |Cの棚 |3 | 3 |Cの棚 1/22|田中一郎 |1 |Cの棚 |3 | 1 |Aの棚 1/25|山本一郎 | |Cの棚 |3 | 3 |Cの棚 Fの列の番号さえわかれば、Gの列の名前は関数を使えば表示できるのですが、Fの列の番号を表示するのは現在手作業でやっており、数も多く大変なので関数かマクロで簡単に出来ないかと思っています。 マクロはあまり得意ではないので、もしマクロの場合はできたらVBAのコメントを入れていただければありがたいです。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

判りにくい説明だ。VLOOKUPなどで引いてこれる列と、入力セルの区別の整理が出来てないので説明が冗長だ。 例データ 質問例に少々追加 A列  B列   C列 空白行 <ーーー関数MAXを使う便宜上、C1は数字では困るので必要 1月2日 田中一郎 1 1月5日 佐藤一郎 2 1月10日 田中一郎 1  <-質問例は田中一郎の間違いだろう 1月15日 小田二郎 3 1月20日 佐藤二郎 4 1月20日 小田一郎 5 1月22日 田中一郎 1 1月25日 山本一郎 6 1月26日 小田一郎 5 1月27日 佐藤一郎 2 1月28日 小田二郎 3 C列は(グループでなく、上記例のように個人名でなら)関数で算出できる。 C2の式は=IF(COUNTIF($B$2:B2,B2)=1,MAX($C$1:C1)+1,INDEX($C$2:C2,MATCH(B2,$B$2:B2,0),1)) 下方向に式を複写。 結果 上記C列 ーーー D列は人間が入力する列か? そうであれば、 E列はVLOOKUP関数で 検索表を下記のようにつくり Aの棚 1 Bの棚 2 Cの棚 3 ・・ それを引けば、対応した1,2,3・・のどれかが算出できる。 ーー F列はCと同じではない? -ーー G列はD列と同じく、VLOOKUP関数で算出できるのでは? === どこが難しい点か、判りにくい質問で、時間をとったが、質問を誤解していたら、上記を無視してください。

その他の回答 (5)

回答No.6

エクセルにデータベースの真似をさせるのは限界があるので、早め にちゃんとしたデータベースに移行することを推奨します。 「C列が一致するE列の値の最小値(E列は自然数)」ですね。一度だけ 処理してしまって「家族は同じ棚」になってしまえば以後は無用の 長物だと思いますが、たとえば F1: =INDEX(($E$1:$E$8)+99*($C$1:$C$8<>C1),0) のようにすると、質問の例では{2;101;1;102;100;102;3;102}という 配列が返ってきます。C列の値が一致しないところには99加算してあ るのがわかりますか。この配列をmin関数にぶち込めばいい訳で、 上から1,1,1,3,1,3,1,3になります。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.5

>そうでない人は空欄にしてあります。 ”山本一郎”という人が、【Bの列で重複した名前や家族などで同じグループである名前の人】 であるので空欄にしていると言う事は、仮に田中三郎という人が田中一郎・二郎と 家族ではなく且つ重複がない時にも空欄になるのでしょうか?

  • dkljdkfsj
  • ベストアンサー率23% (13/56)
回答No.3

No1,2です NO1の回答を見る前にNO2を書いてしまいました。 ソート後は手入力ではないのですが、ダメですか?

  • dkljdkfsj
  • ベストアンサー率23% (13/56)
回答No.2

ソートが可能なら、 C,Eでソート後 F1に(F1は必ずC1なので) =C1 F2に =IF(COUNTIF($C$1:C2,C2)=1,C2,F1) と入れ下方向に複写 でF列は完成します。

  • dkljdkfsj
  • ベストアンサー率23% (13/56)
回答No.1

C=>E の順で、ソートをかけてはダメですか? ソートすれば、 同一Cで一番上にいるEが該当の棚になりますよ そうすれば、F列は関数で表示できます。

monako333
質問者

補足

回答ありがとうございます。 今はソートをして一件ずつ手入力しているので、数も膨大にあるので時間がかなりかかっているのでソート以外でお願いします。