VBAでのブック・シートの保護・解除方法

このQ&Aのポイント
  • エクセル2010のVBAでブックとシートの保護・解除をする方法を教えてください。
  • VBAではシートの削除や作成、コピーなどを行っているため、VBA実行時のみ保護を解除したいです。
  • 対象のシートには保護を解除して入力したい項目があり、VBA終了時には再度保護をかけたいです。
回答を見る
  • ベストアンサー

VBAでのブック・シートの保護・解除について

エクセル2010のVBAでのブック、シートの保護&解除の方法について教えて頂きたく、 質問させて頂きます。 消されては困るシートや数式がある関係で、ブックオープン時にVBAでブックとシートにそれぞれパスワードをかけて保護しています。 VBAではシートの削除、作成、コピーなどを行っているため、VBA実行時のみ、保護を解除させるようにしたいと思います。 ただ、対象のシート自体にも入力したい項目があるため、その箇所については保護を解除しておく必要があります。 そして、VBA実行後、再度、その箇所以外にパスワードで保護をかけ直します。 イメージとしては下記のような流れになります。 対象ブック:ブックA 対象シート:シート1 パスワード:1234(それぞれ) 常時保護を解除しておきたいセル:range("A6:H106") 1.(オープン時には、)ブック保護&特定のセル以外のシート保護 2.VBA実行時には全ての保護解除 3.VBA終了時に、1の状態に戻る どうぞよろしくお願い致します。

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

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

>worksheetクラスのvisibleプロパティを設定 そういうお話はありませんでしたが。典型的な二度手間ですね。 「ブックの保護」された状態のブックでは、シートの表示・非表示を操作することは当然できません。 この部分では、回答した「シートの保護」のようには、マクロ側で回避する手段はありません。 元のご相談で書かれている通り、 >VBA実行時のみ、保護を解除させるようにしたい 素直に「VBAで(対象の/問題となる)操作をする際に」そのようにしてください。 作成例: private sub Workbook_Open()  dim i as integer  for i = 1 to 3   worksheets(i).protect password:=1234, userinterfaceonly:=true  next i  thisworkbook.unprotect password:=1234  for i = 4 to 20   worksheets(i).visible = xlsheethidden  next i  thisworkbook.protect password:=1234 end sub

Hiroron12
質問者

お礼

ありがとうございました。 無事に動かすことができました。 しっかりやりたいことを考えてやらないといけないですね。 頑張りたいと思います。 ありがとうございました!

その他の回答 (1)

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

保護する必要が無いA6:H106については、マクロ以前の問題として、セルの書式設定の保護でロックのチェックを外しておきます。 やるべきこと: 1.保護する必要が無いセル範囲のロックを外して置く 2.ブックを開いた際にブックの保護、並びに「手動操作に対する」シートの保護をマクロで行う 以上です。 ブックAのThisWorkbook: private sub Workbook_Open()  worksheets("Sheet1").protect password:=1234, Userinterfaceonly:=true  thisworkbook.protect password:=1234 end sub 一応念のため繰り返しておきますが、「VBAの実行時」に「シートの保護をわざわざ解除」する必要はありません。

Hiroron12
質問者

お礼

ご回答ありがとうございます! ロックを外したいセルにまでロックがかかっていました。。 教えて頂いた内容を参考に書いてみたところ、無事に保護をかけることができたにですが、 「実行時エラー'1004':worksheetクラスのvisibleプロパティを設定できません」 と出てしまいました。 ↓が実際にブックAのThisbookに書いた内容になります。 シートは全部で20シートあり、保護をかけたいシート(sheet1、2、3)は左から3つ順に並んでいます。 Private Sub Workbook_Open() Dim i As Integer For i = 4 To 20 Sheets(i).Visible = xlSheetHidden Next 'ワークブックの保護 ThisWorkbook.Protect Password:="1234" 'ワークシートの保護 .Worksheets("sheet1").Protect Password:="1234", userinterfaceonly:=True .Worksheets("sheet2").Protect Password:="1234", userinterfaceonly:=True .Worksheets("sheet3").Protect Password:="1234", userinterfaceonly:=True End Sub 他にも↓のような 内容で書いて見たのですが、 モジュール内でコンパイルエラーが発生しました~のようなエラーが出てしまいます。 Dim ws as worksheet Dim wsname as string Set wsname ="sheet1" or "sheet2" or "sheet3" For each ws in thisworkbook.worksheets If ws.name = wsname then Sheets(ws).Visible = xlSheetHidden next 以下、同じ どのように書けばエラー無く処理出来るか、教えて頂けませんでしょうか。 宜しくお願い致します。

