エクセルVBAで非表示シートがあるとエラーが発生する

このQ&Aのポイント
  • エクセルVBAを使用している際に、同一ブック内に非表示シートがあるとエラーが発生します。具体的には、特定のマクロを全てのシートで実行するVBAマクロを作成している場合、非表示シートが存在するとエラーが発生します。このエラーについての解決策として、非表示シートに対してもマクロを適応する方法や、一時的に非表示シートを表示しても良いが最終的には非表示にしたい場合の方法があります。
  • 非表示シートに対してもマクロを適応する場合は、マクロの実行時に非表示シートを一時的に表示する方法があります。具体的には、マクロの実行前に非表示シートの表示を行い、マクロの実行後に非表示シートを再度非表示にすることでエラーを回避できます。
  • また、非表示シートを表示することに問題がない場合は、非表示シートを常に表示状態にする方法も考えられます。この場合、マクロの実行前に全てのシートを表示し、マクロの実行後に非表示シートを再度非表示にすることでエラーを回避できます。ただし、非表示シートを常に表示しておくことで、シートの内容が知られる可能性があるため、セキュリティには注意が必要です。
回答を見る
  • ベストアンサー

エクセルVBA 非表示シートがあるとエラー

VBA初心者です。 エクセル2007を使用しております。 同一ブック内にある全てのシートで特定のマクロ(下記の例では×××)を実行するようにVBAマクロを個人用マクロブック上に作成しております。 Sub シート一括処理() Dim Sht As Worksheet For Each Sht In Worksheets Sht.Select Call ××× Next Sht End Sub ブック内に非表示シートがあった場合、エラーとなります。 ===================== 実行時エラー'1004' 'select'メソッドは失敗しました: ===================== 下記のような要件を満たすにはどのように修正すればよいでしょうか。 ・非表示シートに対しても、×××マクロは適応したい。 ・非表示シートは暫定的に表示してもよいが、最終的には非表示の状態にしたい。 よろしくお願いします。

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

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

推奨: XXXマクロの方を改修し、事前にセレクトとかしておかないでも実行できるマクロにします。 今のままの延長: セレクトしないとXXXが実行できないなら、表に出してセレクトするだけです。 sub macro1()  dim w as worksheet  dim v  application.screenupdating = false  for each w in worksheets   v = w.visible   w.visible = true   w.select   call XXX   w.visible = v  next  application.screenupdating = true end sub

4578up
質問者

お礼

「今のままの延長」の方で問題なく作動しました。 有難うございました。

