• ベストアンサー

EXCEL VBA 別シートの文字をシート内で検索

excel2003 VBAで SHEET2に格納されているセルの文字をSHEET1のB列1~9000程度までの文字列の中で一致または部分一致するものがあればそのセル(B列のセル)をSHEET3に順次A列に出力したいのですが、うまくできません。SHEET2に格納されている場所はA列で(SHEET1、SHEET2の文字とも増える可能性あり) 宜しくお願いします。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

sub macro1r1()  dim h as range  dim c as range  dim c0 as string  worksheets("Sheet3").cells.clearcontents  for each h in worksheets("Sheet2").range("A1:A" & worksheets("Sheet2").range("A65536").end(xlup).row)   if h <> "" then    set c = worksheets("Sheet1").range("B:B").find(what:=h.value, lookin:=xlvalues, lookat:=xlpart)    if not c is nothing then     c0 = c.address     do      worksheets("Sheet3").range("A65536").end(xlup).offset(1).value = c.value      set c = worksheets("Sheet1").range("B:B").findnext(c)     loop until c.address = c0    end if   end if  next  worksheets("Sheet3").select  range("A1:B1") = array("res", "work")  range("B2:B" & range("A65536").end(xlup).row).formula = "=MATCH(A2,Sheet1!B:B,0)"  range("A:B").sort key1:=range("B1"), order1:=xlascending, header:=xlyes  range("B:B").clearcontents end sub sub macro2r1()  dim Target as range  dim Crit as range  dim r as long  worksheets("Sheet3").cells.clearcontents  with worksheets("sheet1")  .range("1:1").insert shift:=xlshiftdown  .range("B1") = "myList"  set target = .range(.range("B1"), .range("B65536").end(xlup))  end with  with worksheets("sheet2")  .range("1:1").insert shift:=xlshiftdown  .range("B:B").insert shift:=xlshifttoright  .range("A1:B1") = "myList"  r = .range("A65536").end(xlup).row  with .range("B2:B" & r)   .formula = "=""*""&A2&""*"""   .value = .value  end with  set crit = .range("B1:B" & r)  end with  target.advancedfilter _   action:=xlfiltercopy, _   criteriarange:=crit, _   copytorange:=worksheets("Sheet3").range("A1"), _   unique:=false  worksheets("Sheet2").range("B:B").delete shift:=xlshifttoleft  worksheets("Sheet2").range("1:1").delete shift:=xlshiftup  worksheets("Sheet1").range("1:1").delete shift:=xlshiftup end sub

ytanaka2012
質問者

お礼

敏速な対応、回答ありがとうございました

ytanaka2012
質問者

補足

ご回答ありがとうございます。 Macro2のパターンでは希望通りに出力できました。 私の勉強不足でこちらのパターンはあまり理解できていないのですが・・・ Macro1では前回同様並び替えて出力されています。 自分でも修正チャレンジしているのですが・・・ お忙しい中ご回答ありがとうございました。

その他の回答 (3)

回答No.3

>検索結果の並び順はソートしない場合はどこを修正すれば良いのでしょうか? #1です #2さんへの補足に、割り込み回答 上記確認したいなら、F8で1行ずつデバックしてみてください。 どの時点でソートされているか分かります。 自分で確認しないと覚えないと思いますので。 あえて、コードは示しませんが・・・・ それでも分からない様なら、もう一度、補足でも入れてください。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

方法1:ベタだけど判りやすい sub macro1()  dim h as range  dim c as range  dim c0 as string  for each h in worksheets("Sheet2").range("A1:A" & worksheets("Sheet2").range("A65536").end(xlup).row)   if h <> "" then    set c = worksheets("Sheet1").range("B:B").find(what:=h.value, lookin:=xlvalues, lookat:=xlpart)    if not c is nothing then     c0 = c.address     do      worksheets("Sheet3").range("A65536").end(xlup).offset(1).value = c.value      set c = worksheets("Sheet1").range("B:B").findnext(c)     loop until c.address = c0    end if   end if  next end sub 方法2:推奨・高速 sub macro2()  dim Target as range  dim Crit as range  dim r as long  with worksheets("sheet1")  .range("1:1").insert shift:=xlshiftdown  .range("B1") = "myList"  set target = .range(.range("B1"), .range("B65536").end(xlup))  end with  with worksheets("sheet2")  .range("1:1").insert shift:=xlshiftdown  .range("B:B").insert shift:=xlshifttoright  .range("A1:B1") = "myList"  r = .range("A65536").end(xlup).row  with .range("B2:B" & r)   .formula = "=""*""&A2&""*"""   .value = .value  end with  set crit = .range("B2:B" & r)  end with  target.advancedfilter _   action:=xlfiltercopy, _   criteriarange:=crit, _   copytorange:=worksheets("Sheet3").range("A1"), _   unique:=false  worksheets("Sheet2").range("B:B").delete shift:=xlshifttoleft  worksheets("Sheet2").range("1:1").delete shift:=xlshiftup  worksheets("Sheet1").range("1:1").delete shift:=xlshiftup end sub

