- ベストアンサー
EXCELマクロ 検索 VLOOKUP
Excelマクロで 検索とその結果のコピーを行いたいのですが、全くの素人のためご教授願えればと思います。 Excel2002で 2つの表から共通する部分をKEYに付随するデータ抜き出したいと思っています。関数VLOOKUPを使えば簡単な作業かと思いますがVBAではそのVLOOKUPやFIND、それにLOOPなどの使い方が今ひとつ理解 できません。 具体例として 表1には A-Z列まで約1000行のデータが存在します。 表2は表1と同じシート上の直ぐ隣列AA-AK列まで表1より必ず多い行数のデータが存在します。また表1のA列にあるデータは すべて必ず表2のAA列に含まれます。 行いたい作業は、VLOOKUPのような検索で、表1A列と表2AA列に共通したデータがあった場合、表2の該当セルを基準としてALからBJ列セルに表1の該当行のデータB-Z列をすべてコピー貼り付けすることです。 A・AA列とも同列内では重複も空白もなくソートされています。 これら以外の列には同じValueのデータや空白が存在します。またデータ件数(行数)も表1・2とも一定ではなく都度変動します。 解りやすくご説明いただけると幸いです。宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
処理速度は多少遅くなりますが、初心者にも理解しやすいコードにしてみました FINDや配列を使用した方が処理速度は速くなりますが、コードが複雑になるので まあ、1000行程度なら大した差ではないと思います AA列の1行目とA列の1行目から順に比較していき 値が等しければ、コピぺ処理を行う AA列の2行目とA列の1行目から順に比較していき 値が等しければ、コピぺ処理を行う : : これをAA列の最終行まで繰り返し行う Sub test() '----変数の宣言---- Dim 表1処理行 As Long Dim 表2処理行 As Long '----繰り返し処理---- '--表2 AA列の最終行を求め 1行目から最終行まで処理する-- For 表2処理行 = 1 To Range("AA65536").End(xlUp).Row '--表1 A列の最終行を求め 1行目から最終行まで処理する-- For 表1処理行 = 1 To Range("A65536").End(xlUp).Row '----A列の表1処理行目とAA列の表2処理行目を比較し 同じ値ならコピーを実行---- If Range("AA" & 表2処理行).Value = Range("A" & 表1処理行).Value Then '----B-Zの表1処理行目をコピーし ALの表2処理行目を先頭にしてペーストする---- Range("B" & 表1処理行 & ":Z" & 表1処理行).Copy Destination:=Range("AL" & 表2処理行) Exit For End If Next 表1処理行 Next 表2処理行 End Sub 以上参考まで
その他の回答 (3)
#1です。失礼いたしました。おっしゃるとおり、開発途中のチェック用ステートメントが消し忘れで残りました。
お礼
了解しました。 チェックの仕方なども含めて大変勉強になりました。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
VLOOKUP関数は検索列で第2、第3以下のあり場所を見つけられません。 VBAで使うことはたやすいが、本質的機能はこの制約を引き継いだままです。 絶対1回しか現れないという保証のあるケースでは使って有効でしょう。 だからVBAではセル単位のあり場所(セル番地)を見つけるのはFindメソッドを使います。 しかしこの学習は難しく、VBA中級以上の課題と思います。 しかし(1)検索操作をして、マクロの記録をとれば、その回に限ってのコードがわかるので、青は変えるべきところを返ればよい (2)WEBで(Googleなどで、「Find VBA」などで)照会すれば、たくさんコード例がでて学びやすい とはいえます。 関数のFINDは1セルの文字列の中の文字列をさがすもの。 LOOPは何でここへ挙げたの。 VBAでの繰り返しの1方法の、繰り返し1単位の終わりを示すものです。 ーーー >解りやすくご説明いただけると幸いです これを言う前に>具体例として 表1には ・・から>都度変動します までを、実例を簡単化して挙げるなどして、判りやすく説明してほしいよ。 実際はAA列までとか、1000行だろうが、A列第1行を中心に 4列、5行ぐらいの簡単な例をあげて要点を文章で説明して、説明できないのか。
表1の行数が3のとき、次のマクロでうまくいきました。4のところを1000に変えて試してみてください Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2009/8/6 ユーザー名 : ' Dim gyo1 As Integer, gyo2 As Integer, myretu As Integer, retu2 As Integer gyo1 = 1 gyo2 = 1 Do While gyo1 < 4 If Cells(gyo1, 1) = Cells(gyo2, 27) Then For myretu = 2 To 26 retu2 = myretu + 36 Cells(gyo2, retu2) = Cells(gyo1, myretu) Next gyo2 = gyo2 + 1 Else Cells(11, 2) = 2 End If gyo1 = gyo1 + 1 gyo2 = gyo2 + 1 Loop '
補足
ありがとうございます。 私の説明が十分でない中 私が興味を持ったLOOPで処理方法を教えていただき感謝いたします。 一箇所だけ解らなかったのですが、教えていただけますか。 Cells(11, 2) = 2 はどういった内容の処理でしょうか CELL B11に2を記入する指示だと思いますが、LOOP処理が上手く走ったか否かを確認をするためのものでしょうか。
お礼
ありがとうございます。 私の説明が十分でない中 非常に解りやすく各処理ごとに説明いただき感謝いたします。 動作確認もできました。 大変お世話になりました。