• ベストアンサー
  • すぐに回答を!

エクセルでのデータのあいまい検索のVBAについて

VBAかマクロで作成したいと思いますが、あいまい検索ができずに困っております。 どなたかご教授お願いできますでしょうか? 一応画像を添付しておりますが大変見にくく申し訳ないです。  一つのファイルで2枚のワークシートを使用してデータのあいまい検索をしたいと思っております。 画像1の方のワークシートがSheet2になっていてこちらの”I”の列に入力しているデータが画像2になりますが登録商品リストの”G”の列に含まれているかを検索したいと思います。 その結果は”Sheet2”の緑色の部分”I”のセルにデータがあれば”*”をJのセルに表示したいと思います。 登録商品リストには長いもので桁数が30桁近いものもありますがこの桁数を8ケタくらいまでの一致でSheet2のIの列のデータと照合して結果をJに表示できればと思っております。何卒ご教授くださいますようお願いいたします。 照合するデータにつきましては、その日によって件数が違いますので、Sheet2のI列にあるデータが200件くらいの時もあれば2000件くらいの時もございます。 登録商品リストは登録するたびに量が増えていくので照合件数も増えていくことになりますので、どちらも1行指定でできればべすとだとおもっております。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数1133
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.2
  • tom04
  • ベストアンサー率49% (2537/5117)

こんばんは! 画像が小さくて詳細が判らないのですが、 おそらくこんなコトでしょうか? ↓の画像で左側がSheet1で右側がSheet2とします。 Sheet2のI列の頭から5文字がSheet1のG列データの中にあればJ列にアスタリクスを表示! としています。 一例です。 Sub Sample1() Dim i As Long, endRow As Long, str As String, c As Range, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") endRow = wS2.Cells(Rows.Count, "J").End(xlUp).Row Application.ScreenUpdating = False If endRow > 1 Then Range(wS2.Cells(2, "J"), wS2.Cells(endRow, "J")).ClearContents End If For i = 2 To wS2.Cells(Rows.Count, "I").End(xlUp).Row str = Left(wS2.Cells(i, "I"), 5) Set c = wS1.Range("G:G").Find(what:=str, LookIn:=xlValues, lookat:=xlPart) If Not c Is Nothing Then wS2.Cells(i, "J") = "*" End If Next i Application.ScreenUpdating = True End Sub こんな感じではどうでしょうか?m(_ _)m

共感・感謝の気持ちを伝えよう!

質問者からのお礼

お返事が遅くなり申し訳ございませんでした。 ありがとうございます。思う通りのデータが作成で来ました。 これで正確なデータの振い分けができるようになりました。 本当に助かりました。 先に作っていたVBAのものと組み合わせたら完璧な処理が一度でできるようになりました。 今後もご教授の方よろしくお願いいたします。 本当にありがとうございました。

関連するQ&A

  • エクセルVBAでデータ検索(Win2000,Excel2000)

    エクセルで毎日の業務で手計算している作業をVBAコードかいて試しているのですが、縦と横の検索で行き詰まってしまい質問しました。どうぞよろしくお願いします。 _A__B____C____D__E__F___G___H 1| 2|_______その他_1~3_4~6_7~10_11~20_21~30 3| 3|__項目A___ 0___50__49__46___43__40 4|__項目B___ 0___45__44__39___37__34 5|__項目C___ 0___43__42__34___30__ 28 行 *このデータは現在(B3:V42)にあり今後増える可能性あり *1行目とA列は空白です。 *2行目とB列は対応する項目です。 *3行目は関係ない値が入っています(データをつくる為の値) このようなデータが、"Sheet2"にあると仮定します "Sheet1"のシート上に配置したComboBox(コントロールツールボックスの)に検索値があります。 (ComboBox1 → 数値 , ComboBox2 → 数値 , ComboBox3 → 文字)*リストは"Sheet1"に登録してあります。 TextBox1 ÷ 2 の結果を小数点以下切上げし、これにTextBox2の値をかけたもの(仮にAAAとする)が、2列目のそれぞれのセルの数値範囲に対応し、TextBox3の文字列がB列に対応し、両検索結果の交わったセルの値を返すようにしたい。 例)もしAAAが「8」なら「F列」をみる。TextBox3 の文字列が「項目B」なら「4行目」をみる。この結果、交わったセルは「F4」なので、「F4」にある値「39」を"Sheet1"."A1"に返す。 また、これらコンボボックス(このシートとは別にテキストボックスを使うこともある)にはひとつずつchangeイベントでいきなり別シート("Sheet3")に書くコードが既に書いてあります。このセルから取り出すことも可能です。よろしくお願いします。

  • Excel VBAを使って会員検索

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

  • excel vba データリストからの抽出

    excel vbaで、以下のような事をしたいと思っています。 【sheet1】データ   A  B C D E  1 あ い う え お 2 か き く け こ 3 あ き く せ そ 4 さ  し す せ そ 5 あ し す け こ 【sheet2】検索 A1を検索条件セルにする ※検索キーはsheet1のA列に登場するテキストのみです。   A  B  C  D  E 1 あ い う え お 2   き く せ そ 3    し す け こ 4 5 ※A2、A3に"あ"と表示されてしまってもよいのですが、  出来れば表示なしが望ましいです。 sheet2のA1は、sheet3に、sheet1のA列に登場したテキストをデータとしてリストしておき、 「データの入力規則」でリストから選択できるようにしようと考えています。 説明が下手でうまく伝わらないかも知れませんが、うまいやり方があれば どうかご教示下さい。 宜しくお願い致します。

