• ベストアンサー

マクロ・複数シートに適用するには?

初心者です。以下のマクロを組みました。 これを複数シートに適用するにはどうしたらよいのでしょうか? worksheets selectではうまくいきませんでした>< 具体的には1~80までのシートが数字で分けられており、 「目次」と「新規」以外の全てに適用したいです。 Sub Macro3() Dim sl As String Dim mySht As Worksheet sl = Range("A65536").End(xlUp).Address Range("B1", sl).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True For Each mySht In Worksheets Next End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

元のコードを直してみました。 '------------------------------------------- Sub Macro3r()   Dim sl As Range   Dim mySht As Worksheet   For Each mySht In Worksheets     With mySht       If .Name <> "目次" And .Name <> "新規" Then         Set sl = .Range("A65536").End(xlUp)         .Range("B1", sl).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True       End If     End With   Next End Sub '------------------------------------------- ''以下は、私の書き方です。 ''標準モジュール '------------------------------------------- Sub Test1()   Dim mySht As Worksheet   Dim r As Range   Const bOPN As Boolean = True 'True=隠す, False=戻す      For Each sh In ActiveWorkbook.Worksheets     With sh       If Not (.Name Like "目次" Or .Name Like "新規") Then         On Error Resume Next 'ブランクセルを探すためには、これが必要         Set r = .Range("B1", .Cells(Rows.Count, 1).End(xlUp)) _         .SpecialCells(xlCellTypeBlanks)         If Not r Is Nothing Then           r.EntireRow.Hidden = bOPN         End If         On Error GoTo 0       End If     End With   Next End Sub '========================================= Name やCell, Rangeプロパティの前には、すべて、「.(カンマ)」が入って、With ステートメントで、親オブジェクトを指定しています。 このように、SpecialCells(xlCellTypeBlanks)は、Blank がない場合を想定しなければなりませんが、Blankがない場合は、「実行時エラー」が発生します。それに、On Error Resume Next が必要になります。 また、最後に、r オブジェクトの開放はしていませんが、この程度は、あまり気にしなくて良いです。 なお、本来のコードのB1 ~A列の最後までというのは、少しヘンですね。 B列なら、 Set r = .Range("B1", .Cells(Rows.Count, 1).End(xlUp).Offset(, 1)) _ このようになります。 Rangeの引数は、"B1"の文字列でよいですが、もうひとつの範囲の引数は、オブジェクトで構いません。

その他の回答 (3)

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

再掲: >「どのシートの」セルを使っているのか,マクロの隅々まで良く目を光らせて >間違えないよう気を付けます。 この書きぶりは間違いです: >Range("B1", sl).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True  ↑  ↑  ↑ 最初のrange,中に書いた"B1",そしてslと3箇所,明示的にシートを指定していないのでアクティブシートだけを対象に(シートの枚数の回数を)ぐるぐると同じ事を繰り返しています。 しかも特に「("B1", sl)」と書いた部分は,省略した書き方を変な風に憶えて使っているので,ますます間違いに気づきにくくなっています。 解決策は回答したとおりですが, >これにすると隠れて欲しくないところまで隠れてしまいました どのような不都合があったのか,問題点を具体的なエクセルの姿としてはっきり教えてください。 また,回答されたマクロの文言をコピーして問い返すのではなく,  必 ず  あなたが実際に動かして失敗したマクロをコピーして改めて掲示し,写し間違いや読み取り間違いで余計なミスを抱えていないかもチェックしてもらうよう気を付けるようなさってください。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>s.range("B1:B" & s.range("A65536").end(xlup).row).entirerow.hidden = true >これにすると隠れて欲しくないところまで隠れてしまいました> 質問ではB1からA列の最終行までだったのでは >sl = Range("A65536").End(xlUp).Address >Range("B1", sl).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True >s.range("B1:B" & s.range("A65536").end(xlup).row).entirerow.hidden = true ↓ s.Range("B1", s.Range("A65536").End(xlUp)).EntireRow.Hidden = True

utayuta
質問者

補足

ありがとうございます。 言葉が足りずすみません>< B列にある空白行を隠すという設定にしたいので sl = Range("A65536").End(xlUp).Address Range("B1", sl).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True これは合っているようです。。 ですが、一つのシートにしか適用されず困っております><

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

sub macro3r1()  dim s as worksheet  for each s in worksheets   if s.name <> "目次" and s.name <> "新規" then    s.range("B1:B" & s.range("A65536").end(xlup).row).entirerow.hidden = true   end if  next end sub みたいな。 #「どのシートの」セルを使っているのか,マクロの隅々まで良く目を光らせて間違えないよう気を付けます。

utayuta
質問者

補足

