• 締切済み

Excel マクロでの検索

大量のデータ(約40000件)をDB(約3000件)から検索し該当する値を返す作業をしています。 マクロを今日初めて組んだのですが、うまく行きません。 だれか教えてください。 例:※同Sheet内での作業です。 DB(列1・2)     データ(列3・4)※ランダムに並んでます。   1  2      3     4 1 a  A      c   Cを返したい(cを1列より検索し2列の値を返す) 2 b  B      e   Eを返したい(eを1列より検索し2列の値を返す) 3 c  C      d   Dを返したい(dを1列より検索し2列の値を返す) 4 d  D      d   Dを返したい(dを1列より検索し2列の値を返す) 5 e  E      h   Hを返したい(hを1列より検索し2列の値を返す) 6 f  F      @   @が1列に無い場合は空欄でよい ・  ・ ・      ・     ・ ・  ・ ・      ・     ・ 今日、私は4列のワードを変数とし、1列より検索する方法をとりました。(Loopで組みました) Find.で組むと、不要なワードまで検索してしまう状況です。 例:aaaaで検索→aaaaaaがhitしてしまう。 同一ワードで検索する方法も試したのですが、エラーが出てしまいます。 自分なりにFindNextなども試してみましたが、無限Loopになってしまいます。 Loopを使わなくてもいいので、方法を教えてください。 本来自力で調べるべきですが、急ぎの仕事な為、ご協力ねがいます。

みんなの回答

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

VLOOKUP関数はVBAの中でも使えます。 しかし初めて見つかった行しか判りません。 見つかるのは複数行の可能性はありますか。 複数見つかったとき、どうシート上に(同行と思うが)表現しますか。 一致は部分一致も含めるのか。 #1でおっしゃるように関数だと式がセルに埋め込まれ、重くなるが、 VBAからの関数利用ならそれはないと思う。 ーーー 例示 1つだけ、部分一致考えずで A列  B列    C列   D列 (A,B列テーブル部、C列検索語、D列結果) 11a xx 12b yy 13a ii 12a zz 15b ff 13b uu 114a なし 13a ii 16b hh 14b kk 14b kk 14a ll 15b ff 以下略 標準モジュールに Sub test03() On Error GoTo err For i = 2 To 6 r = Application.WorksheetFunction.VLookup(Cells(i, "C"), Range("$a$1:$B$1000"), 2, False) Cells(i, "D") = r GoTo nxt err: Cells(i, "D") = "なし" nxt: Next i End Sub ーー 上記はMATCH関数でもできそう。 Findメソッドはなかなか初めの方には難しいですよ。 あえてやるなら、VBAの課題例示本(300選のような)を見て真似してください。 >Loopを使わなくてもいいので C列が複数行あれ繰り返しは必要ではないですか。

monmon0000
質問者

お礼

VBA内でも関数がくめるんですね。参考になります。 早速試してみます。 ありがとうございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >マクロを今日初めて組んだのですが、うまく行きません プログラミングの経験がある方なのですか? いきなり、Findメソッドは出来ると思いません。 >例:aaaaで検索→aaaaaaがhitしてしまう。 これは、Find メソッドなら、LookAt:=xlWhole にすればよいです。 >大量のデータ(約40000件)をDB(約3000件)から検索し該当する値 確かに、ワークシート関数は理論上か可能ですが、ちょっと厳しいような気がします。 もう少し、具体的なデータの種類が分かればよいのですが、実際の検索とかけ離れていないでしょうか?たとえば、重複があるか、とか、大文字小文字・全角半角の違いなど。 簡単な方法なら、以下のように出来ますが…… '<標準モジュール> Sub TestFindMethod() Dim v As Variant Dim c As Range  With Range("A1", Range("A65536"))  For Each v In .Offset(, 2) 'C列の値を取る  If IsEmpty(v.Value) Then Exit Sub  Set c = .Find( _  What:=v.Value, _  LookIn:=xlValues, _  LookAt:=xlWhole, _  SearchOrder:=xlByColumns, _  SearchDirection:=xlNext, _  MatchCase:=True, _  MatchByte:=True)     If Not c Is Nothing Then      v.Offset(, 1).Value = c.Offset(, 1).Value     End If  Next v  End With End Sub

monmon0000
質問者

お礼

データの内容は数字とアルファベットの羅列になります。 例:462F1,462,62F1など・・・ 桁数はバラバラですが、検索時に重複する事はありません。 (1列の中にデータの重複はない) プログラミングの経験はありませんので、 いきなりFindは厳しいかったのかもしれません・・・ 教えて頂いた方法で試行錯誤してみます。 ありがとうございます。