関連するQ&A

  • エクセルVBAで保護シートの数式取得

    ワークシートが保護されていても、そのセルA1にある数式をVBAで取得する場合 Sub test01() MsgBox Sheets("Sheet1").Range("A1").Formula End Sub でできます。 しかし、このセルが書式設定で、「保護」→「表示しない」にチェックをいれられていると「実行時エラー1004」となり取得できません。 パスワードがわかっていれば保護を解除して問題はないのですが、わからない場合、数式を取得する方法はないでしょうか?

  • シートの保護について

    Excel2000のVBAについて質問です。 シートの保護をした状態で、可視セルを範囲指定しよう思い下記コードを 実行すると、シートの保護の解除を求められます。 Range("A1:A65536").SpecialCells(xlCellTypeVisible).Select シートの保護をしたまま、可視セルを指定することはできないのでしょう か?

  • シートをまとめて保護・解除したい

    エクセル97、2000を使っています。 エクセルもシートが多くなると、その保護と解除が面倒で困っています。 いちいちシートを選択して保護と解除をしなければなりません。 マクロなどを使わずに、全てのシートを一度に保護・解除する方法はないでしょうか。シートの中にも保護してるセルとそうでないセルがあるので ブックを保護するわけにもいきません。

  • エクセルシートのパスワード保護について

    十数枚のシートを持つエクセルのブックがあります。 ブックとそれぞれのシートにパスワード保護が必要です。しかし、週に1度はパスワードを解除する必要があります。これが毎週のことなので、それぞれのシートごとに解除し、また設定するのはとても時間がかかり負担です。特定の個所だけならセルのロックをはずしておけばいいのでしょうが、そうではありません。 パスワード保護を全部のシートに一度に解除したり設定する方法はないものでしょうか? なお、エクセルのバージョンは97です。

  • エクセルVBA シートの保護について

    エクセルの「シートの保護」について教えてください。 特定のシートのみ、保護したいと思っています。 そのシートの一定の範囲には、入力のみを許可したいです。 というのも、他の範囲(保護したい範囲)には、数式やvbaが設定されており、むやみやたらに「切り取り」や「行や列の削除」をされると困るからです。 そこで、 入力を許可する範囲を選択 →セルの書式設定 →保護のロックを外す →シートの保護 →「ロックされていないセル範囲を選択」を選択 しました。 この状態でマクロを実行すると、エラー1004(保護されたシートに対してこのコマンドは使用できません)とエラーが出ました。 エラー箇所は以下のとおりです。 Intersect(Worksheets("sheet1").Range("C5").CurrentRegion, Worksheets("sheet1").Rows("5:65536"), Worksheets("sheet1").Columns("C:T")).Select (質問1) ロックを外し、その後にシートの保護をする際、「全範囲を選択してから」シートの保護を行うものなのでしょうか。 それともシートの保護をすれば、自動的に、ロックを解除した範囲以外(全範囲)で保護したことになるのでしょうか。 「全範囲を選択してから」シートの保護をすると、ロックを外したセルを選択しても、アクティブセルが罫線で囲われずどこを選んでいるのか分からなくなってしまったので。 もし、あえて全範囲を選択する必要がないなら、それでいこうと思っています。 (質問2) 上記エラーを解消するには、どうしたら良いのでしょうか。 全範囲を選択できないように保護していることが原因かと思い、全範囲について「シートの保護→ロックされたセル範囲の選択」を選んでもエラー解除できませんでした。 また、Intersect.Selectの一行上に「ThisWorkbook.Unprotect」と追加しても解除できませんでした。 2つも質問して申し訳ありませんが、ご存知の方はご教授お願いします。 よろしくお願いします。

  • シートが保護されていないのに保護を解除して下さいと

    Excel 2003です。 シートが保護されていないのに、保護を解除して下さいと出て、コマンドが実行できません。 メニューより[書式]→[スタイル]で、不要な書式を削除したいのですが、削除出来ません。 それまでに、行っていた作業は、ブックが増えすぎて、まとめようと、シートのコピー(シート名タブで右クリック→移動またはコピーする)を行いました。 その後、各シートへのハイパーリンクをメニュー用として新しく作ろうと、ネットで見かけたコードを引用して、実行してから、不要な書式が登録されてしまいました。 不要な書式が登録されたのに気付いたのは、新しくシートを追加し、1シートだけなのでコマンドでハイパーリンクを設定したら、フォントサイズが小さく(正常な他のブックでは、11ポイントですが、8.5ポイント)なり、[書式]→[スタイル]→スタイル名欄の右横の下向き三角形のボタンをクリックしたらハイパーリンクがあり、これを削除しようとしたら、シートが保護されていますシートの保護を解除してから行って下さいとメッセージが出て削除出来ません。 このメッセージが出て、シートの保護を解除しようとメニューより[ツール]→[保護]をクリックすうると[シートの保護を解除する]が出てくるのでしょうが、その位置は[シートを保護する]になっています。 他の正常なブックは、[書式]→[スタイル]には、(パーセント、桁区切り、桁区切り [0.00]、通貨、通貨 [0.00]、標準)だけです。 ハイパーリンク以外に、も幾つものスタイルが登録されています。 (例、男・女・良い・悪い・年齢・20パーセント アクセント・見出し1等) このブックからシートを新しいブックにコピーしても書式→スタイルもコピーされてしまいます。 まとめた際に、元のブックは削除してしまったので、この壊れたブックから取り出さないといけないので困っています。

  • エクセルシートとブックの保護解除を長く保たせる為には、どうしたら良いで

    エクセルシートとブックの保護解除を長く保たせる為には、どうしたら良いでしょうか? 保護が、かかっているエクセルシートで、 作業をしているので、いつも【ツール】から、 エクセルシート、ブックの保護解除を選択し作業をしています。 ですが、すぐに、また保護がかかってしまい、 沢山、作業しなければならないのに、 その度に、解除をイチイチしなくてはならず、 とても面倒くさいのです。 保護解除を一時的では無く、 シートを開いてる間中、解除のままにしておく方法は何かないでしょうか?

  • シート保護の解除の仕方(パスワードなし)

    以前、こちらで作業方法について質問した時に、パスワードを設定せずにシートの保護をする方法を教えていただきました。 方法としては、単純に「ツール」から「シートの保護」を選び、パスワードを何も入力せずに「OK」をクリックするのです。 そうすると、ロックされたセルを修正する時に、「ツール」から「シートの保護の解除」を選択すると、自動的に保護が解除されます。 しかし、その一つのセルにしか有効ではなく、二つ目のセルを修正しようとすると、また「ツール」から・・・と 一度にたくさんの修正をする時にはとても不便です。 それならば、と思い、パスワードを設定して保護をしてみたのですが、 状況は変わらず、解除時にパスワードを入力してもやはり一つのセルにしか有効ではありませんでした。 そもそもパスワードなしで保護をしたからなのか、それとも全く別の原因があるのか、見当がつきません。 どなたか力を貸して下さい!!

  • EXCEL(VBA)でシート保護がかかったシートにクリックボードから貼り付けしたい

    EXCEL2000のVBAで、クリップボードにコピーしたデータ(複数のセル範囲)を、シート保護がかかった別のシートにコピーする操作を行ないたいと考えています。 手順としては「1.クリップボードにコピー」→「2.シート保護解除」→「3.貼り付け」→「4.シート保護」なのですが、下記マクロを作成して試してみたところ、2.のシート保護解除を行なった時点でクリップボードが空になるようで、「実行時エラー'1004':RangeクラスのPasteSpecialメソッドが失敗しました。」と表示され貼り付けができません。 これについて何か回避策はないでしょうか? Range("A1:C3").Select Selection.Copy Sheets("貼り付け先シート").Select ActiveSheet.Unprotect Range("A1").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True 以上、よろしくお願いします。

  • ExcelVBA シートの保護について

    こんにちは! (わざわざVBAで)ロックされているセルの選択を拒否するシートの保護をかけたいのですが、 Sheet1.Protect Sheet1.EnableSelection = xlUnlockedCells を実行すると、次にシートを開いた時にセルの選択が出来てしまいます ブックを開いた時にもう一度EnableSelectionを設定することで対応していますが、次にシートを開く時に何もしない方法は無いでしょうか?

専門家に質問してみよう