• ベストアンサー

エクセルVBAで検索の早い方法

こんにちは。 エクセルのVBAでお教え下さい。 シート1のA列に下記の様なデータがあって ABCDは業者コードだとおもって下さい。 A A B C D D 違うシート2に下記のように業者コードの マスターがあるとします。 A D シート1の全てのA列がシート2のマスターと 合致するかどうかで、合致しなかった場合にエラーを 表示するようなことをしたい(この場合、BCがエラー)のですが、どういうプログラムにするのが処理的に早いでしょうか? ぐるぐる順番に回す方法以外になにか良い手は ありますでしょうか? お教え下さい。よろしくお願いします。

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

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

(1)総なめ法 (2)Findメソッド法 Sheet1の業者コードがA列のA1:A10000に10000件あるとして捉え、Sheet2(マスター)のA列(業者コードの列)で「FIND」メソッド(FindとFindNextメソッド)を使い、存在するかどうかチェックします。あればOK、なければ(Nothing)であればエラーをB列とかにかきこみ、A2に移って同じことを、A10000まで繰り返す。 (3)Matching法 マスターは業者コードでソートしてあるとします。 Sheet1のトランザクションの方を業者コードでソートします。 そしてSheet1とSheet2のデータを業者コード をマッチングキーにして、マッチング照合のアルゴリズム で処理します。マスター(Sheet1)のキーがトランザクション(Sheet2)のキーより先行したものがあると、そのトランザクションはマスターに見当たらないものです。(昔の情報処理試験の教科書やCOBOLの解説書に良く載っています。)エクセルを離れて、メモリに収まりきれない大量データだとこの処理が、結果的に早いようです。(何十万件以上の事務処理などの場合。)

ken1low
質問者

お礼

ありがとうございます。 とりあえず、今、総なめでやっていますが、 matching法でやってみます。 ありがとうございました。

その他の回答 (4)

  • 78tch
  • ベストアンサー率31% (50/157)
回答No.5

おお。#4さん、勉強になりました。 ところで、マクロでワークシート関数 countif(A1:A100,"A") を書き込んで、0かどうか判定してからまたマクロで消すっていうのではだめですかね。これを種にFalse表示させるでもいいですし。 それと、Sheet1のA列をAdvancedFilterでUniqueをTrueとしてSheet2か3にでも持っていって、じっくりSheet2と見比べる手もあるかいな、と。

ken1low
質問者

お礼

いろいろとありがとうございました。 参考になりました。

  • 78tch
  • ベストアンサー率31% (50/157)
回答No.3

ども。追加アドバイスですが、方針として、まずはエラーじゃない場合について考えることにして、以下の操作をマクロに記録してみてください。 1.マクロ記録開始 2.シート1でオートフィルタで適当な業者コードでフィルタを掛ける 3.表の十分下側(データ範囲外)のセル(A列がいいかな)を選んでから、「Ctrl」押しながら「↑」キー 4.マクロ記録停止 以上で出来上がるコードを見て、参考になさると良いと思います。

  • 78tch
  • ベストアンサー率31% (50/157)
回答No.2

#1です。 あなたの表がどんなか分かりませんで仮定ですが シート2で業者コードの入っているエリアから業者コードをひとつずつ順番に全部取得して、変数に入れます。それをシート1でAutoFilterするときの抽出条件となる文字列に指定してやり、35536行目からSelection.End(xlUp).Selectしてやって、行座標を見れば、何件該当があったか分かります。 VBAにあまりお詳しくないなら、マクロの自動記録を活用してみてください。便利ですよ。

ken1low
質問者

お礼

ありがとうございます。 マクロの記録で一度やってみます。

  • 78tch
  • ベストアンサー率31% (50/157)
回答No.1

シート2の値で順番にシート1にフィルタ掛けて、行数が0だったらエラー では?

ken1low
質問者

補足

すいません、どういうようにするのかがわかりません。 もう少し詳しくお教えいただけますでしょうか?

関連するQ&A