回答No.1

4列目って =IF(ISNA(VLOOKUP(C1,$A:$B,2,FALSE))=TRUE, "", VLOOKUP(C1,$A:$B,2,FALSE)) じゃダメなんですか?

関連するQ&A

  • EXCEL エクセルのフィルター実行後のデータカウント方法

    EXCEL2007で作成した表で下記のようにD列(H-O)を +20でオートフィルターで抽出した後、F列 の+と-と0の値を持つデータをそれぞれ +値=2件 -値=2件 0値=1件 というようにカウントしたいのですがSUBTOTAL関数では そのような集計方法がなく困っています。 何かいい方法はありませんでしょうか?  A列  B列  C列  D列  E列  F列 ------------------------------------- 1 日付  O  H  H-O  C  C-O -------------------------------------   2 06/01 100 120  +20 130 +30 3 08/08 115 135  +20 115  0 4 08/13 140 160  +20 130 -10 5 09/22 132 152  +20 120 -12   6 10/06 105 125  +20 130 +25

  • 検索結果の値を返すマクロ

    以下のような表で列「A」にある値を「C1~I1」より検索し 一致するものがあれば、列名を「B列」に返すマクロを作りたいのですが、どのようにマクロを記述したら良いでしょうか? A  B  C  D   E   F   G   H   I       10 20 30 40 50 60 80 10 20 10 50 60 勉強してみたのですが、変数をどのように使っていいか判りません。 ご助言いただければと思います。

  • Excelでマクロを使用した削除に関して

    マクロ初心者です。 Excelにて、以下のような表データがあるとします。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50  a   b   c   d 3行  51  e   f    g   h    4行  52  i    j    k   l この表の中で、A列と1行目の値が同じになる交点となるセルの値"以外"を 削除して以下のように表示させたいのですが、 その方法がわかりません。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50      b       3行  51  e          h    4行  52          k    単純な行削除・列削除ではないため、 頓挫しています。お知恵を拝借したく、よろしくおねがいします。

  • エクセル2010 検索と抽出

    エクセル2010を 使っています。 以前教えていただいた、数式を改変して応用したいのですが、うまくいきません。 やりたいのは画像の処理で、 B83の値を E列から探しその関連セルであるF列、G列の値を、C列D列に抜き出すという作業です。 改変した数式は以下の様なもので、C83に入力後、オートフィルで使おうと思っていました。 詳しい方、教えていただけませんか? =IFERROR(INDEX(F83:F162,SMALL(IF(E83:E162=B83,ROW(E83:E162)),ROW(A1))),"") (配列数式) 3キー打鍵 よろしくお願い致します。

  • Excelでの検索についての質問です

    Excelの検索方法についての質問です 例として 1列目に手順の数 1 2 3 1 2 3 4 1 2 3 4・・・ 2列目に作業方法 a b c a b c d a b e d・・・ と数字と作業方法が並んでいます 例えば、 1 2 3 4 a b e d という8個のセルと一致する箇所を検索したいのですが なにかいい検索方法はありますでしょうか お手数ですが、教えていただけたらうれしいです

  • エクセルのマクロ検索について

    みなさんはじめまして。 先日より必要に駆られてエクセルのマクロを使い始めた初心者です。 なかなか独学ではうまくいかず、 皆さんのお知恵を拝借したくお願いします。 したいことは以下の通りです。 検索シートに検索会社を入力すると、一部でも一致するデータを 顧客データが入った別シートから検索し、 検索シートにリストアップすると言うことがしたいです。 データシートには  A列  B列   C列   D列    E列     F列  分類  会社名  担当者  電話番号 詳細へハイパーリンク 業務内容  ----  ●社   Aさん  123-4567  ******    XXXX  ----  ×社   Bさん  234-5678  ******    ????  ----  △社   Cさん  345-6789  ******    !!!!! などのようにデータが300社くらい入っています。 一応自分で下記のようなマクロを組んでみたのですが、 リストアップされたデータのハイパーリンクの部分が文字列になってリンクとして使えません。 解消方法、またはもっと良いマクロがあれば教示お願いします Sub 検索() Dim tmp As Range Dim y As Integer, a, firstAddress '***** 結果を表示する部分をクリアします Sheets("検索").Range("A7:ag65536").ClearContents '***** キーワードを取得 a = InputBox("検索会社名を入力してください") '***** キーワードを含むデータを検索 Set tmp = Sheets("検索元データ").Columns(3).Find(a, , , xlPart) If tmp Is Nothing Then '***** 見つからない場合 MsgBox "一致するデータはありません" Else '***** 見つかった場合 firstAddress = tmp.Address y = 7 '***** 他にもあるか探してあれば記載 Do Sheets("検索").Range("c" & y) = tmp Sheets("検索").Range("b" & y) = tmp.Offset(0, -1) Sheets("検索").Range("d" & y) = tmp.Offset(0, 1) Sheets("検索").Range("e" & y) = tmp.Offset(0, 2) Sheets("検索").Range("f" & y) = tmp.Offset(0, 3) Sheets("検索").Range("g" & y) = tmp.Offset(0, 4) Sheets("検索").Range("h" & y) = tmp.Offset(0, 5) Sheets("検索").Range("i" & y) = tmp.Offset(0, 6) Sheets("検索").Range("j" & y) = tmp.Offset(0, 7) Set tmp = Sheets("検索元データ").Columns(3).FindNext(tmp) y = y + 1 Loop Until tmp.Address = firstAddress End If End Sub

  • エクセル 特定セルの足し算をするマクロ

    C列、D列、E列を足し合計をF列に記入するマクロを教えて下さい。 (3行目から値のある行まで。)  A B  C  D  E   F 1 2 3     24  16  19  59となる様に 4     35  49  41 5     22  19  72 6     ・   ・   ・ 7     ・   ・   ・ 宜しくお願いします。

  • Excelのマクロの組み方を教えてください

    3行と2列のデーターの塊があり、これを 1行のデータに並べ替えるにはどうしたらいいでしょうか? ただし 行方向(縦に) 30件、列方向(横に) 20件ほど入っていて、複雑です。 空白の行や列はないものと考えていただいて結構です。 詳細説明 A1からCB1はタイトルなどが入っていて、無視して、 データーの配列が以下の場合 A2 B2 C2 D2 E2 F2 →CB2まで A3 B3 C3 D3 E3 F3 →CB3まで A4 B4 C4 D4 E4 F4 →CB4まで A5 B5 C5 D5 E5 F5→CB5まで A6 B6 C6 D6 E6 F6→CB6まで A7 B7 C7 D7 E7 F7→CB7まで ↓ ↓ ↓ ↓↓ ↓ A120まで CB120まで を A2 A3 A4 B2 B3 B4 C2 C3 C4 D2 D3 D4 ↓ CA2 CA3 CA4 CB2 CB3 CB4 次に A5 A6 A7 B5 B6 B7 C5 C6 C7 D5 D6 D7 ↓ A118 A119 A120 B118 A119 A120 などと並べかえはどのようにマクロを組めばよいですか?

  • エクセル:複数セルからの参照

    お世話になります。 A,B,C列にデータが入っています。 D,E,F列に参照のためのデータがあります。 A,B,C列はそれぞれD,E,F列に対応しています。 A,B,C列と同じ並びのデータが入っている行をD,E,F列から探し、その隣のG列の値をH列に返す。 D,E,F列の並びが重複する行はありません。 A,D列は場所の名前、B,C,E,F列には数字が入っている。 例) A1に事務室 B1に20 C1に3 が入っているとする。 D/E/F列が 事務室/20/3 の並びになっているのが10行目の場合、H1にG10のセルの値を返す。 この場合、H列にはどんな計算式を入れておけばよいのでしょうか? A,B,C列と同じ並びのデータがD,E,F列で見つからない場合は空白をH列に返す。 ちなみにD/E/F列が 事務室/20/3 の並びになっている行は10行目しかないです。 よろしくお願いします。

  • EXCLのフィルター実行後のデータカウント方法

    EXCEL2007で作成した表で下記のようにD列(H-O)を +20でオートフィルターで抽出した後、F列 の+と-と0の値を持つデータをそれぞれ +値=2件 -値=2件 0値=1件 というようにカウントしたいのですがSUBTOTAL関数では そのような集計方法がなく困っています。 何かいい方法はありませんでしょうか?  A列  B列  C列  D列  E列  F列 ------------------------------------- 1 日付  O  H  H-O  C  C-O -------------------------------------   2 06/01 100 120  +20 130 +30 3 08/08 115 135  +20 115 0 4 08/13 140 160  +20 130 -10 5 09/22 132 152  +20 120 -12   6 10/06 105 125  +20 130 +25

専門家に質問してみよう