エクセルの検索・抽出マクロについて教えて下さい。

このQ&Aのポイント
  • 急遽、会社のマクロ使用可のパソコン(ヴィスタ)で、検索・抽出のデータ作業をすることになりました。
  • オートフィルタの貼り付けでは、時間がかかりすぎるということで、職場の少ない知恵を出し合って考えていますが、なかなか上手くいかず、こちらにもお尋ねさせていただきます。
  • シート1の『参照データ』から抽出されたデータが、シート2に『検索後のデータ』として表になって出てくるような関数(の場合はボタンなし)か、マクロをつくりたいのですが、シート2の『検索する番号』を、番号ではなく表の真ん中の列の『文字』でも検索できるように(番号でも文字でも、どちらでも検索できるように・・)は出来ないでしょうか・・・
回答を見る
  • ベストアンサー

エクセルの検索・抽出マクロについて教えて下さい。

急遽、会社のマクロ使用可のパソコン(ヴィスタ)で、 検索・抽出のデータ作業をすることになりました。 オートフィルタの貼り付けでは、時間がかかりすぎるということで、 職場の少ない知恵を出し合って考えていますが、なかなか上手くいかず、こちらにも お尋ねさせていただきます。 シート1に、3列(番号、文字、英字)の 『参照データ』があります。 シート2の 『検索する番号』 に番号を入れ、 『検索開始』ボタンを押すと、 シート1の『参照データ』から抽出されたデータが、 シート2に 『検索後のデータ』として表になって出てくるような関数(の場合はボタンなし)か、マクロをつくりたいのですが・・ 更には シート2の『検索する番号』を、番号ではなく 表の真ん中の列の『文字』でも検索できるように(番号でも文字でも、どちらでも検索できるように・・)は出来ないでしょうか・・・ ご回答を、心から お待ちしております! よろしく お願いします (u_u)

  • p1_1q
  • お礼率95% (39/41)

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

補足を読ませていただきました。 >文字が・・・・『検索する文字を含む』でした ということなので、前回同様にコードを作ってみると・・・ ( ̄□ ̄)がーん 仮に元データ内に「あいう」・「いえ」等々があり、検索文字が「あ」・「い」のように二つ以上含まれていると すべて重複して表示されてしまいましたので、 今回はG列を作業用の列として使い、重複を削除しています。 (もしG列以降にデータがあるのであればコードが少し変わってきます) Private Sub CommandButton1_Click() Dim i, j, k As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") k = ws2.Cells(Rows.Count, 4).End(xlUp).Row If k > 3 Then Range(ws2.Cells(4, 4), ws2.Cells(k, 6)).ClearContents ws2.Columns("D:F").Interior.ColorIndex = xlNone End If If ws2.Cells(Rows.Count, 2).End(xlUp).Row > 3 Then If IsNumeric(ws2.Cells(4, 2)) Then k = 2 ElseIf WorksheetFunction.CountIf(ws1.Columns(3), "*" & ws2.Cells(4, 2) & "*") Then k = 3 Else k = 4 End If For i = 4 To ws1.Cells(Rows.Count, 2).End(xlUp).Row For j = 4 To ws2.Cells(Rows.Count, 2).End(xlUp).Row If k = 2 Then If ws1.Cells(i, k) = ws2.Cells(j, 2) Then With ws2.Cells(Rows.Count, 4).End(xlUp).Offset(1) .Value = ws1.Cells(i, 2) .Offset(, 1) = ws1.Cells(i, 3) .Offset(, 2) = ws1.Cells(i, 4) End With End If Else If ws1.Cells(i, k) Like "*" & ws2.Cells(j, 2) & "*" Then With ws2.Cells(Rows.Count, 4).End(xlUp).Offset(1) .Value = ws1.Cells(i, 2) .Offset(, 1) = ws1.Cells(i, 3) .Offset(, 2) = ws1.Cells(i, 4) End With End If End If Next j Next i For j = 4 To ws2.Cells(Rows.Count, 4).End(xlUp).Row ws2.Cells(j, 7) = ws2.Cells(j, 4) & ws2.Cells(j, 5) & ws2.Cells(j, 6) Next j For j = ws2.Cells(Rows.Count, 7).End(xlUp).Row To 4 Step -1 If WorksheetFunction.CountIf(Range(ws2.Cells(4, 7), ws2.Cells(j, 7)), ws2.Cells(j, 7)) > 1 Then Range(ws2.Cells(j, 4), ws2.Cells(j, 7)).Delete (xlUp) End If Next j End If ws2.Columns(7).Delete For j = 4 To ws2.Cells(Rows.Count, 4).End(xlUp).Row If WorksheetFunction.CountIf(ws2.Columns(4), ws2.Cells(j, 4)) > 1 Then Range(ws2.Cells(j, 4), ws2.Cells(j, 6)).Interior.ColorIndex = 36 '←色は好みで変更 End If Next j End Sub こんなんではどうでしょうか? 今回もSheet2の検索文字列は統一している(Sheet1のB~D列が混在しない)ものとし、 必ずB列の4行目(最初の行)から検索文字は入っているという前提です。 尚、For~Nextを多用していますので、表示されるまで結構時間がかかるかもしれません。 じっくり考えればもっと簡単なコードになるかもしれませんが、 今回はこの程度で・・・m(__)m

