• ベストアンサー

Excelデータ上の抽出ワザは?

     日付A 番号 日付B 1行目  2日  01  2日 2行目  2日  02  1日 3行目  3日  03  2日 4行目  4日  03  2日 5行目  5日  03  3日 6行目  5日  04  3日 7行目  6日  04  3日 いま、上記のようなエクセルデータがあったときに、 「番号列」が等しく、かつ「日付B列」も等しい場合に 「日付A列」で一番大きい日付以外の行を削除したい (上記例の場合、3行目と6行目を削除したい) のですが、実行するにはどうすればいいのでしょうか? 初心者で申し訳ないのですが、 マクロとかいう代物を使用すれば解決するのでしょうか? それともAccessが絡むのでしょうか? アドバイスいただければ幸いです。 よろしくお願いいたします。

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

  • ベストアンサー
noname#70958
noname#70958
回答No.6

#3です。「補足」の条件について。 こちらの方が条件としては単純で、  D1セル: =1/(SUMPRODUCT((A$1:A1=A1)*(B$1:B1=B1)*(C$1:C1=C1))=1) として下方にフィルすれば、 #3と同様に削除するセルに#DIV/0!が入るので、あとは同様に処理すればOK。 ※D列に#3の式、E列にこちらの式を入れて、  D:E列について#3-2の処理を行えば同時に処理することもできます。 ---------------------------------------------------------------------- ところで、 もし【日付A欄のデータが日付の若い順に並んでいる】のであれば、 「B,C列の値が等しい行のうち、最も下方にある行を残して削除」 つまり、 「自行より下方の行について、B,C列の値が自行と等しい行がなければ残す、あれば削除」 ということですから、  D1セル: =1/(SUMPRODUCT((B1:B$99=B1)*(C1:C$99=C1))=1) とすれば、最初の条件と「補足」の条件を一括して処理できます。 以上ご参考まで。

その他の回答 (5)

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

>マクロとかいう代物を使用すれば解決するのでしょうか VBAでも出来ます。「代物」とはいえません。最近はエクセルに関して、VBAの質問も多くなった。 >それともAccessが絡むのでしょうか? アクセスでも、アクセスのデータを作れば出来ます。 ーー 余分なことを考えず、エクセル(操作+関数のイメージで)で出来ますかと聞けばよいのだ。場合によってはVBAでの回答が出るかも。 例データ A列  B列    C列  D列(追加) 日付A 番号 日付B 抽出 2日 1 2日 2日 2 1日 3日 3 2日 4日 3 2日 1 5日 3 3日 5日 4 3日 6日 4 3日 1 ーーー D2の式は =IF(AND(COUNTIF($B$2:B2,B2)>1,COUNTIF($C$2:C2,C2)>1),1,"") 結果 上記のD列 ーー フィルタオプションを使うため G1:G2に(どこでもよいが) 抽出 <>1 を入れておく ーー データーフィルターフィルタオプションの設定ー 指定した範囲 リスト範囲 A1:D8 (本当は絶対番地です) 検索条件版 G1:G2 抽出範囲 J1:M10 OK 結果 J  K列  L列     M列 日付A 番号 日付B 抽出 2日 1 2日 2日 2 1日 3日 3 2日 5日 3 3日 5日 4 3日

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

ANo.2です。 布団に入ってから気がつきましたが、日付Aが10日以降のものがはいるとそのままでは意図した結果になりませんね。 日付Aの代わりに、式1: IIf(Len([日付A])=2,"0" & [日付A],[日付A]) といった式のフィールドを設けて、最大値に設定すれば良いですが、1~9日の頭に0のついたデータになってしまいます。 以上、補足まで。

noname#70958
noname#70958
回答No.3

マクロでももちろんできますが、 数式でマークして削除するのが手っ取り早いかと思います。 例えば、日付AがA列、番号がB列、日付BがC列に、 それぞれ1行目から入っているとします。 1.数式で削除する行をマークする  D1セル: =1/(MAX(INDEX((B$1:B$99=B1)*(C$1:C$99=C1)*(0&SUBSTITUTE(A$1:A$99,"日","")),))=--SUBSTITUTE(A1,"日",""))  として下方にフィルすれば残す行には1, 削除する行には#DIV/0! が入ります。 2.不要な行を削除する  D列全体を選択し、  Ctrl+G ⇒ セル選択 ⇒ 数式 ⇒ エラー値以外のチェックを外す ⇒ OK  Ctrl+-(マイナス) ⇒ 行全体 ⇒ OK Excel2003で動作確認済。 --------------------------------------------------------------------------- 日付Aのデータが"3日"のような文字列で入っているのか、 それともシリアル値(数値)で入っているのか不明でしたので どちらでも良いように書いています。 以上ご参考まで。

naonaoma
質問者

補足

誠にありがとうございます!!! 確かに実行されました!すごい! それで・・ 実は私が説明不足でして「もう一つの条件の行」も削除したいのです。 それは      日付A 番号 日付B 1行目  2日  01  2日 2行目  2日  02  1日 3行目  3日  03  2日 4行目  4日  03  2日 5行目  5日  03  3日 6行目  5日  04  3日 7行目  5日  04  3日 8行目  5日  04  3日 上記のデータの6行目・7行目・8行目のように 「日付A列」が等しくかつ「番号列」も等しく、 かつ「日付B列」も等しい場合にどの行でもいいのですが、 1行だけ残して、あとは削除したいのです。 (上記例では例えば6・7行目を削除対象にして、8行目を残したい) この条件も追加する場合、どのような式になるのでしょうか。 Kater_Kurzさんの式を少し変えて何度かやってみましたが 思うような回答がでてきません。 よろしければアドバイスいただければと思います。 よろしくお願いいたします。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

Accessでやるなら、ファイル/外部データの取り込み/テーブルリンクで上記エクセルファイルを指定し、集計クエリで、番号及び日付Bでグループ化、日付Aを最大値に指定してやれば良いでしょう。ツール/Office Linkで、エクセルワークシートに書き出してやれば、目的のデータが得られると思います。(Access2000の事例です)

参考URL:
http://www.mahoutsukaino.com/ac/ac2002/ac2002/sonota/query/036.htm
  • O_Ozzz
  • ベストアンサー率25% (2/8)
回答No.1

削除するという操作を行うにはマクロを組む必要があります。 アクセスは絡みません。 初心者であるのなら関数から覚えた方がいいかもしれません。 抽出するという条件(別のセルに表示する)であれば関数だけで やりたい事は出来ると思います。

関連するQ&A