- ベストアンサー
Excelで全シートから検索し列で抽出する方法
- Excel2010で表をマクロで検索・抽出する方法について教えてください。
- Sheet1に作成した検索ボタンを押すと検索フォームが表示されます。
- 検索フォームのテキストボックスに入力した文字を基に、各シートから列を抽出します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>検索でヒットしたセルの列全てを抽出(複数ある場合は複数の列が抽出される)。 言わずもがなですが、「列」と「行」を言い間違えてはいませんね? 各シートごとに、検索とヒットしたセルをまとめて確保、一気にコピーする事でダブりを防止します。 private sub CommandButton1_Click() dim i as long dim h as range dim res as range dim target as range dim c0 as string ’1枚目シートの事前掃除 with worksheets(1) .range(.range("C1"), .cells(1, .columns.count)).entirecolumn.delete shift:=xlshifttoleft end with activeworkbook.save set target = worksheets(1).range("C1") for i = 2 to 4 ’2枚目から4枚目のシートを対象に set res = nothing ’検索開始 set h = worksheets(i).cells.find(what:=me.textbox1, lookin:=xlvalues, lookat:=xlwhole, matchcase:=false, matchbyte:=false) if not h is nothing then ’もし有れば c0 = h.address set res = h.entirecolumn do set h = worksheets(i).cells.findnext(h) set res = union(res, h.entirecolumn) loop until h.address = c0 ’シート内の検索終了 ’コピーと次の貼り付け先の調査 res.copy target set target = worksheets(1).cells.specialcells(xlcelltypelastcell).offset(0, 1).end(xlup) end if next i end sub #補足 あなたの各シートの「貼り付け先はどうなっているのか」「どんな内容がコピーされるのか」といった具体的に目に見える様子の情報が何もないので、「貼り付け先を掃除する」とか「どこに貼り付けたらいいのか」とかの情報の採取のため、大変回りくどい手管を弄しています。 たとえば「全シートとも1行目がきっちり埋まっている」といった、少しでも手掛かりになりそうな目に見える情報があれば、もうちょっと簡単なマクロにする事もできました。
その他の回答 (2)
- keithin
- ベストアンサー率66% (5278/7941)
>画像 それは想定外でしたが、あなたの言ってる「画像」と、シートの左上に置いてある「ボタン」などの区別がちゃんと付いているか心配します。 きちんと文字通り使い分けが理解できているのでしたら、掃除ブロックに activesheet.pictures.delete と一行追記します。 言わずもがなですがボタンにも画像を使っていたら当然一緒に消しちゃいますし、そもそも「画像」じゃなく実は別のモノが置かれてたら、当然これではダメです。 >部分的にセルの結合 説明があいまいですが、「部分的に」とは「A列やC列には結合セルは無いけど、D列とE列は上から下まで隣同士セル結合している」という意味で、「ある列の途中で結合しているセルもある」という事じゃないとします。 変更前: set res = union(res, h.entirecolumn) 変更後: set res = union(res, h.mergearea.entirecolumn) セル結合していないシートで変更後のマクロを使っても問題ありません。
お礼
やりたいことが全て出来るようになりました。 本当にありがとうございました。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 外しているかもしれませんが・・・ たたき台としてです。 Private Sub CommandButton1_Click() Dim k As Long, j As Long, cnt As Long Dim wS As Worksheet Dim str str = TextBox1.Value j = Worksheets(1).Cells(1, Columns.Count).End(xlToLeft).Column If j > 2 Then Range(Worksheets(1).Columns(3), Worksheets(1).Columns(j)).ClearContents End If cnt = 2 For k = 2 To Worksheets.Count Set wS = Worksheets(k) For j = 1 To wS.Cells(1, Columns.Count).End(xlToLeft).Column If TextBox1 = "" Then MsgBox "検索データを入力してください。", vbExclamation TextBox1.SetFocus Exit Sub Else If WorksheetFunction.CountIf(wS.Columns(j), str) Then cnt = cnt + 1 wS.Columns(j).Copy Worksheets(1).Columns(cnt) End If End If Next j Next k End Sub ※ 条件としてSheet2以降の表は1行目に項目など何らかのデータが入っているという前提です。 (1行目で各Sheetの最終列を取得しているため) こんな感じではどうでしょうか?m(_ _)m
お礼
説明不足な点も多く申し訳ありません。 検索・抽出と望む内容で実行することが出来ました。 ありがとうございました。
お礼
説明不足な点は補足させていただきました(質問まで付属してしまっていますが;) 解説付のマクロだったので、とてもわかりやすかったです。 動作も全く問題ありませんでした。 本当にありがとうございました。
補足
説明不足で申し訳ありません。 ・列と行は言い間違えてません、大丈夫です。 ・貼り付け先のSheet1には検索ボタン以外の情報はありません。 Sheet1のC1から抽出内容が貼付される現在の形で問題ありま せん。 ・貼り付け先の掃除はすっかり忘れていて全く頭にありませんでした。 マクロに含めていただいて、ありがたかったです。 ・内容については具体的には言えませんが、文字・数字・画像が列に並んで表示されている形です。 (抽象的な言い方で大変申し訳ないです・・・) ・全シート、1行目はきっちりと埋まっています。 質問なのですが・・・ 画像も使用しているため、掃除の際に画像だけ残ってしまいます。 画像までオールクリアする方法もあるのでしょうか? また、現在はセル結合を使用していませんが、隣列と部分的にセルの結合を行った場合、両列同時に検索・抽出することは可能なのでしょうか?