
現在Excel2010で作成している表をマクロで検索・抽出したいのですが、
素人のため中々思うように出来なくて困っています。
Sheet2~Sheet4まで作成した表があります。
Sheet1には検索ボタンを作成し、検索ボタンを押すと検索フォーム(ユーザーフォーム)が出てきます。
検索フォームはTextBox1とCommandButton1があります。
------ここまでは作成済みです--------
・検索フォームのTextBox1に入力した文字(半角全角英数関係なく)をCommandButton1で検索を行う。
・そしてその検索結果をSheet1の検索ボタン(セル A~B・1~2)を避けて表からコピーして抽出(複数ある場合は複数抽出)。
・抽出内容は、検索でヒットしたセルの列全てを抽出(複数ある場合は複数の列が抽出される)。
・同列に検索した文字が2つある場合も、抽出する列は1つ。
少しややこしいかもしれませんが、上記のようなマクロを作成したいのですが私では力が足りませんでした。
わかりやすく教えていただけると嬉しいです。
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行目がきっちり埋まっている」といった、少しでも手掛かりになりそうな目に見える情報があれば、もうちょっと簡単なマクロにする事もできました。
この回答への補足
説明不足で申し訳ありません。
・列と行は言い間違えてません、大丈夫です。
・貼り付け先のSheet1には検索ボタン以外の情報はありません。
Sheet1のC1から抽出内容が貼付される現在の形で問題ありま せん。
・貼り付け先の掃除はすっかり忘れていて全く頭にありませんでした。
マクロに含めていただいて、ありがたかったです。
・内容については具体的には言えませんが、文字・数字・画像が列に並んで表示されている形です。
(抽象的な言い方で大変申し訳ないです・・・)
・全シート、1行目はきっちりと埋まっています。
質問なのですが・・・
画像も使用しているため、掃除の際に画像だけ残ってしまいます。
画像までオールクリアする方法もあるのでしょうか?
また、現在はセル結合を使用していませんが、隣列と部分的にセルの結合を行った場合、両列同時に検索・抽出することは可能なのでしょうか?
説明不足な点は補足させていただきました(質問まで付属してしまっていますが;)
解説付のマクロだったので、とてもわかりやすかったです。
動作も全く問題ありませんでした。
本当にありがとうございました。
No.3
- 回答日時:
>画像
それは想定外でしたが、あなたの言ってる「画像」と、シートの左上に置いてある「ボタン」などの区別がちゃんと付いているか心配します。
きちんと文字通り使い分けが理解できているのでしたら、掃除ブロックに
activesheet.pictures.delete
と一行追記します。
言わずもがなですがボタンにも画像を使っていたら当然一緒に消しちゃいますし、そもそも「画像」じゃなく実は別のモノが置かれてたら、当然これではダメです。
>部分的にセルの結合
説明があいまいですが、「部分的に」とは「A列やC列には結合セルは無いけど、D列とE列は上から下まで隣同士セル結合している」という意味で、「ある列の途中で結合しているセルもある」という事じゃないとします。
変更前:
set res = union(res, h.entirecolumn)
変更後:
set res = union(res, h.mergearea.entirecolumn)
セル結合していないシートで変更後のマクロを使っても問題ありません。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VLOOKUP FALSEのこと
-
if関数の複数条件について
-
同じ名前(重複)かつ 日本 ア...
-
excel
-
【マクロ】数式を入力したい。...
-
表計算ソフトでの様式の呼称
-
空白のはずがSUBTOTAL関数でカ...
-
【関数】=EXACT(a1,b1) a1とb1...
-
【マクロ画像あり】❶1つの条件...
-
エクセルの文字数列関数と競馬...
-
【画像あり】【関数】指定した...
-
エクセルでフィルターした値を...
-
エクセルに写真が貼れない(フ...
-
エクセルのライセンスが分かり...
-
【関数】3つのセルの中で最新...
-
LibreOffice Clalc(またはエク...
-
【マクロ】excelファイルを開く...
-
【マクロ】【画像あり】❶ブック...
-
【マクロ】既存ファイルの名前...
-
【マクロ】【画像あり】4つの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
背景色の有無を判断をして別の...
-
エクセルのユーザー定義で
-
B列にA列の数字をかけた数字を...
-
VBA 動作の後、動作した行のA...
-
EXCELで2つの数値のうち大きい...
-
2つのエクセルのデータを同じよ...
-
PowerPointで表の1つの列だけ...
-
Excelで隣のセルと同じ内容に列...
-
エクセルで二つの数字の小さい...
-
エクセルでオートフィルタのボ...
-
Excelで半角の文字を含むセルを...
-
【画像あり】【関数】指定した...
-
エクセル(勝手に太字になる)
-
エクセルで時刻(8:00~20:00)...
-
エクセルで、2種類のデータを...
-
エクセルで最初のスペースまで...
-
エクセルのオートフィルタで最...
-
Excel、市から登録している住所...
-
エクセルの項目軸を左寄せにしたい
-
エクセルのセル内の文字の一部...
おすすめ情報