その他の回答 (1)

  • 回答No.1
  • Br6
  • ベストアンサー率64% (9/14)

[登録商品リスト] |  G   | | 11111 | | 22222 | | 31233 | | 44444 | | 57895 | [Sheet2] |  I  | J | | 123 | * | | 456 |   | | 789 | * | 結果はこんな感じになると考えてもよろしいでしょうか? 123は[登録商品リスト]シートの31233に含まれるので「*」がつく。 456は[登録商品リスト]シートにどの行にも含まれないので「*」がつかない。 789は[登録商品リスト]シートに57895に含まれるので「*」がつく。 あと、8ケタくらいまでの一致というのがよくわからないのですが、もう少し詳しく教えていただけますか?

共感・感謝の気持ちを伝えよう!

質問者からの補足

ご教授ありがとうございます。 出来れば、スタートする数字の並びは変更しないでできればと思います。 最低5文字前半から照合できればと思います。 [登録商品リスト]の方の桁数が商品によっては30ケタを超えることがありますが、照合したい商品のデータには5ケタから8ケタしか入力されていない商品もございますのでその商品をひらうためにあいまい検索ができればと考えた次第です。 私の説明の仕方がわかりづらく大変申し訳ございません。 今回作成しようとしているVBAをほかで作成しているVBAに組み込むことができればボタン一つで一連の作業ができるようになるのではないかと思いました。 VBAも少しずつ勉強しているのですが、私の手に余る状態になったもので・・・。 何卒ご教授よろしくお願いいたします。