ytanaka2012
質問者

補足

早速のご回答ありがとうございます。 非常に助かります。 再度の質問で申し訳ありません。 検索結果の並び順はソートしない場合はどこを修正すれば良いのでしょうか?

回答No.1

VBAは組めるものとして、間単に内容説明します。 最初にSHEET3クリア 次に、SHEET1の最終行求めます Range("A1").End(xlUp)で最終行なのでその値まで繰り返せば VLOOKUP関数を式にしてください。 範囲はSHEET2(値はTRUE) FOR~NEXT(最終行) 出力が出せますので、それをSHEET3に出力してください。 その後に その出力されたものを重複削除し、並べ替えをすれば普通に出る と思います。 考え方はこの順番です。 VBAはこの考え方で組めます。 サンプルコードについての要求はなようなので、考え方のみ回答し ます。

ytanaka2012
質問者

お礼

敏速なアドバイスありがとうございました。

ytanaka2012
質問者

補足

早速のご回答ありがとうございます。 VBA初心者なので試行錯誤状態なので、考え方も大変参考になります。 ありがとうございます。

関連するQ&A

  • EXCEL VBA 別シートで検索後、貼り付け

    excel2010 (ブック名A.xlsx)にシート名SA、シート名SBがあります。 シート名SAのC列に検索対象(C1~C50位)があり シート名SBのB列が検索範囲(流動的ですがB1~B100位の範囲)です。 検索対象は文字列で、これが検索範囲のセルにに含まれていた場合 検索範囲の隣のセルCxxに検索対象文字列をコピー&ペーストしたいです また、検索範囲の行数に値があるまで、順次処理をしていきたいです

  • VBA 別シートの計算表

    Excelについて。 シートAに、計算表があります。 セルa1に入力した値によって、いくつかのExcel関数を利用して、 セルb1に結果を出力しています。 いつも、手入力でセルa1に値を入力して結果を求めていますが。 今度、シートBに膨大な入力するための数値があるので、VBAで自動化できないかと考えています。 今回の質問は、VBAで記述する際に、シートAの入力セルa1に、シートBの入力値を1つずつ代入していき、結果のセルb1をシートBの入力値の隣に出力していこうと考えています。 シートAのa1に入力値を代入して、すぐに結果b1の値を結果出力セルに代入していいのでしょうか? 計算表(シートA)での計算を時間をおく必要があるのでしょうか?=一旦、他のセルを選択するなど。 よろしくお願いします。 ・計算表での計算時間は、1秒未満です。 ・計算表の計算過程もVBAで書けば済む話ですが、プログラミングには疎いので、計算表をそのまま利用したいと考えています。=入力の代入だけVBAで書いていきたいと思います。 ・その他、アドバイスなどいただければ幸いです。 よろしくお願いします。 Excel2010

  • Excel VBAを使って会員検索

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

  • excel vba 検索の方法について

    excel vba 検索の方法について sheet1とsheet2があり sheet1のA列に10列(全て8桁の数字)文字が並んでいます。 sheet2のA列には1000列(全て8桁の数字)文字が並んでいます。 sheet1のA列とsheet2のA列で同じ文字がある場合 sheet2のA列の同じ文字の隣のsheet2のB列に◎がつくような vbaが書きたいです。 A列の文字は消したり、文字を変えたりします。 コマンドボタンに書いて、ボタンを押せば B列に◎がつくようにしたいです。 ご教授お願いします。

  • VBAを使って検索したセルを別のシートにコピーする

    こんにちは。 業務でエクセルを使用して差し込み文書を印刷しています。 量が多いのでVBAを使って簡単に作業したいです。 まず、以下のようなシートがあります。 <Sheet1>差込文書 <Sheet2> (A)  (B)    (C)     (D) (E)  (F) 番号|会社名|支店名|役職名|氏名|会社、支店名、役職名、氏名 次のような作業をさせたいです。 1.<sheet2>のA列と同じ番号が<sheet1>の(L1)にあるかどうか検索する。 2.もし、一致するセルがあれば、<sheet2>の該当番号の行のF列を<sheet1>の(B5)にすべて(書式ごと)コピーする。 以上です。 VLOOKUP関数でしましたが、すべてをコピーする事ができなかったので、VBAでコピーしたいです。 F列は、個人名だけの方、支店がない会社などがあるため、バランス良く配置しているセルです。 よろしくお願いします。

  • EXCEL VBA

    どうもです。 EXCELのVBAのソースで部分一致文字列のIF文の 書き方を教えてもらいたいのですが、どなたか よろしくお願いいたいます。 列Aと、列Bで たとえば、列Aの文字列AAAと、 列BのAAABがTrueになればいいのですが、 どうしたらいいでしょうか?

  • vbaにて並べ替えしたい。

    並べ替えするには? ただいまVBA学習中です。 sheet1に次のような文字列がセルに入力されているとします。 3列で30行あります。   A列 B列 C列 1行 あ  い  う 2行 え  お  か ...以下30行まで続く。 これらを sheet2に A列 あ い う え お か のようにひとつの列へ縦にするにはどのような記述になりますか? 私なりの考え方ですが セルのスタート位置はシート1のA1とします。  シート1にて  ・あ い う と順番に配列に格納  ・セルを左に2つ下に1つ移動   この動作を30回繰り返す(for next 使えばでいいですよね?)  シート2に移動してA1から下方向へ  格納された文字列を入力する。  と、考えてみたものの記述の仕方がわかりません。 力貸してください。   

  • エクセル(VBA) 検索条件に文字色を含める

    エクセルについて質問です。 エクセルのバージョンは2007を使用しています。 基本的にはCOUNTIFS関数やSUMPRODUCT関数の考え方で複数条件を満たすセルの個数を数えたいのですが その検索条件のうちのいくつか(正確には3つの列)において、特定文字が何色かを見たいのです。 具体的には下の添付ファイルの備考A~備考Cの列のように、その3つの列のセルの中にそれぞれ黒文字(自動)、黒文字(自動)太字、赤文字、青文字が混在しており、その文字列の羅列の規則性としては 1.セル内の文字列は必ず、上で挙げた4種のフォントスタイルのうちのいずれかの # で始まる。 2.#A #B #C (#D) のように、セル内の文字列は一連の小文字列が半角スペースで区切られているとともにその一連の小文字列の最初の文字は必ず # もしくは (# であり、またその一連の小文字列は同一色同一の太さである。 3.(#A) のような、() で囲んだ一連の小文字列は黒文字(自動)スタイルだけであり、また1.でも述べたようにセル中の文字列の最初に来ることはない。 となっております。 そこでそれぞれの列について、黒文字(自動)もしくは黒文字(自動)太字もしくは青文字の # で始まるセルを検索し(つまり赤文字の # で始まるセルと何も記述のない空白のセルを除く)、 その3列を and もしくは or 条件で組み合わせ、更に1、2個条件を加えて該当する行の数をCOUNTIFS関数やSUMPRODUCT関数のように数え、返したいと思っております。 恐らくVBAを利用することとなると思います。まだまだVBAを自分で一から構築することは難しいのですが、ある程度VBAを読み解き理解していくことは可能なレベルですので、どうか大まかな構文の枠組みだけでもご教授いただけると幸いです。 よろしくお願いいたします。

  • エクセルVBA セルを参照した文字検索

    どなたか教えてください。 ブックAのシート1の“A1”の値が、ブックBのシート1のA列に完全一致であるかどうかを検索し、あればそのセルをアクティブ、なければメッセージを返すという処理をVBAで行いたいです。 Findメソッドを使うのかなというのは、なんとなくわかるのですが、検索値が毎回異なり直接検索値をコードに記入できないこと、異なるブックで検索することなどにより、コードの記載方法がわかりません。 どなたか、わかる方お教えください。

  • VBA 文字列→検索→置き換え

    Excel 2007です。 VBAで、特定のレンジのセルから、特定のセルに入った文字列を検索して削除するにはどうしたらよいでしょうか? 具体的にはB2:B100の中にあるA1セル内の文字列を削除する。といった感じです。 よろしくお願い致します。

専門家に質問してみよう