関連するQ&A

  • マクロ 戻るボタンを押したらシートの1枚目に戻る

    各シートに「戻る」というボタンを作りましたが、 「ボタンを押したらシートの1枚目をアクティブにする」というマクロを付けたいです。 下記は、『「戻る」というマクロを2枚目のシート以降すべてに付ける』というマクロです。 このマクロの中に、各シートの「戻る」ボタンを押せば、シートの1枚目に戻るような 指示を入れたいです。 分かる方いましたら、お願いします。。。 ※下記のマクロは以前ご回答いただいたマクロを引用したものです。 /////////////////////////////////// Sub 戻るボタン設置() Dim Sht As Worksheet For Each Sht In Worksheets If Not Sht.Name = Worksheets(1).Name Then With Sht For i = 1 To 1 '幅140、高さ20のボタンを追加 .Buttons.Add(900 * i, 10, 140, 20).Text = "戻る" Next i End With End If Next Sht Sheets(1).Select End Sub

  • VBAの処理が途中で止まる

    エクセル2003です。 検索してヒットしました下記のVBAなのですが、処理結果は希望した状態になるものの、VBAが途中で止まってしまう状態になります。 正常に終了させるには、どうすればいいのでしょうか。 ■全てのシート(シート名任意)のアクティブセルをA1にする Sub auto_open() Dim r As Long, sh As Worksheet For Each sh In Worksheets sh.Activate ActiveSheet.Select r = Selection.Row ActiveWindow.SmallScroll Up:=r Cells(1, 1).Select Next End Sub ※実行すると5行目で止まり、実行時エラー1004 WorksheetクラスのSelectメソッドが失敗しました  と表示されます。

  • エクセルVBAで保護したシート内の書式設定を可能にしたい

    お世話になります。 『記入可能セルに記入させ、「送信」フォームを押すと、1箇所文字の色が変わり、添付されてメールで送られる。』というマクロを組みました。 その後、 シートがたくさんあるので、VBAを使って、一度にシートの保護、非保護を行いました。 以下はその記述文です。 Sub 保護() Dim Ws As Worksheet For Each Ws In Worksheets Ws.Protect Password:=111 Next End Sub Sub 保護解除() Dim Ws As Worksheet For Each Ws In Worksheets Ws.Unprotect Password:=111 Next End Sub この保護のマクロを使うと、記入可能なセルは、セルの書式設定の保護タブからチェックをはずしており全く問題ないのですが、 「色が変わる」という設定がエラーになります。 どのようにしたら、色が変わるのも許可されるマクロになるのでしょうか。 ご教示お願いいたします。

  • VBAですべてのワークシートを処理したい

    ブック内の全ワークシートに対して同じ処理をするために、 For each ワークシート in Worksheets ~処理~ Next ワークシート を使ってみたのですが、その時にアクティブになっているシートしか処理されません。たとえば次のようなシンプルなコードでも、同様です。何が抜けているのでしょうか。 Sub allworksheets() Dim WS As Worksheet For Each WS In Worksheets Range("a1") = "123" Next WS End Sub マクロの勉強を始めたばかりで、基本的なことでつまづいてます。よろしくお願い致します。

  • エクセルVBAでエラー、Changeの使い方が×?

    エクセルVBAでBOOK1のsheet1とsheet2とsheet3があり、 sheet1とsheet2の全ての情報をsheet3にコピーしてまとめるようにしました。 マクロを実行するには、Visual Basicを開いてF5を押しています。 それをsheet1かsheet2の中身の一部分でも変更すると そのときに自動的にマクロが実行されるようにしたいです。 sheet1とsheet2とsheet3に Private Sub Worksheet_Change(ByVal Target As Range) Call マクロ() End Sub を入れ、 標準モジュールに Sub マクロ() Workbooks("BOOK.xlsm").Worksheets("sheet1").Range("C1:BE50").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C1:BE50") Workbooks("BOOK.xlsm").Worksheets("sheet2").Range("C1:BE100").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C51:BE150") Dim UsedCell As Range Dim Max_Row, RowCount As Integer Set UsedCell = ActiveSheet.UsedRange Max_Row = UsedCell.Cells(UsedCell.Count).Row Application.ScreenUpdating = False For RowCount = Max_Row To 1 Step -1 If Application.WorksheetFunction.CountA(Rows(RowCount)) = 0 Then Rows(RowCount).Delete End If Next Application.ScreenUpdating = True End Sub をやって、sheet1かsheet2のセルを変更すると エクセルが固まってしまいます。 デバックでは最初の Workbooks("BOOK.xlsm").Worksheets("sheet1").Range("C1:BE50").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C1:BE50") がよくないようです。 書き方が間違っているのでしょうか?

  • 〖緊急〗エクセルのVBAについて質問です。

    エクセルのVBAを使用して、下記の動作を実行したいのですがうまくいきません。 おしえてください。 sheet1に移動したいシート名の一覧を作成し、一覧を参照してシートを移動したいです。 RangeにカーソルをあてるとA1に入力したシート名前が反映しているようなのですが・・・。 sheet1のセルA1に移動させたいシート名を入力しています。 Sub Worksheet() Worksheets(Range("A1")).Activate End Sub ※❝インデックスが有効範囲にありません❞とエラーがでます。 ※同一のBOOK内での作業です。 よろしくおねがいします。

  • エクセルマクロ 全シートに図の挿入をしたい

    初心者です。よろしくお願いします。 エクセル2007 bookはxsl(互換表示で開いています) 200シートくらいある請求書です。全シートの同じ場所に角印を押したいです。 自分で考えたコードは1シート目の名前を"FACE"に変え印("Picture 4")を貼りつけておきます。 これだとSheets("FACE")に2個目の印が押されてしまいます。 印押しBook.xslのシート1に請求書の雛形と印を用意しておいて マクロを動かすと請求書Book.xslの全シートに印が押されるものが作れますか? Sub 印押しマクロ2() Dim myTop As Single, myLeft As Single myTop = Sheets("FACE").Shapes("Picture 4").Top myLeft = Sheets("FACE").Shapes("Picture 4").Left Sheets("FACE").Shapes("Picture 4").Copy Dim Sht As Worksheet For Each Sht In Worksheets Sht.Select     ActiveSheet.Paste     ActiveSheet.Shapes("Picture 4").Top = myTop     ActiveSheet.Shapes("Picture 4").Left = myLeft Next Sht End Sub

  • Excel シートの保護 VBA

    「データ」、「A」という名称の2つのシートを ブック起動時にパスワードつきで保護したいと考えています。 また、マクロ(VBAのフォーム?)のみで更新できるようにしたいとも考えています。 Dim sheet1 As Worksheet Set sheet1 = Worksheets("データ") sheet1.Protect Password:="pass", _ AllowFormattingCells:=True 上記のやり方があると見たので、 ThisWorkBookに貼り付けて保存し、再起動してみたのですが 普通に、「データ」のシートに書き込めてしまいます。 何もエラーも出ないため、どう考えればよいのかも分かりません。 回答よろしくお願い致します。

  • Excel VBA 非表示の別ブックへシートコピー

    Excel2010のVBAで、別のExcelブックを非表示で開いて、 シートをコピーすると、 「実行時エラー'1004':WorksheetクラスのCopyメソッドが失敗しました。」 というエラーが出て、正しくシートをコピーすることができません。 (1)のように自分のブックへはシートをコピーすることはできるのですが、 (2)のように別のExcelブック上でシートをコピーする場合と (3)のように別のExcelブック上にシートをコピーする場合の いずれも同様のエラーになります。 どのように記述すれば(2)と(3)でもコピーすることができるのでしょうか。 ------------------------------------------------------------- Sub test()  Dim newEx As Excel.Workbook  Dim newFile As String  newFile = ThisWorkbook.Path & "\New_Book.xlsx"  Set newEx = Workbooks.Open(newFile, UpdateLinks:=0)  Application.Windows("New_Book.xlsx").Visible = False  '(1)New_BookのSheet3を自分のブックにコピーする (正常)  newEx.Worksheets("Sheet3").Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)  '(2)New_BookのSheet3をNew_Bookにコピーする (エラー)  newEx.Worksheets("Sheet3").Copy after:=newEx.Sheets(newEx.Sheets.Count)  '(3)自分のブックのSheet3をNew_Bookにコピーする (エラー)  ThisWorkbook.Worksheets("Sheet3").Copy after:=newEx.Sheets(newEx.Sheets.Count)  Application.Windows("New_Book.xlsx").Visible = True  Application.DisplayAlerts = False  newEx.Save  newEx.Close  Application.DisplayAlerts = True  Set newEx = Nothing End Sub -------------------------------------------------------------

  • エクセルVBA シートがアクティブではないのに画面に表示される?

    下記のSub test01のマクロでは、画面は常に最初のシートのままで全シートに作業が行なわれます。 ところが、同じマクロですが単にシートを保護するという1行を追加すると(それがSub test02です。)、画面が各シートに切り替わるようになるのです。 しかし、保護されてないシートにSub test02をはしらせると、最初の一回は画面は常に最初のシートのままで全シートに作業が行なわれ、その結果全シートが保護された状態になってから再度実行すると、画面が切り替わるのです。同様に、保護されたシートにSub test01を実行しても画面が切り替わります。 しかし不思議な事に、アクティブなシート名を表示させるようにしたステータスバーには常に最初のシート名しか表示されません。つまりシートがアクティブではないのに画面に表示されるようです。 もちろんScreenUpdatingをFalseにすれば画面が切り替わらなくなるのは存じておりますが、疑問なのはなぜシートがアクティブではないのに画面に表示されるのか?(しかもシートを保護あるいは保護解除する場合に限って)ということです。 どうか、ご教示下さい。 Sub test01() For Each st In Worksheets Application.StatusBar = ActiveSheet.Name st.Unprotect With st.Range("E5") For i = 50000 To 1 Step -500 .Value = Int(i / 500) Next i End With Next st End Sub Sub test02() For Each st In Worksheets Application.StatusBar = ActiveSheet.Name st.Unprotect With st.Range("E5") For i = 50000 To 1 Step -500 .Value = Int(i / 500) Next i End With st.Protect Next st End Sub

専門家に質問してみよう