- ベストアンサー
エクセルで複数シートに対してマクロで非表示
エクセルで全シート(約100シートあります)に同じ様なフォーマットのシートがあります。 表示されている全てのシートに対し、指定する列(A)の計算結果値が指定する条件(例えば”1”)に合致する行をマクロで一括して非表示にしたいので、ご教示のほどよろしくお願い致します。 また同時に、全シートで非表示化された行を元に戻す(表示させる)コードも併せて 教えて下さい。 各シート毎に不要な行がそれぞれ大量にあり、困っておりますので、よろしくお願い致します。 エクセルは2007です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ここでデバッグメッセージが出てしまいます。 それは、ご相談に掲示されている >エクセルで全シート(約100シートあります)に同じ様なフォーマットのシートがあります。 という状況説明が、ウソか又は間違いなのが原因です。 具体的な正しい状況説明ができないのでしたら、回答したすべてのマクロについて 高速で最も簡単: sub macro1() on error resume next 以下同じ 中速: sub macro2() on error resume next 以下同じ 最低速: sub macro3() on error resume next 以下同じ のように、それぞれ正しく間違えないように修正してください。
その他の回答 (2)
- keithin
- ベストアンサー率66% (5278/7941)
>不要な行がそれぞれ大量にあり、困っております 高速で最も簡単: sub macro1() dim w as worksheet for each w in worksheets w.autofiltermode = false w.range("A:A").autofilter field:=1, criteria1:="<>1" next end sub sub macro1r() dim w as worksheet for each w in worksheets w.autofiltermode = false next end sub 中速: sub macro2() dim w as worksheet dim c as range for each w in worksheets w.rows.hidden = false do set c = w.range("A:A").find(what:=1, lookin:=xlvalues, lookat:=xlwhole) if c is nothing then exit do c.entirerow.hidden = true loop next end sub sub macro2r() dim w as worksheet for each w in worksheets w.rows.hidden = false next end sub 最低速: sub macro3() dim w as worksheet dim h as range for each w in worksheets for each h in w.range("A1:A" & w.range("A65536").end(xlup).row) h.entirerow.hidden = h = 1 next next end sub sub macro3r() dim w as worksheet for each w in worksheets w.rows.hidden = false next end sub
補足
早速回答頂きましてどうもありがとうございました。 色々と試していますが、データが相当重い様です。 「高速で最も簡単」を実行させてみたいのですが、 w.range("A:A").autofilter field:=1, criteria1:="<>1" ここでデバッグメッセージが出てしまいます。 再度お助け頂けますでしょうか? よろしくお願い致します。
- mar00
- ベストアンサー率36% (158/430)
A列が1の時、行を非表示にする Sub Macro1() For i = 1 To Sheets.Count For j = 1 To Sheets(i).Cells(Rows.Count, "A").End(xlUp).Row If Sheets(i).Range("A" & j) = 1 Then Sheets(i).Range("A" & j).EntireRow.Hidden = True End If Next j Next i End Sub 全シート元にもどす Sub Macro2() For i = 1 To Sheets.Count Sheets(i).Cells.EntireRow.Hidden = False Next i End Sub こんな感じです。
お礼
keithin様 今回希望通りの結果になり、大変助かりました。 他のコードだと数時間かかりましたので、 高速処理は本当に助かります。 無駄な手作業が省かれ、本当に感謝致します。 どうもありがとうございました。
補足
再度のご回答どうもありがとうございました。 また状況説明が至らず申し訳ありませんでした。。 結果としまして、 「高速で最も簡単」に、 "sub macro1() on error resume next" を追加しまして、仰るとおりこれが最も高速に処理完了しました。 大感謝です! 他のコードだと数時間かかっていたところ、測っていませんでしたが、 20分かからずに終わっていると思います。 ちなみに、表示されている同じレイアウトのシートが97シートありますが、 他に非表示にしている違うレイアウトのシートが先頭に9シートありました。 当初だと非表示にしてあるシートで引っかかってしまったのでしょうか。 今回希望通りの処理が出来、大変満足しています。 どうもありがとうございました。