• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelで全シートから検索し列で抽出する方法)

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

このQ&Aのポイント
  • Excel2010で表をマクロで検索・抽出する方法について教えてください。
  • Sheet1に作成した検索ボタンを押すと検索フォームが表示されます。
  • 検索フォームのテキストボックスに入力した文字を基に、各シートから列を抽出します。

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

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

>検索でヒットしたセルの列全てを抽出(複数ある場合は複数の列が抽出される)。 言わずもがなですが、「列」と「行」を言い間違えてはいませんね? 各シートごとに、検索とヒットしたセルをまとめて確保、一気にコピーする事でダブりを防止します。 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行目がきっちり埋まっている」といった、少しでも手掛かりになりそうな目に見える情報があれば、もうちょっと簡単なマクロにする事もできました。

himuro07
質問者

お礼

説明不足な点は補足させていただきました(質問まで付属してしまっていますが;) 解説付のマクロだったので、とてもわかりやすかったです。 動作も全く問題ありませんでした。 本当にありがとうございました。

himuro07
質問者

補足

説明不足で申し訳ありません。 ・列と行は言い間違えてません、大丈夫です。 ・貼り付け先のSheet1には検索ボタン以外の情報はありません。  Sheet1のC1から抽出内容が貼付される現在の形で問題ありま せん。 ・貼り付け先の掃除はすっかり忘れていて全く頭にありませんでした。  マクロに含めていただいて、ありがたかったです。 ・内容については具体的には言えませんが、文字・数字・画像が列に並んで表示されている形です。 (抽象的な言い方で大変申し訳ないです・・・) ・全シート、1行目はきっちりと埋まっています。 質問なのですが・・・ 画像も使用しているため、掃除の際に画像だけ残ってしまいます。 画像までオールクリアする方法もあるのでしょうか? また、現在はセル結合を使用していませんが、隣列と部分的にセルの結合を行った場合、両列同時に検索・抽出することは可能なのでしょうか?

その他の回答 (2)

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

>画像 それは想定外でしたが、あなたの言ってる「画像」と、シートの左上に置いてある「ボタン」などの区別がちゃんと付いているか心配します。 きちんと文字通り使い分けが理解できているのでしたら、掃除ブロックに activesheet.pictures.delete と一行追記します。 言わずもがなですがボタンにも画像を使っていたら当然一緒に消しちゃいますし、そもそも「画像」じゃなく実は別のモノが置かれてたら、当然これではダメです。 >部分的にセルの結合 説明があいまいですが、「部分的に」とは「A列やC列には結合セルは無いけど、D列とE列は上から下まで隣同士セル結合している」という意味で、「ある列の途中で結合しているセルもある」という事じゃないとします。 変更前: set res = union(res, h.entirecolumn) 変更後: set res = union(res, h.mergearea.entirecolumn) セル結合していないシートで変更後のマクロを使っても問題ありません。

himuro07
質問者

お礼

やりたいことが全て出来るようになりました。 本当にありがとうございました。

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

こんばんは! 外しているかもしれませんが・・・ たたき台としてです。 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

himuro07
質問者

お礼

説明不足な点も多く申し訳ありません。 検索・抽出と望む内容で実行することが出来ました。 ありがとうございました。

関連するQ&A

専門家に質問してみよう