• ベストアンサー

複数のワークシートから条件付のデータの抽出

複数のイベントの参加者データから、誰がどのイベントに最初にエントリーしたかを調べようと思っています。 同一イベントの中でもエントリー日は異なります。 ワークシート1 イベントA エントリー日 参加者A 参加者A電話番号 参加者Aメアド イベントA エントリー日 参加者B 参加者B電話番号 参加者Bメアド イベントA エントリー日 参加者C 参加者C電話番号 参加者Cメアド ・ ・ となっており、ワークシート2にイベントB、ワークシート3にイベントCとなっておりそれぞれのイベントには1回~いくつでも参加可能で、10イベントほどあります。1つのイベントの別日程への参加はNG。 まず、ある日のイベントAに参加した参加者A(ある行)が、 他のイベント(別ワークシート)にも参加したかどうかをまず 調べたいのですが、その場合、必ずしも他のイベントでも確実に名前、 電話番号、メアドと3つを取得しているとは限らないので、 3つの要素のうち、2つ以上が合致していれば同一人物とみなそうと 思っています。 そして、同一人物とみなしたあとで、それぞれのイベントへの エントリー日同士を比べて、そのイベントよりも若い日程(古い日程) で参加しているものが1つもなければ、そのレコードを○にする、 というような処理をしたいのですが。。。 さらに理想というか欲をいうと、上記の処理を元に       最初にエントリしたイベント 次にエントリーした ・・ 参加者名  イベントD          イベントZ     ・・ 参加者名  イベントE          イベントC     ・・ みたいなリストが作れると一番いいのですが。。。 とてもわがままな質問で大変恐縮ですが、よろしくお願いいたします。

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

  • ベストアンサー
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

実に複雑で様々な要望ですのでたくさんの作業列を作って対応することになるでしょう。 たくさんのシートがありますが初めにそれらのシートのデータを一つのシートにコピーして貼り付けることですね。 例えばシート1に貼り付けたとします。 シート1では1行目に項目名があり2行目からデータがあるとして、A列にはイベントの種類、B列には日付、C列には名前、D列には電話番号、C列にはメアドがあるとします。 すべてのデータをシート1にはる付けた後で日付を重点に昇順での並べ替えをします。 同一人物かどうかの判断は名前と電話番号あるいは名前とメアドが一致していれば同一人物として扱うことにします。実はこれ自体複雑な操作です。 H2セルには次の式を入力します。 =C2&D2 I2セルには次の式を入力します。 =C2&E2 J2セルには次の式を入力します。 =IF(C2="","",IF(OR((COUNTIF(H:H,H2)+COUNTIF(I:I,H2))>1,(COUNTIF(H:H,I2)+COUNTIF(I:I,I2))>1),C2&"同一",C2&"別人")) K2セルには次の式を入力します。 =J2&A2 L2セルには次の式を入力します。 =IF($C2="","",IF(AND($F2="○",COUNTIF($J$2:$J2,$J2)=1),$C2&"/"&COUNTIF($L$1:$L1,"?*")+1,"")) M2セルには次の式を入力します。 =IF($C2="","",IF(AND($F2="○",COUNTIF($J$2:$J2,$J2)>1),$J2,"")) H2セルからM2セルを選択してから下方にオートフィルドラッグします。 F列にはお求めの○やNGを表示するためにF2セルに次の式を入力して下方にオートフィルドラッグします。 =IF(C2="","",IF(COUNTIF(K$2:K2,K2)>1,"NG","○")) 次に理想の表をシート2に作成することにします。 シート2のA2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(ISERROR(INDIRECT("Sheet1!C"&MATCH("*/"&ROW(A1),Sheet1!$L:$L,0))),"",INDIRECT("Sheet1!C"&MATCH("*"&ROW(A1),Sheet1!$L:$L,0))) B列には最初にエントリーしたイベントをC列には次にエントリーしたイベントを表示させるために、B2セルには次の式を入力します。 =IF(ISERROR(INDIRECT("Sheet1!A"&MATCH("*"&ROW(B1),Sheet1!$L:$L,0))),"",INDIRECT("Sheet1!A"&MATCH("*"&ROW(B1),Sheet1!$L:$L,0))) C2セルには次の式を入力します。 =IF(ISERROR(INDIRECT("Sheet1!A"&MATCH(INDIRECT("Sheet1!J"&MATCH("*"&ROW(C1),Sheet1!$L:$L,0)),Sheet1!M:M,0))),"",INDIRECT("Sheet1!A"&MATCH(INDIRECT("Sheet1!J"&MATCH("*"&ROW(C1),Sheet1!$L:$L,0)),Sheet1!M:M,0))) B2およびC2セルを選択してから下方にオートフィルドラッグします。 最後に作業列が目障りでしたら列を非表示にすればよいでしょう。

xbee
質問者

補足

詳細にありがとうございます(TT ひとまず、理想の表の前のところまでがんばっているのですが リストの中に、同一人物がいるのか判定している =IF(C2="","",IF(OR((COUNTIF(H:H,H2)+COUNTIF(I:I,H2))>1,(COUNTIF(H:H,I2)+COUNTIF(I:I,I2))>1),C2&"同一",C2&"別人")) ですが =IF(C2="","",IF(OR((COUNTIF(H:H,H2))>1,(COUNTIF(I:I,I2))>1),C2&"同一",C2&"別人")) 単純にこれではダメなのでしょうか? また、その次のL2には、名前/(数字)がでて、途中までしか出ず、 M2は何も表示されません。処理しているロジックが分からない (どうしてこういう式になるのか読み解けていな)ので 追えてない状況です(すいません) 引き続きがんばります(もしご教示いただけると幸いです)

その他の回答 (2)

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

解答No2です。 J2への入力の式はよく考えれば電話番号とメアドは明らかに違っていますし電話番号欄にメアドが、あるいはメアドの欄に電話番号が記載されるなどのことが無い限り、あなたの式で十分でしょう。 L列やM列で空白の行ができるようにわざとしています。これらの列はシート2を作る際に必要と判断して作成しています。

xbee
質問者

お礼

ありがとうございます! なんとか、明日の提出に間に合いそうです。大変ありがとうございました。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

VBAでプログラミングすれば可能ですが、仕様があいまいですね。 3つの要素のうち、2つ以上が合致していれば同一人物とみなすとありますが、 ・3つとも入力されている場合でも2つ合致すれば同一とみなすのか。 ・1つしか入力されていない場合はどういう場合に同一とみなすのか。 ・1つのイベントの別日程への参加はNGとあるが、同じイベントの中で2つ合致したと場合でも別人とするのか。 ・2つ合致した人が他のイベントに2人いたらどうするのか。 などなど、明確にしなければならない点がいくつもあります。(上記の4点だけではありません) そこらへんをきちんと決めてから質問してはどうですか。

xbee
質問者

補足

回答、ありがとうございます おっしゃるとおり、仕様があいまいな部分があり申し訳ありません。 データをすべて目視したわけではないので、あくまで、データ収集時 に、1イベントの中に、2つ以上合致するレコードが2人以上は「ない」 という仕様で、合致した人が1人でもいれば、エントリー日と比較して 次のイベントへいってしまう、という「わりきり仕様」で考えて おりました。 また、VBAは触った事が無いのですが、どの程度のステップ数、 習熟度で、実現ができるかわからないのですが、Excelの関数だけでは 限界な気はするので、VBAのことも調べてみようと思います。

関連するQ&A