- 締切済み
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を使わなくてもいいので、方法を教えてください。 本来自力で調べるべきですが、急ぎの仕事な為、ご協力ねがいます。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
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列が複数行あれ繰り返しは必要ではないですか。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >マクロを今日初めて組んだのですが、うまく行きません プログラミングの経験がある方なのですか? いきなり、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
お礼
データの内容は数字とアルファベットの羅列になります。 例:462F1,462,62F1など・・・ 桁数はバラバラですが、検索時に重複する事はありません。 (1列の中にデータの重複はない) プログラミングの経験はありませんので、 いきなりFindは厳しいかったのかもしれません・・・ 教えて頂いた方法で試行錯誤してみます。 ありがとうございます。
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
4列目って =IF(ISNA(VLOOKUP(C1,$A:$B,2,FALSE))=TRUE, "", VLOOKUP(C1,$A:$B,2,FALSE)) じゃダメなんですか?
お礼
VBA内でも関数がくめるんですね。参考になります。 早速試してみます。 ありがとうございます。