- ベストアンサー
やはりエクセルでは限界、ACCESSでは・・
http://okwave.jp/qa/q8825955.html ↑↑↑↑↑ こちらAccessではできないでしょうか。 今のエクセルをそのままテーブルデータとするとして。 F2=IF(COUNTIF(B:B,B2)=COUNTIFS(B:B,B2,C:C,C2,D:D,D2),"","削除") こちらもやはり 数万単位を越えてくるとPCが固まってしまう。 (処理が重くなる) ACCESSだとSQL不可避でしょうか。 なかなかいい方法がおもいつかず、止まっている状態ですmm 理想はACCESSでクエリー等を使って処理をしたいのですが。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
補助列などにCOUNTIF系の関数を数万セル以上に入力すると、数式の数が多くなるためメモリーを大量に消費することになり、エクセルがフリーズすることがよくあります。 このようなケースでは、数式を入力するセルを少なくする(配列数式で計算できるならそちらを使用する)などの工夫が必要となります。 今回のケースでしたら、数式を使ったフィルタオプションの設定を利用します。 たとえばH2セル(空白セル)に以下の式を入力しておき、ホームタブの並べ替えとフィルタの「詳細設定」からリスト範囲にデータ範囲(リスト上にカーソルを置いて実行すれば自動取得されます)、検索条件範囲に「H1:H2」(H1は空白セル)を選択してOKします。 フィルタされたデータをコピー貼り付けすれば(抽出先を指定してもよい)完成です。
その他の回答 (4)
- bunjii
- ベストアンサー率43% (3589/8249)
>数万単位を越えてくるとPCが固まってしまう。 引き合いにされている数式の提言は数千レコードまでなら辛抱できる範囲かと思います。 「PCが固まる」と言う表現は誤りで「再計算に長時間を要する」と言ってください。 対象データが多くなれば終了までの所要時間が長くなるのは当たり前のことで、前出の質問にはデータの数について提示されていませんので、このような数式で処理ができることを回答したまでのことです。 模擬データを作成して100000レコードで検証しましたが、1回の再計算で20分くらいの時間を要しました。(CPU=Core i5 1.7GHz、RAM=4GB、SSD 256GB、OS=Win8.1 Pro 64bit、Excel 2013) データ量の多い定型処理の仕事は専用の業務処理システムで効率化すべきです。 専門業者(プログラマー等)に相談してみると良いでしょう。 単発の処理であれば長時間の待ちを辛抱すれば良いので夜間に処理させることも1つの選択肢になります。
- keithin
- ベストアンサー率66% (5278/7941)
ん? それを聞かれてもCOUNTIFやCOUNTIFSを使う話しは私からは一度もしたことありませんので、有体に言えば知ったことじゃありません。としか回答のしようがありません >上記は実現できないのではなく、時間がかかりすぎるのです それはそんなやり方に飛びついたアナタと、やればできるというだけの回答をしたヒトの失敗です。 まぁもう一回騙されたと思って、今度はちゃんと回答の通りに、手を動かしてみてはいかがですか。数十万件でも瞬殺には変わりありません。(数式をコピーする時間の方がちょっとかかるぐらいです)
別にSQLで書く必要はないです。クエリーというグラフィカルなツールが用意されていますから。 使ってみるとわかりますが、クエリーはSQLに書き換えることができます。 SQLの方がより多くのことができますが、あまり出番はないでしょう。 ユニオンクエリ(これはSQLで書く)は使いたくなることあるかもしれません。 なお、アクセスはエクセルとは違う考え方で使うソフトですから、エクセルの延長でアクセスが使えるということはないです。 実現することは同じでも、そこまでたどり着く道は全然違います。 アクセスをご存じなのかどうか知りませんが、初めてならエクセルのことは頭から除いてアクセスに取り組まれた方がいいと思います。 ところでお尋ねの件ですが、こんな風にできると思います。 クエリーを2段にして使います。 クエリー1 集計クエリーという種類のクエリーを使用します。 会員番号、商品名、区分という3つのフィールド(エクセルでいうところの列)をクエリーに載せて、グループ化します。 この結果は会員番号-商品名-区分が同じ組み合わせの一覧表になります。 会員X-商品A-区分1 会員X-商品B-区分1 会員Y-商品A-区分2 会員Y-商品A-区分1 会員Z-商品B-区分1 とかいう具合です。もとのテーブルに存在するすべての組み合わせの一覧表が出来上がります。 クエリー2 クエリー1を基にした集計クエリーを作ります。今度は会員番号のみを載せますが、2つ載せてひとつはグループ化もうひとつはカウントにします。 カウントのところの抽出条件には=1とします。 私の書いた5つのレコードの例でいえば、会員Xと会員Yはこのクエリー2で2つカウントされますから結果に表れません。 会員Xは商品Aを買ったことと、商品Bを買ったことがあります。会員Yは区分2で買ったり区分1で買ったりしています。 会員Zは1レコードしかないので、クエリー2の結果は会員Zだけが出てきます。 このクエリー2の結果があなたの欲しい浮気しない会員のリストです。 もし、会員番号だけでなく、「注文日・会員番号・商品名・区分・購入回数」も含めた結果が欲しいのであれば、さらにクエリー3を作ります。 クエリー2と元のテーブルを合わせて、クエリー2にあるものだけを選択したクエリーです。 もしアクセスを触ったこともないなら、上の説明だけじゃなんだかわからないかもしれません。 でも、アクセス入門とか一冊の本になるんですから、ちょっとここには書ききれません。悪しからず。 キーワードはちりばめておいたつもりなので、入門書とか、ウェブ上の解説サイトとか見て、トライしてみてください。 アクセスがいいのは、マニュアル見ないと何を引数に取っているのかわからないような関数を使わなくても、アクセスのもっとも基本的な機能だけでこのような結果が実現できることです。後で見直してみたときにも、何を意図しているのか明らかです。 もし普段からお使いでなのならSQLには手を出さないほうがいいでしょう。もちろんこれからSQLの勉強をするんだということなら別ですが、将来あまり使う予定がないならクエリーで作っておいた方が後で見やすいです(お好みならいつでもSQLの記述に切り替えることもできる)。 また、もちろん元のテーブルになんの手を加える必要もないです。数万行もあると並べ替えするのさえ億劫ですしね。 大体エクセルってのは本来そういう使い方をするもんではないです。 ただ、クエリー2つ重ねていますから、速度はどうかな。集計クエリーも早くないしなぁ。 でも、古いパソコンじゃない限り、遅いってことはないと思うのですが。
- keithin
- ベストアンサー率66% (5278/7941)
エクセルでも丁寧に行っていけば、数万件程度瞬殺です。 #まぁ回答しても勝手に違う事をやってて出来ないご様子なので、今回も無理かもしれませんが。 手順: 全体を購入回数の昇順で並べ替える 全体を会員番号の昇順で並べ替える F1に数字のゼロを記入する G1に数字の1を記入する H1に削除対象と記入する F2: =IF(AND(VLOOKUP(B2,B:D,2)=C2,VLOOKUP(B2,B:D,3)=D2),"",B2) 以下コピー G2: =VLOOKUP(B2,F:F,1) 以下コピー H2: =IF(B2=G2,"削除","") 以下コピー。 削除対象の行をオートフィルタで絞って削除する。
お礼
レコードは数十万件あるものです。1万程度であれば、上記で十分です。
補足
F2=IF(COUNTIF(B:B,B2)=COUNTIFS(B:B,B2,C:C,C2,D:D,D2),"","削除") 上記は実現できないのではなく、時間がかかりすぎるのです。2万件程度で試されればわかります。 なのでデータベースでやるのが向いているのではないかとおもっているのです。