関連するQ&A

  • エクセルVBAで困ってます。

    エクセルVBAで困っています。 データ入力済みのシートが2つあります。 シート名を「Sheet1」「Sheet2」とします。 「Sheet1」のA列のデータが「Sheet2」のA列のデータと一致した時に それぞれのシートのセル番地を取得したいのですが出来ません。 教えて下さい。 データの並び順は「Sheet1」と「Sheet2」で異なります。

  • エクセルでデータを検索する際に・・・・

    検索したい文字がSheet1にB列にあります。 検索元のデータは Sheet2に5行目より1データにつき横200列ほど項目があるデータが 5000千ほどあります。 検索したい文字は 検索元のデータの3列目(C列)に存在しています。 これを、Sheet1の検索したい文字の横C列から 該当データの1列目より返していきたいのですが VLOOKUPの数式ではテキストで返り、セルに数式が残ってしまうため、 ここを検索元のデータと全く同じ(フォントや数式を含む)データを 抽出し貼付けて返したいのです。 VBAなどでこの検索処理を出来ないでしょうか? 教えてください、よろしくお願いいたしますm(__)m

  • エクセルVBA 文字列の検索

    お知恵をお貸しいただけますと幸いです。 複数のシートがあるエクセルブックで、sheet1のA1には文字列(例:あああ)が入っています。 sheet2のA1には「=sheet1!A1」が入っており、sheet3のA1には「=sheet2!A1」としています。 また、必ずsheet1にデータが入っているわけではなく、sheet2・sheet3から入力されている場合もあります。 VBAを使って任意のシートから「あああ」を検索したいのですが、この場合sheet2と3では検索できません。 どうすれば検索することができるでしょうか? どうぞご教授くださいますようお願いします。

  • EXCEL VBAで複数のシートの中から該当値を検索する方法について

    すいません、EXCEL VBAで複数のシートの中から該当する値を検索する方法について教えていただきたいことがあります。      Sheet1              A列   B列  C列   1行  11  りんご  31  2行  12  バナナ  32  3行  13  みかん  33  4行  14  ぶどう  34   ・   ・   ・     ・        Sheet2              A列   B列  C列   1行  31  すいか  11  2行  32  レモン  12  3行  33  パイン  13  4行  34  ざくろ  14   ・   ・   ・     ・ というデータが入っているブックについて 「全部のシートを検索し、A列に11の値が入っているセルの行数及びその行のB列の値」 をSheet1のD1セルとE1セルにそれぞれ返す方法はどうしたらよろしいんでしょうか。 For Each を使うのではないかと思って色々やってみたのですが、どうも上手く作動してくれません。 よろしくお願いいたします。

  • エクセルのVBAマクロで検索と結果表示(抽出)

    エクセルのVBAマクロで検索と結果表示(抽出)を行いたいです。 業務で使用している膨大なリストデータから、特定のキーワードで情報の絞り込みを行いたいのですが、上手くマクロが組めません。 機能としては、シート1で特定のキーワード(テキストボックスに)を入力し検索ボタンを押下すると、 シート2のリストデータから検索に引っかかったセルの"行"を、シート1にリストアップ(貼り付け)していくようなマクロを作りたいのです。 シート2にはB列~AH列xn行のリストデータがあり、シート2のK列のセル内から「シート1のテキストボックスで入力したキーワードを含む」検索を行い、 HITした行をシート1のA9の行から結果として表示を行いたいんです。 簡単に言えばオートフィルタ機能の部分一致版を作りたいのですが・・・。 (オートフィルタでは完全一致でしか抽出が出来ないので) そして、検索ボタンを押下すると前回結果はクリアしたいです。 ネット上のサンプル等も参考にしながらやってみたのですが上手く行きません。。。 どなたか上記のマクロ文をご教授願えないでしょうか。 必要な情報(シート2の特定の列)のみ表示させたいとも思いましたが、むずかしくて断念・・・。 もし可能でしたらこちらもお願い致します。 よろしくお願いいたします。

  • VBAで表データの検索

    アクティブセルの2列隣のデータを”Sheet2”から検索し、情報が見つかったセルの隣の列のデータをアクティブセルに返すために、下記のようなプログラムを組んでます。 ****************************************************** Set myRange=Worksheets("Sheet2").Range("A1:B256") B=ActiveCell.Offset(0,2) Set c=myRange.Find(B) ActiveCell.Value=C.Offset(0,1) ****************************************************** ほとんどうまくいくんですが、一部、期待と異なったデータが帰ってきます。例は以下のとおりです。   (1)検索値「#1」を検索すると、「#19」に該当するデータが帰ってくる   (2)検索値「#2」を検索すると、「#29」に該当するデータが帰ってくる   (3)検索値「#3」を検索すると、「#39」に該当するデータが帰ってくる   (4)検索値「#4」を検索すると、「#49」に該当するデータが帰ってくる   (5)検索値「#5」を検索すると、「#59」に該当するデータが帰ってくる   (6)検索値「#6」を検索すると、「#69」に該当するデータが帰ってくる   (7)検索値「#7」を検索すると、「#79」に該当するデータが帰ってくる   (8)検索値「N」を検索すると、アクティブセルの内容が消去される   (9)検索値「M」を検索すると、「14mm」に該当するデータが帰ってくる   (10)検索値「K」を検索すると、アクティブセルの内容が消去される。 なお、”Sheet2”には、#80、#79、#78・・・・と降順にデータが並んでおり、その後ろにA,B,C・・・とアルファベットが正順に並んでます。 何か、よい解決法はないでしょうか?

  • Excel VBA 条件検索について

    ExcelVBAで 「データ検索後リスト表示をして、そのリストから該当するシートを選べば表示される」 というユーザーフォームを作成したいのですが、やり方がよく解りません。どなたか教えて下さい。 具体的には 「コマンドボタンが押された時に、ユーザーフォーム内のテキストボックスに入力された値(名称、日付等)と、複数のシート内のセルの値(名称、日付等)を比較して、一致(全一致、一部一致)した場合、ユーザーフォーム内のリストボックスに表示させる」 というものと 「リストボックスに表示されたものの中から見たいシートを選択すると、そのシートを表示する」 というものです。 リストの表示形式は シート名   名称  日付等 Sheet1    りんご  2013.01.01 Sheet2    りんご  2013.01.02 という具合にしたいと思っています。 ちなみに複数のシートと言いましたが、マスターシートを作りコピーして使用しますので、同一形式のものになります。 以上になります。 色々やってみましたが、うまくいきませんので、どなたか解る方は教えて下さい。 よろしくお願いします。

  • エクセルVBAで 2種のリストを比べて重複していないデータを最下行に追加するには

    Sheet1・Sheet2は商品リストです。 Sheet1にはF列に商品コード、G列に商品名があります。 Sheet2にはB列に商品コード、C列に商品名があります。 Sheet2にあって、Sheet1にはない商品コードと商品名をSheet1のデータの下に追加したいのですが、方法を教えていただけますでしょうか。

  • excelのデータ抽出?検索?についておしえてください。

    excelのデータ抽出?検索?についておしえてください。 エクセル2003で sheet1に次のようなデータがあります。   A列  B列  C列     D列  E列 ・・・ 1 組   番号  氏名     古典  現文 ・・・  2 1   1   青木 優    3 1   2   池田 洋子   4 1   3   植村 美紀   ・ ・ sheet2には1組の成績が sheet3には2組の成績が入っています。 クラスによって科目が違います。 この「氏名」と1行目の「科目名」が一致するデータを 他のシートから読み出してくる関数がありませんでしょうか 青木さんの古典を1組のシートから読み出すといった感じです。 説明がへたで 申し訳ないのですが うまく検索ができなくて困っています。 ぜひ くわしいかた教えてください。 どうぞ よろしくおねがいします。

  • Excel シート間のデータの照合

    Excelで、シート間のお客様データ(だいたい各1万件)を照合します。下記は現在の照合方法ですが、これでは時間がかかるうえ手作業が多く発生しミスにつながります。頻繁に行う作業なので、関数でも、マクロでも、とにかくもう少し簡単にできる方法がありましたら、どうぞご教授ください。よろしくお願いします!! 【目的】 シート「sheet2008」には2008年度のデータ。シート「sheet2007」には「sheet2008」と同じ形式の2007年度のデータが入っています。シート「sheet2008」に、そのお客様の2007年度の担当営業マンを表示させたいのです。 【例】 列A(電話番号): 011-231-1112 列B(名前):佐藤 一郎 列C(住所):北海道札幌市中央区北1-1-1 列D(担当営業マン):鈴木 新規の列(2007年度の担当営業マン):鈴木  ・「sheet2008」「sheet2007」はほぼ同じデータですが、一部のお客様は名前が変わっていたり、住所が変わっていたりします。  ・「sheet2007」にないお客様が「sheet2008」にあったり、その逆があったりして、各シートのデータ件数は一致しません。  ・名前が同じでも住所が違うデータ、電話番号が同じでも担当営業マンが違うデータは別者として扱います。  ・「顧客ID」のような“必ずユニークな情報”は存在しません。 【現在の照合方法】 (1)「sheet2008」の各列の前に空白列を挿入する。  (データの1行目はタイトル行…B1:電話番号/D1:名前/F:住所/H:担当営業マン)  (データの2行目以降はデータ)     列A(空白行):     列B(空白行): 011-231-1112     列C(空白行):     列D(名前):佐藤 一郎     列E(空白行):     列F(住所):北海道札幌市中央区北1-1-1     列G(空白行):     列H(担当営業マン):鈴木 (2)「sheet2007」を列Aの電話番号で昇順に並べ替える。 (3)「sheet2008」の電話番号が「sheet2007」にあるかを調べる。     A2:「=IF(B2=(VLOOKUP(Sheet2008!$B2,Sheet2007!$A:$D,1,0)),"○","▲")」 (4)(3)で調べた「sheet2008」の電話番号と同じ行にある名前/住所が「sheet2007」にあるかを調べる。     C2:「=IF(D2=(VLOOKUP(Sheet2008!$B2,Sheet2007!$A:$D,2,0)),"○","▲")」     E2:「=IF(F2=(VLOOKUP(Sheet2008!$B2,Sheet2007!$A:$D,3,0)),"○","▲")」 (5)電話番号/名前/住所がすべて一致するデータについて、「sheet2007」にある担当営業マンの値を列Gに表示させる。     G2:「=IF((AND(A2="○",C2="○",E2="○"))=TRUE,(VLOOKUP($B2,Sheet2007!$A:$D,4,0)),"▲") (6)"▲"やエラー値で表示される計算結果について、目視で確認する。 (終了)