• ベストアンサー

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

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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

  • この業務をExcel VBAでどう組めばよいですか

    ご覧頂きありがとうございます。 現在アビバでExcel VBAを学んでいますが、多少はコードが読めたり弄ったりできるようになりましたが、1からロジックを組んで書き上げる事はまだ到底できそうにありません。。。 添付の画像を基に 下記の作業をどなたか回答例を書いて頂けませんか>< お願いします! ---------------------------- 1. (1).xlsmのA3セルの値が(2).xlsmのA列に無いか 上から順番に調べ、”最初に合致した箇所”を調べる →合致する値がある時 ・それぞれのB列(チェック)に 〇 を記入 ・(1).xlsmと(2).xlsmのSheet2に、それぞれ 〇 を記入した”行すべて”の値を張り付ける →合致する値がない時 ・次の行へ移動する((1).xlsmのA3→A4) 2. 順番1. をA列の一番下の行までデータがなくなるまで繰り返す 3. (1).xlsmと(2).xlsmのSheet3に、それぞれ 〇 が記入されていない”行すべて”の値を張り付ける (サンプル) (1).xlsm A品番 395011500033920 220680700001422 241670200000110 348646464554646 395011500033920 167311400021200 (2).xlsm B品番 167311400021200 395011500033920 220680700001422 241670200000110 167311400021200 241670200000110 ---------------------------- 分かりづらいところがあれば補足いたします、 お力添えください><

  • excel vba 検索の方法について

    excel vba 検索の方法について sheet1とsheet2があり sheet1のA列に10列(全て8桁の数字)文字が並んでいます。 sheet2のA列には1000列(全て8桁の数字)文字が並んでいます。 sheet1のA列とsheet2のA列で同じ文字がある場合 sheet2のA列の同じ文字の隣のsheet2のB列に◎がつくような vbaが書きたいです。 A列の文字は消したり、文字を変えたりします。 コマンドボタンに書いて、ボタンを押せば B列に◎がつくようにしたいです。 ご教授お願いします。

  • エクセルVBAで複数の条件を満たす検索方法

    エクセルのVBAを使ってデータ検索を行うプログラムを作っています "Sheet2"は下記のように、A列に生年月日、B列に住所、C列に電話番号、D列にメールアドレスが入力されています        【Sheet2】   生年月日  住所    電話番号  メールアドレス     A      B       C        D 1 1999/9/10 東京都○○ 11-111-1111 aa@goo.co.jp 2 2003/2/26 大阪府○○ 22-222-2222 bb@goo.co.jp 3 1985/6/22 福岡県○○ 33-333-3333 cc@goo.co.jp 4 1995/4/11 愛知県○○ 44-444-4444 dd@goo.co.jp "Sheet1"のA1に生年月日、A2に住所、A3に電話番号を入力し、"Sheet2"のデータと照合して、3つの値が合致した行のD列のメールアドレスを"Sheet1"のB1に返したいと思います 上記の表だと、"Sheet1"のA1に1985/6/22、A2に福岡県○○、A3に33-333-3333と入力されている場合、B1にcc@goo.co.jpの値を返すようにしたいのです。 findを使って生年月日、住所、電話番号を検索し、行番号を取得して、3つの行番号が同じならその行番号のD列の値を返すというような方法で考えていたのですが、エラーが回避できずに困っています。 生年月日が同じ人がいたり、夫婦や親子などは住所と電話番号が同じといった場合があり、上手く検索できません。  エラー回避の方法、もしくは他のやり方でも構いませんので どなたかご教授願えないでしょうか? よろしくお願いします。

  • Excel VBA で二つのシートを比較抽出

    Excel VBA で二つのシートを比較して合致するレコードを別のシートに抽出する方法について 下記ホームページのコードを利用させていただきました。 https://okwave.jp/qa/q5917011.html ●fax2シート B列(検索順)  セル1 A    2 B    3 D    4 C ●fax3シート( 比較抽出結果)  セル1 A    2 B    3 C    4 D 比較抽出結果が検索順にするにはどのようにコードを記述すればよいか教えていただけますか。

  • Excel VBAの質問です。

    エクセル2010を使用しています。 Excel VBA で二つのシートを比較して合致するレコードの行を削除する方法 値下げ,まとめのシートがありまして、 値下げ:b列に商品コードのデータ まとめ:a列に商品コードのデータ のようなExcelのデータがあります。 ここから、値下げのシートの商品コードを一つ一つ読み込みながら、まとめの商品コードと比較して、合致した値下げの商品コードの行を削除するプログラムを作りたいです。 商品コードのデータ数は毎回違い、値下げとまとめでも商品コードのデータ数は違います。 どなたかご教示いただけないでしょうか? よろしくお願いいたします。

  • エクセルデータ検索方法を教えてください!

    エクセルで下記のような検索をしたいと思っています。 VBAの知識がないので、関数で行いたいです。 Sheet1   G     H    I     J 1 商品番号 カラー  サイズ  コード 123    白    M     Sheet2   A     B    C     D 1 商品番号 カラー  サイズ  コード   123    白    M     aaa 上記のようにシートが分かれています。 Sheet1の「商品番号」「カラー」「サイズ」と、Sheet2の「商品番号」「カラー」「サイズ」 が対応しており、3つの条件すべてに合致するSheet2の「コード」を、Sheet1の「コード」に 表示させたいです。 データが膨大にあるのですが、大変急ぎの作業のため、どうぞよろしくお願いします。

  • Excel VBAを使って会員検索

    Sheet1のA列に会員番号、B列に氏名、C列にフリガナ、D列に住所といったデータがあります。 Sheet2のA列に会員番号のみがあります。 この2つのデータを照合して、一致した場合のみ、Sheet1の該当会員データの横のセルに“一致”もしくは“1”などの値(上の例だとSheet1のE列に)を入力できるようなVBAを組みたいのですが、教えていただけますでしょうか?

  • 文字列を検索しその列をコピーする(VBA)

    よろしくお願いします。 OS:WINDOWS 2000 PRO 環境:OFFICE 2003 エクセルのVBAについての質問です。 A列には数値コードが入っています。 そのコードは"1"と"2"に分類されてます。 マスターはSHEET1で、このマスターから コード1はSHEET2に、 コード2はSHEET3に 振り分けたいのですが、どうもうまくいきません・・・ A列にはコード"1" "2"以外に空白セルが存在します。 空白セルは無視したい。。。 それとこのデータはDBから抽出するのですが、 抽出したデータは規則性はありません。 抽出するごとに"1"と"2"と"空白"はランダムなので、 LOOP等のマクロを調べてやってみたのですが、出来なくて週末になってしまいました。 A列からコード1とコード2を検索して、 ヒットしたコードの行ごと各SHEETにコピーして、 なおかつ各シートA列の入力されていない一番下の セルにコピーしたいのですが、検索でヒットした 上から順番に。。。 これをLOOPと組合わせれば、各シートにコピーするのは 問題ないような気がします。。。 Sub AAA_BBB() .Copy Worksheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0) End With End Sub LOOP等で上記の条件を満たせる方法はないでしょうか。 ご教示を、よろしくお願いします。

  • エクセルVBAでのデータ検索・貼り付けについて

    エクセル2007でVBAを使用しての一覧表を作りたく質問させていただきます。 名簿 001 あいう 002 かきく 003 さしす  上記の様な一覧表のシートから 別のシートで A     B     C     D 002   かきく 001 A列に指定のコード002等を入れると名簿のシートから「かきく」とB列の「かきく」を表示する様に させたいと考えています。 VLOOKUPで行おうと試行錯誤しましたが、 A列の上段に002と入れた時に001が読み出せなかったり 再度002と入れても表示されないためにやりたいことが上手く出来ずに困っています。 A     B     C     D 002   かきく 002   かきく 002   かきく 001   あいう 001   あいう 001   あいう 002   かきく 003   さしす 理想は上記のような形で表示できるようにしたい為、 マクロボタンを押すと一括でA列に対応したB列の文字を名簿シートから 表示(貼付?)させれば可能なのかとも考えていますが、 正直勉強不足でそこまでの式が書けずに、 ネットで検索してそれらしいコードも探していますが、 修正して使えるようなコードが見つけられません。 この関数を使えばとか、このコードが使えますといった物を教えて頂けないでしょうか? 宜しく願いいたします。

  • EXCEL VBAで

    EXCEL VBAで シート1のA2~G2までの列にA,B,C,D~と題名があり、それぞれの下の行には数字が並んでます。シート2のA2~G2までの列にもA,B,C,D~と題名がありますが、ランダムに並んでます。シート1のAの行を、シート2のAの行に、BにはBへという風にコピーをさせるにはどのようにすればよいでしょうか。またシート1A~Gのどれかが欠けている場合もあります。その場合はシート1にあるもののみコピーすることとします。 わかりにくいかも知れませんか、どうかよろしくお願いします。

専門家に質問してみよう