• ベストアンサー

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とも一定ではなく都度変動します。 解りやすくご説明いただけると幸いです。宜しくお願いいたします。

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

処理速度は多少遅くなりますが、初心者にも理解しやすいコードにしてみました 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 以上参考まで

Tetraodon
質問者

お礼

ありがとうございます。 私の説明が十分でない中 非常に解りやすく各処理ごとに説明いただき感謝いたします。 動作確認もできました。 大変お世話になりました。

その他の回答 (3)

noname#192382
noname#192382
回答No.4

#1です。失礼いたしました。おっしゃるとおり、開発途中のチェック用ステートメントが消し忘れで残りました。

Tetraodon
質問者

お礼

了解しました。   チェックの仕方なども含めて大変勉強になりました。 ありがとうございました。

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

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行ぐらいの簡単な例をあげて要点を文章で説明して、説明できないのか。

noname#192382
noname#192382
回答No.1

表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 '

Tetraodon
質問者

補足

ありがとうございます。 私の説明が十分でない中 私が興味を持ったLOOPで処理方法を教えていただき感謝いたします。 一箇所だけ解らなかったのですが、教えていただけますか。 Cells(11, 2) = 2  はどういった内容の処理でしょうか CELL B11に2を記入する指示だと思いますが、LOOP処理が上手く走ったか否かを確認をするためのものでしょうか。