ありがとうございます。 以下のようにしたのですが、一つのシートにしか適用されませんでした><どこが悪いのでしょうか? Dim sl As String For Each s In Worksheets If s.Name <> "目次" And s.Name <> "新規" Then sl = Range("A65536").End(xlUp).Address Range("B1", sl).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True End If Next End Sub あと、 s.range("B1:B" & s.range("A65536").end(xlup).row).entirerow.hidden = true これにすると隠れて欲しくないところまで隠れてしまいました><

関連するQ&A

  • マクロ 複数のシートに適用する記述がわかりません

    いつも皆様方にはたいへんお世話になっております。 下記のマクロをシート3~33(同じ構造です)まで、適用したいのですが、一つ一つのシートに貼り付けていけばよいのですが、なんとか一つの記述で出来ないかと、以前この質問コーナーでの回答を寄せ集めて、記述したのですが、コンパイルエラーばかりで、どうにもなりません。 こんな初歩的なことは、最小限の勉強で解決出来るのかも知れませんが、どうにもなりません。 誠に恐縮ですが、下記の記述の「どこを」「どの様に」修正したらよいか、どなたか解る方、教えて頂けないでしょうか。 どうぞ、よろしくお願いいたします。 Private Sub worksheet_change(ByVal Target As Excel.Range) Dim sheetno As Integer          ←この3行を当てずっぽうで挿入してみました><; For sheetno = 3 To 33 Worksheets(sheetno).Select h As Range Set Target = Application.Intersect(Target, Range("E5:N12, E14:N22, E24:N28, E30:N34")) On Error Resume Next For Each h In Target If h <> "" Then Application.EnableEvents = False h = Application.VLookup(h.Value, Worksheets("マクロリスト表").Range("A:B"), 2, False) Application.EnableEvents = True End If Next End Sub

  • EXCELマクロでシート作成&シート名をつける方法

    EXCELでセルK列に入力した名称でシートをどんどん作成したいのですが、 下記のようにやってみましたが、うまく実行されません。 2回目の←の部分で、終わってしまいます。 詳しい方、教えてください。 Sub Macro3() Dim neSheet As String Dim fMax As Integer Dim num As Integer Dim i As Integer fMax = Range("B2").Value num = 2 For i = 1 To fMax neSheet = Range("k" & num).Value Worksheets.Add(After:=Worksheets(1)).Name = neSheet ← num = num + 1 Next i End Sub

  • VBA オートフィルタで抽出したものを連続貼り付け

    下記のように情報が100近くまで存在した場合に、オートフィルターで一つずつ抽出したものをコピーし、新規シートに貼り付けたいのですが、どうすれば良いのでしょうか? 1 1 1 2 2 2 3 3 3 たとえばシート1に 1 1 1     シート2に 2 2 2 といったように処理したいので、教えて下さい。 vbaの参考書とサンプルを見て下記のように作成したのですが上手くいきません。 どんな本を読めば作成出来るようになるのかわからず、質問させていただきました。 ub オートフィルター() Dim myRng As Range Dim mySht As Worksheet Set myRng = _ Worksheets(1).Range("A1").CurrentRegion With Worksheets Set mySht = .Add(after:=.Item(.Count)) End With With myRng .AutoFilter field:=1, Criteria1:=8 On Error Resume Next .Resize(.Rows.Count - 1).Offset(1).Copy mySht.Range("A1") .SpecialCells(xlCellTypeVisible).Copy mySht.Range("A1").AutoFilter mySht.Range("A1").AutoFilter If Err.Number <> 0 Then Application.DisplayAlerts = False mySht.Delete Application.DisplayAlerts = True End If On Error GoTo 0 End With Set myRng = Nothing Set mySht = Nothing End Sub

  • マクロ 別シートへコピー

    いつも回答して頂きありがとうございます。 Worksheets("一覧").Paste Range("C3")と記述したら、エラーもかからずうまく貼り付け出来るが、 Worksheets("一覧").Paste Range(Cells(d,3))と記述したらエラーが発生してしまします。どうしたら上手くいくでしょうか? 下記に作成中のマクロを記載しておきます。 御指導の方よろしくお願いいたします。 Sub シートを繰り返し選択する(2)() Dim d As Integer Dim cVx As Integer d = 3 cVx = Range("IV7").End(xlToLeft).Column Worksheets(Worksheets("一覧").Cells(d, 2).Value).Range("C7:X7").Copy Worksheets("一覧").Paste Range(Cells(d, 3)) End Sub

  • エクセルVBAで作ったコードを実行しても動作しない

    エクセルVBAで『データワン』シートと『データツー』シートと『まとめ』シートがあり、 『データワン』シートと『データツー』シートの全ての情報を 『まとめ』シートにコピーしてまとめるようにしました。 マクロを実行するには、Visual Basicを開いてF5を押しています。 それを『データワン』シートか『データツー』シートの中身の一部分でも変更すると そのときに自動的にマクロが実行されるようにしたいです。 Microsoft Excel Objectsのsheet1とsheet2(sheet3は空白のまま)に Private Sub worksheet_change(ByVal Target As Excel.Range) Call macro1 End Sub を入れ、 次に、標準モジュールのModule1に Sub macro1() With Worksheets("まとめ") .Cells.ClearContents On Error Resume Next Worksheets("データワン").Range("C1:BE50").SpecialCells(xlCellTypeConstants).EntireRow.Copy _ Destination:=.Range("A1") Worksheets("データツー").Range("C1:BE100").SpecialCells(xlCellTypeConstants).EntireRow.Copy _ Destination:=.Range("A" & .UsedRange.Rows.Count + 1) End With End Sub を入れました。 『データワン』シートと『データツー』シートの情報を書き換えても 手動でマクロを実行してみましたが、何も起こりません。 書き方が間違っているのでしょうか?

  • エクセルで型番ごとにワークシートをマクロで作る方法

    昨日に質問させて頂いたものですが、下記のマクロを教えて頂いたのですが 新しく生成された型番のワークシートが抜けていたり、最後まで型番が生成されない状態です。 なにか間違っていたら直して頂ける方お願いします。 Sub macro4()  Dim h As Range  Dim w As Worksheet  Dim i As Long, e As Long  Application.ScreenUpdating = False  Application.CutCopyMode = False ’準備  Set w = ActiveSheet  w.Range("4:4").Insert shift:=xlShiftDown  e = Range("B65536").End(xlUp).Offset(1).Row  Range("B4").Select ’複写  Do   ActiveSheet.Copy after:=ActiveSheet   Selection.EntireRow.Delete shift:=xlShiftUp  Loop Until ActiveCell.Offset(1) = "" ’片付け  For i = ActiveSheet.Index To w.Index + 1 Step -1  With Worksheets(i)  .Range(.Range("B4").Offset(1), .Cells(e, "B")).EntireRow.Delete shift:=xlShiftUp  End With  Next i  w.Rows(4).Delete  Application.ScreenUpdating = True End Sub http://okwave.jp/qa/q7081084.html

  • Excel 偶数番シートのA列が空白であるセル削除

    Excel の1つのファイル内の偶数番シートのA列が空白であるセルを行ごと削除したいのですが、下のコードではうまく動かないです。 シート番号はSheet(2)から(90)までです。 Sub 空白行削除() Dim i For i = 2 To 90 Step 2 Worksheets(i).Activate Columns("A:A").Select Selection.SpecialCells(xlCellTypeBlanks).Select Selection.EntireRow.Delete Next i End Sub

  • セルの値をシート名にするエクセルVBA

    件名のVBAを以下のように書きました B列の4からずっと下までのセルの値を次々とシート「ひな型」をコピーし増やしていくものです。 Sub テスト() ' ' Macro ' ' Dim target As Range Dim h As Range '見えてるセルを取得する。「全部隠れていた」場合も考える。 On Error Resume Next Set target = Worksheets("Sheet1").Range("B4:B" & Worksheets("Sheet1").Range("B65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible) If target Is Nothing Then Exit Sub 'シートを増やしていく For Each h In target On Error GoTo errhandle Worksheets(CStr(h.Value)).Select On Error GoTo 0 Next Sheets("Sheet1").Select Exit Sub errhandle: Worksheets("ひな型").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = h.Value Resume End Sub これだと、一応思った通りにはなるのですが B列のセルに複数同じ名前があった時に、既に作ったシートの名前がある場合 それは無視するという風に実行したいです お知恵をお貸しくださいませ

  • 作ったマクロを複数のシートで実行できるようにしたい。

    excelで以下のマクロを作りました。 Sub Macro1()   Dim 文字 As Range   For Each 文字 In Range("e6:ai21")    Select Case 文字.Text     Case "|"      文字.Font.Name = "MS Pゴシック"      文字.Font.Size = 35     Case Else      文字.Font.Name = "MS明朝"      文字.Font.Size = 11    End Select    Next 文字   End Sub 1つのシートのセル範囲(e6:ai21)に対するマクロです。 このマクロを、シートが10個(sheet1~sheet10)ありその内の8個(sheet3~sheet10に1度にできるようにするにはどうすればいいのですか。 教えてください。よろしくお願いします。

  • シート名変更マクロ

    「1」というシートのH4にコピー数を入力し、「1」の後ろに挿入するマクロがあります。できたシートの名前は「1(2)」「1(3)」となってしまいます。このシート名を挿入した数の通し番号(「2」「3」に変更することはできるのでしょうか?挿入するシートの数は決まっていません。 Sub シートのコピー() Dim i As Integer Dim n As Integer n = Worksheets("1").Range("H4").Value For i = 1 To n Worksheets("1").Copy Before:=Worksheets(Sheets.Count) Next i End Sub

専門家に質問してみよう