p1_1q
質問者

お礼

わーい、出ました! 本当に凄いです! 完璧です! tom04さん(^▽^)こんにちは。 難しいマクロを 時間をかけて 考えていただいたにもかかわらず、 私の不注意で、再度 作り直していただき・・・(;_;)涙・・・ 感謝でいっぱいです。 時間のかかる作業を、一瞬でできるように 叶えていただいて、 心から、ありがとうございました☆ 今から、ご回答(1)のマクロとの違いを勉強してきます♪ 

その他の回答 (1)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 一例です。 >表の真ん中の列の『文字』でも検索できるように(番号でも文字でも、どちらでも検索できるように・・) とありますので、勝手に「英字」でも検索できるようにしてみました。 尚、Sheet2の検索列は「番号」なら「番号」のみ、「文字」なら「文字」のみという具合に Sheet1のB~D列のデータが混在していないという前提です。 (3・い・F のように他の列の物が混ざっていない) 尚、重複するものに色を付けるということですが、「番号」が重複する場合のみ薄い黄色にするようにしています。 (他の列「文字」・「英字」に重複があっても「番号」のみが色付け対象です) 画像を拝見するとコマンドボタンを配置されているようなので、デザインモードでコマンドボタンをダブルクリックし↓のコードをコピー&ペーストしてみてください。 当然のことながらダブルクリック時点で1行目と最終行は入っているはずですので必要ありません。 Private Sub CommandButton1_Click() Dim i, j, k As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") k = ws2.Cells(Rows.Count, 4).End(xlUp).Row If k > 3 Then Range(ws2.Cells(4, 4), ws2.Cells(k, 6)).ClearContents ws2.Columns("D:F").Interior.ColorIndex = xlNone End If j = ws2.Cells(Rows.Count, 2).End(xlUp).Row If j > 3 Then If WorksheetFunction.CountIf(ws1.Columns(2), ws2.Cells(4, 2)) Then k = 2 ElseIf WorksheetFunction.CountIf(ws1.Columns(3), ws2.Cells(4, 2)) Then k = 3 Else k = 4 End If End If For i = 4 To ws1.Cells(Rows.Count, 2).End(xlUp).Row For j = 4 To ws2.Cells(Rows.Count, 2).End(xlUp).Row If ws1.Cells(i, k) = ws2.Cells(j, 2) Then With ws2.Cells(Rows.Count, 4).End(xlUp).Offset(1) .Value = ws1.Cells(i, 2) .Offset(, 1) = ws1.Cells(i, 3) .Offset(, 2) = ws1.Cells(i, 4) End With End If Next j Next i For j = 4 To ws2.Cells(Rows.Count, 4).End(xlUp).Row If WorksheetFunction.CountIf(ws2.Columns(4), ws2.Cells(j, 4)) > 1 Then Range(ws2.Cells(j, 4), ws2.Cells(j, 6)).Interior.ColorIndex = 36 '←色は好みで変更 End If Next j End Sub こんな感じではどうでしょうか?m(__)m

p1_1q
質問者

お礼

tom04さん、こんばんは(^▽^) いつも いつも、早くに 貴重なお時間をさいて 考えていただき、 ありがとうございます! 早速 コピーしてボタンを押しみました。 すごい!(≧▽≦)人 パチパチパチ 一瞬で表が現れました。 最高です、会社のみんなの、驚きと 喜ぶ顔が目に浮かびます♪ 今から、教えて頂いたマクロの解読・・・ 勉強させていただきます! 本当に いつも、朝から晩まで、感謝感激して止みません (=^▽^=)

p1_1q
質問者

補足