関連するQ&A

  • EXCELマクロ 検索

    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とも一定ではなく都度変動します。 解りやすくご説明いただけると幸いです。宜しくお願いいたします。

  • マクロVLOOKUPの高速化

    シート1には13,000行、 シート区分マスターには25,000行において シート1の検索値からシート区分マスターを検索して ヒットしたらシート1に返したいです。 シート1のデータ行文行いたいです。 シート1の行数は常に変化、 シート区分マスターの行数は固定です。 以下の記述で検索を行いますが終了するのに 5分強かかります。 (下のほうに再計算0%→5%→70%→95%と表示されている) もっと早く処理させる方法はありますでしょうか? よろしくお願いします。 Sub 区分検索() '2010 年11月18日 'シート1のA列を検索値として 'シート区分マスターのA列を検索しヒットしたら 'シート区分マスターの該当行のE列をシート1のC列に転記 'データはそれぞれのシートともに2列目からである 'ヒットしない場合はシート1のC列は空白にする '検索値と転記するセルのシート選択 With Sheets("シート1") 'データ開始行のC2に式を入れる .Range("C2").Formula = _ "=IF(ISNA(VLOOKUP(A2,区分マスター!$A:$E,5,FALSE)),"""",VLOOKUP(A2,区分マスター!$A:$E,5,FALSE))" '数式入力 '式によって抽出されてC列に転記された値をコピーします。 .Range("C2").Copy .Range("C2:C" & .Range("A" & .Rows.Count).End(xlUp).Row) 'データ最終行までコピー .Columns("C:C").Copy 'コピーした値をC1から値貼付を行う .Range("C1").PasteSpecial Paste:=xlPasteValues 'C列を値に変換 Application.CutCopyMode = False End With End Sub

  • ExcelのVLOOKUPを使った検索について+α

    またまた質問させてもらいます・・・ VLOOKUPは本来検索範囲の左端の列を検索していくの ですが、それを他の列をキーにしたいのです。ですが、 元表の順番を変えることができないので、検索できずに 困っています。そこで質問なんですが、 ・元表を変えずに(コピー等を作らずに)、関数内だけで 表を擬似的に並べ替えて、左端の列以外の列を検索キーと した列検索は可能でしょうか?可能なら方法はどうやれば よろしいでしょうか。 ・もしそれがだめな場合他のアプローチはありますが? できれば方法も・・・ あと、もうひとつ質問なんですが、検索範囲を指定する 時に左上のセルの位置は固定で右下のセルが表の行数 によって変化する場合、汎用的に関数で指定することは可 能でしょうか? つまり、B4:H14という範囲指定がある場合、表の行数がひ とつ増えるとB4:H15と範囲指定を変えてくれるような方法 はありますか?ということです。 ということです。それではよろしくお願いします。

  • エクセルVLOOKUPで列毎に並び替えたい

    お世話になります。 今、エクセルのA列に200個のそれぞれ異なる値(8個の英数字で構成された値)が入っているとし(A1~A200)、一方、C1セルを起点に300行×80列のセルそれぞれに計24000個の値が入っているとします。また、C1~C300のセルにはA列と同じ値が含まれていて、300個はそれぞれが異なる値とします。 ここで、300行x80列の表を、A列の右隣りに、A列の値と同じ値を持つC列セルを含む行が並ぶように表の行を並べ替えたいのです。 (1行1行の内容は変えずに、1行全体を上下に移動させる。どこに移動させるかは、C列の値と同じ値を持つA列セルの行に移動させる。) A列の値を検索キーとする16000個のVLOOKUPを埋め込めば出来そうですが、1列に200個のVLOOKUPだけ埋め込めばD列移行の値はくっついて並び替わってくれる方法はないでしょうか? よろしくお願いします。

  • エクセル VlookUPで違う結果が出てくる

    エクセル2010で何度も使っているVlookUP関数なのでですが、今日は何故か全くうまく行かず、原因が分かりません。 氏名が入った表同士で、Sheet1の氏名の横の列にSheet2の参照範囲からデータを持ってくるだけの作業なのですが、全く違う人(場所)のデータをもっともらしく引っ張ってくるのですが。 横にコピーすると、その違う人の横のセルのデータを持ってきます。 詰まり参照は出来ているのですが、全く違う「氏名」の行のデータを参照しているのですが。 この原因分かる方、是非お願いします。

  • エクセルで連番をマクロで

    こんにちは いつもお世話になっています。 Windows7、エクセル2010で教えてください。  B3から仮にB100まで文字列があるとします、空白セルはありません。 この状態でA3からA100まで1から始まる連番をマクロで実行したいのです。 実際はB列のデータの最終行は不定です。つまり、B列にデータがなくなるまで(空白セルになるまで)A列に連番をつけたいのです。現在はA3,A4に1,2と入力し、オートフィルで該当セルを選択し「予測」で連番をつけています。 マクロ記録ではB列にデータがなくなる判断ができなくて作れません。 この作業が頻繁にあるものですからマクロができれば助かります。 よろしくお願いいたします。

  • EXCELのVLOOKUPで

    アンチョコを見てC8のセルに「1直」と入力したら 勤務時間というシートのA列からI列までの中から2番目の行に あるデータを表示するということを次のように設定できました。 (説明あってるかな?) IF(C8="","",VLOOKUP(C8,勤務時間!A:I,2,FALSE))←D9のセルに入力 それで「直休」とC8のセルに入力した場合、 A~Iまでの行には何も表示してほしくないのです。 勤務時間のシートにはもちろん空白になってます。 ところが「直休」を選択するとA~Iに「0(ゼロ)」が表示されてしまいます。 「直休」と入力したらA~Iを空白にすることはできませんか? またできるならなんという式を入れればいいのでしょうか? よろしくお願いします。 わからないことがあればもちろん補足いたします。

  • Excel検索等関数

    Excelのデータで同じ列の中に番号が重複している値を探し出しなおかつ任意の行数に出す関数はありますか? Sheet1   |Sheet2   A  B |   A  B        1 あ 10 | 1 あ  10 2 あ 11 | 2 あ  11 3 い 21 | 3 い  21 4 う 22 | 4      ←A4:b4は、「い」が2行ないので空白        | 5 う  22        | 6      ←A6:b6も、「う」2行ないので空白 このように、縦の重複したセルを検索して、指定行数内の場合は、空白となる関数式があればお教えください。

  • エクセルのマクロについて質問です。

    エクセルのマクロについて質問です。 たとえば、 セルA1からAA1までのセルの中で、コピーとペーストを行います。(これは記録マクロで作ります) それと同じ作業を、3行下のA3からAA3の行でも行い、 また、3行下のA6からAA6の行で行う といった作業をマクロで作る方法を 教えていただきたいです。

  • Vlookup関数で検索結果がエラーになってしまう

    お世話になります。 Vlookup関数の質問となります。 =VLOOKUP(C2,Sheet2!$A$2:$E$685,1,FALSE) 検索値  →リストを使用(元データはSheet2の指定したセル範囲の表の2列目のデータ) 範囲 →Sheet2の特定のセル範囲 列番号 →1(ここは100-01、100-02などの番号が入力されています) 検索方法 →false(完全一致) この式で「#N/Aエラー」が発生してしまいます。 単純に「氏名」から「社員番号」を引っ張りたいだけなのですが、 なんでエラーになるのでしょうか? 範囲に指定した表には空白行はありますが、書式設定などは特に問題はないです。 恥ずかしい質問なのは十分に理解していますが、 教えて頂きたく思います。 よろしくお願い致します。

専門家に質問してみよう