tom04さん (・▽・)こんばんは! 只今、教えていただいたマクロを 勉強中ですが・・・ なんと、申し訳ないことに、 深いご配慮で 数字でも文字でも英字でも検索できるようにしていただきましたのに、 私の説明間違いに 気づきました( ̄□ ̄)がーん なんで気づかんかったんじゃろー 本当に すみません・・・ 検索時に、数字(番号)は完全一致なのですが、 文字が・・・・『検索する文字を含む』でした (;_;) 例)参照データの文字が『あああ』で、検索の文字が『あ』の場合がありました。 教えて頂いたマクロの、どの部分を どのように変えたら実行できますでしょうか? 説明不足を、おゆるしください。 いつまででもお待ちしておりますので どうか、ご指導を、よろしくお願い致します!

関連するQ&A

  • エクセルのVBAマクロで検索と結果表示(抽出)

    エクセルのVBAマクロで検索と結果表示(抽出)を行いたいです。 業務で使用している膨大なリストデータから、特定のキーワードで情報の絞り込みを行いたいのですが、上手くマクロが組めません。 機能としては、シート1で特定のキーワード(テキストボックスに)を入力し検索ボタンを押下すると、 シート2のリストデータから検索に引っかかったセルの"行"を、シート1にリストアップ(貼り付け)していくようなマクロを作りたいのです。 シート2にはB列~AH列xn行のリストデータがあり、シート2のK列のセル内から「シート1のテキストボックスで入力したキーワードを含む」検索を行い、 HITした行をシート1のA9の行から結果として表示を行いたいんです。 簡単に言えばオートフィルタ機能の部分一致版を作りたいのですが・・・。 (オートフィルタでは完全一致でしか抽出が出来ないので) そして、検索ボタンを押下すると前回結果はクリアしたいです。 ネット上のサンプル等も参考にしながらやってみたのですが上手く行きません。。。 どなたか上記のマクロ文をご教授願えないでしょうか。 必要な情報(シート2の特定の列)のみ表示させたいとも思いましたが、むずかしくて断念・・・。 もし可能でしたらこちらもお願い致します。 よろしくお願いいたします。

  • 検索・抽出・貼り付けのマクロ

    シート1のデータをオートフィルターかけて検索し抽出したものを、A列、B列、D列、F列をシート2の、A列、B列、C列、D列に貼り付けるマクロを教えて頂けますでしょうか? 一週間位悩んでいます。

  • Excelで全シートから検索し列で抽出する方法

    現在Excel2010で作成している表をマクロで検索・抽出したいのですが、 素人のため中々思うように出来なくて困っています。 Sheet2~Sheet4まで作成した表があります。 Sheet1には検索ボタンを作成し、検索ボタンを押すと検索フォーム(ユーザーフォーム)が出てきます。 検索フォームはTextBox1とCommandButton1があります。 ------ここまでは作成済みです-------- ・検索フォームのTextBox1に入力した文字(半角全角英数関係なく)をCommandButton1で検索を行う。 ・そしてその検索結果をSheet1の検索ボタン(セル A~B・1~2)を避けて表からコピーして抽出(複数ある場合は複数抽出)。 ・抽出内容は、検索でヒットしたセルの列全てを抽出(複数ある場合は複数の列が抽出される)。 ・同列に検索した文字が2つある場合も、抽出する列は1つ。 少しややこしいかもしれませんが、上記のようなマクロを作成したいのですが私では力が足りませんでした。 わかりやすく教えていただけると嬉しいです。

  • EXCELでの検索マクロを作りたいのですが

    マクロの初心者です。氏名の検索マクロを作成したいのですが分かりません。 A列:名前 B列:郵便番号 C列:住所 と 名前等のデータを(ランダムに)入力したシート1を作成し、 シート2にシート1の「A列:名前」から性(たとえば青木)で検索して検索ボタン(マクロボタン)を押して該当データを表示させるようにしたいのですが。

  • エクセルのマクロでの検索

    「編集→「検索」でやるようなことをマクロでやりたいのです。 例えば列Aのデータを検索してそのデータがある行を表示させたいのですが ・同じブック内のシートの同じ列を検索する。 ・検索する文字列を含んでいる候補をマクロボタンを押すごとに表示させていく ということはできるでしょうか。

  • エクセルマクロで検索ボックスを作成する

    エクセル2010のマクロで検索ボックスを作成したいと考えています。 質問No.4072490を参照して作成しました。 ////////////////////////////////////////////////////////// 質問 エクセルのシートにテキストボックスとコマンドボタンを配置してシート上のデータを検索することは可能でしょうか?今現在はB列に、複数の文字データが入力してあるので、オートフィルタのオプションから「を含む」で検索してます。 イメージとしては、オートフィルタのオプションから「を含む」を選んでから検索しなくても予めシートに用意してあるテキストボックスに検索したい文字を入れてボタンを押すと、オートフィルタで検索したときと同じような結果が得られるようにしたいと思ってます。 例)  A    B    C     -------------- 1     血液型      2      A 3      B 4      O 5      AB 上のような表があったとして、テキストボックスにAと入力してボタンを押すとB2とB5が表示されるようにしたと思ってます。いい方法があればご教示願います。 回答 シートにテキストボックス1個、コマンドボタン2個を配置します。 これは出来ますね。 コマンドボタン1個目は検索ボタン、2個目は解除ボタンです。 ツール→マクロ→Visual Basic Editorを選択して シートに以下のコードを貼り付ける。 ------------------ ここから下 ---------------------- Option Explicit Private Sub CommandButton1_Click() Rows("1:1").Select Selection.AutoFilter Selection.AutoFilter Field:=2, Criteria1:="=*" & TextBox1.Value & "*", Operator:=xlAnd End Sub Private Sub CommandButton2_Click() Selection.AutoFilter End Sub ---------------- ここまで ------------------ エクセル2000です。 機能は「を含む」です。つまり文字列のどこにでもテキストボックスに入力した文字が含む行を表示します。 ////////////////////////////////////////////////////////// 上記を参照して検索ボックスを作成したところ、一回目の検索とフィルタ戻しは問題なくできましたが、2回目から検索ができません。 どこか変更した方が良いでしょうか。 追加でもう一つ質問です。 検索範囲がB列に限定されてしまいます。 シート状のすべてで検索することはできるでしょうか。

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

    今までオートフォーマットで検索していたのですが,一つの列に存在するデータが多量になったため,マクロを使った検索としたいです。 検索の方法として,「コンボボックス」で選択したデータを検索したいと考えています。 現状は以下の通りです。 ○検索元となるデータは,1つのSheetにまとめてあります。 ○「コンボボックス」で指定したいデータは4つあります。 ○検索元のSheetの,D列が文字列,E列が数字,F列が文字列,G列が数字となっています。 この,D列~G列の中で,「コンボボックス」4つで指定したデータを別のSheetで表示させたいと考えています。 エクセルは,表計算やグラフならある程度使いこなせるのですが,マクロは全くの素人です。 お手数をお掛けしますが,どなたか知恵を授けてください。 よろしくお願いします。

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

    今までオートフォーマットで検索していたのですが,一つの列に存在するデータが多量になったため,マクロを使った検索としたいです。 検索の方法として,「コンボボックス」で選択したデータを検索したいと考えています。 現状は以下の通りです。 ○検索元となるデータは,1つのSheetにまとめてあります。 ○「コンボボックス」で指定したいデータは4つあります。 ○検索元のSheetの,D列が文字列,E列が数字,F列が文字列,G列が数字となっています。 この,D列~G列の中で,「コンボボックス」4つで指定したデータを別のSheetで表示させたいと考えています。 エクセルは,表計算やグラフならある程度使いこなせるのですが,マクロは全くの素人です。 自分の力で解決しようと,色々試しましたが無理でした・・・ お手数をお掛けしますが,どなたか知恵を授けてください。 よろしくお願いします。

  • マクロを使って抽出を

    エクセルで検索窓のようなものを作りたいと思っています。 A列には品番、B列にはシリーズ名、C列には対応(○×△)のような表です。 マクロを実行すると、「言葉を入力してください」のようなボックスが出て、そこに文字を入力するとオートフィルタのように抽出してくれるようなものを作りたいのですがどのようにすればいいのでしょうか? それと、検索はB2にバナナ、B8にチョコバナナ、B10にバナナドリンクのような表だとして、検索窓にバナナと入力すると、B2、B8、B10を抽出してくれるようなものを作りたいと思います。 よろしくお願いします。

  • エクセルのマクロを知りたい

    エクセルで,たくさんのデータが入力された【シートa】があります。 新しく【シートb】を作成して,そこに空白の表(1)~(10)までを作成します。 (ちなみに表(1)は1行から始まり100行まで,表(2)は101行から始まり200行まで・・・・といった感じです) 【シートb】の表(1)には,【シートa】でA列に「1」が入力されているデータを抽出して,それをB列の昇順に並べて記入しなさい。同様に,表(2)には,【シートa】でA列に「2」が入力されているデータを抽出して,それをB列の昇順に並べて記入しなさい。・・・というのを表(10)まで続けます。 上記のような命令をボタン一つで操作できるようなマクロを教えて欲しいのです。 お願いします。