エクセルのVBAでシートの保護を自動で設定する方法

このQ&Aのポイント
  • エクセルのVBAを使用して、シートの保護を自動で設定する方法を教えてください。
  • エクセルのVBAを使用して、複数のシートに対して一括で保護を設定する方法を教えてください。
  • VBAの書き込み場所についても教えていただけるとうれしいです。
回答を見る
  • ベストアンサー

エクセル、セーブ時自動でVBAを動かすには?

エクセルのVBAモジュールに以下のマクロを登録してあります Sub マクロ1()     Cells.Select    ActiveSheet.Unprotect    Selection.Locked = True    Selection.FormulaHidden = False    ActiveSheet.Protect End Sub シートに書き込みを禁止するようにしてあるのですが、 シートの枚数が20枚以上有って、どのシートをきちんと 保護したか分からなくなってきて、不便なのですが、 複数に渡るシートに対して、セーブしたときに上の保護が かかるようにするにはどうすればいいですか? もしくは、一つのシートの上で複数のシートに対して 保護をかけていくにはどのようにすればいいのでしょうか? VBAの書き込む場所なども、sheetなのか、bookなのか、 モジュールなのかも教えていただければと思います。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

ThisWorkbook モジュールで BeforeSave イベントを使います。 サンプルは保護にパスを使っていない前提です。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)      Dim Sh As Worksheet   For Each Sh In ThisWorkbook.Worksheets     Sh.Unprotect     With Sh.Cells        .Locked = True        .FormulaHidden = False     End With     Sh.Protect UserInterfaceOnly:=True   Next End Sub

tmgolf
質問者

お礼

ありがとうございます。 早速使わせていただきました。ありがとうございますー。 ちなみに、モジュール上で複数のシートを操作するのは 複雑になってしまうのでしょうか?

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

> モジュール上で複数のシートを操作するのは > 複雑になってしまうのでしょうか? モジュール上とは「標準モジュール」という意味ですか? Save 時に自動実行する必要がなければ、そのまま標準モジュール に同一内容のコードを置くだけです。 Sub ProtectAllSheets()      Dim Sh As Worksheet   For Each Sh In ThisWorkbook.Worksheets     Sh.Unprotect     With Sh.Cells        .Locked = True        .FormulaHidden = False     End With     Sh.Protect UserInterfaceOnly:=True   Next End Sub #1 は Save 時に自動実行するため、ThisWorkbook モジュールで BeforeSave イベントを使ってます。これはイベントプロシージャ といって、特別な意味があるものです。 標準モジュールに置く場合は、今回のコードは引数も不要ですし、 プロシージャ名は変更した方が良いでしょう。

tmgolf
質問者

お礼

なるほど、そういうことなのですね。 beforesaveイベントだからと言って書き方が 変わるわけではないのですね。 勉強になりました。 ありがとうございますー

  • x0000x
  • ベストアンサー率52% (67/127)
回答No.2

No1の方が記入した処理ですでにBOOK内の全シートを対象にしてます。 For Each Sh In ThisWorkbook.Worksheets

tmgolf
質問者

お礼

(^^ゝ 了解しましたー ありがとうございますー

関連するQ&A

  • エクセル シートを保護してる時のセル結合

    エクセル2010を使用しています。 仕事の成果を一定の様式に記入してもらいます。書式、関数などを変更してもらいたくないのでシートに保護をかけました。 記入してもらうところだけセルのロックをはずし入力OKに設定しました。 しかし、シートの保護をかけるとロックをはずしててもセルの結合はできないんですね。なので、過去の質問からシートの保護がかかっていてもマクロですべての操作をしようできるというマクロ↓を参考にしてみました。 Sub seru() ActiveSheet.Protect UserInterFaceOnly:=True End Sub これと、セルを結合するマクロ↓を考えたのですが、どのように2つをくっつけたらいいのかがわかりません。 If TypeName(Selection)="Range"and Selection.Cells.Count>1 Then Selection.Merge ActiveSheet.Protect,AllowFormattingCells:=True End If 何かぬけているのかマクロを実行しても全く働いてくれません。 どうかよろしくです。

  • エクセル2000でのVBAについて

    下記のVBAを書いているのですが、3つのIF文を1つに まとめたいのですが教えてください。 If Range("E16") = "申請者" Then Sheets("ログイン").Select Sheets("報告票").Select ActiveSheet.Unprotect Range("M3:U7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select If Range("E16") = "所属長承認" Then Sheets("報告票").Select ActiveSheet.Unprotect Range("D3:L7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select If Range("F16") = "所属長承認" Then Sheets("報告票").Select ActiveSheet.Unprotect Range("BS3:CA7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select end if end if end if

  • マクロでエクセル2003以前のバージョンで動かない

    エクセル2003以前のバージョンのPCで、行挿入マクロを実行させるとコンパイルエラーと出て行挿入ができません。どのようなマクロ構文に変更すればよいでしょうか、ご教授下さい。 現在のマクロ構文は、次の通りです。よろしくお願いします。 Sub 行挿入() 'シート保護解除 ActiveSheet.Unprotect ' 行挿入 Macro m = Cells(15, 8).Formula Range("a15:j15").Insert copyorigin:=xlFormatFromRightOrBelow Cells(15, 8) = m 'シート保護 ActiveSheet.Protect End Sub

  • Excel 2003 で、次のようなVBAを入力しています。

    Excel 2003 で、次のようなVBAを入力しています。 手動でも同じパスワードでシートの保護設定、解除をしたいのですが、 方法はありますか? ご教示よろしくお願いいたします。 ActiveSheet.Unprotect Password ="pass" 'シート保護解除 Selection.AutoFilter Field:=7, Criteria1:="<>" '項目「得意先名」が、「空白以外」を抽出 ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True '印刷 Selection.AutoFilter Field:=7 '印刷範囲の解除 ActiveSheet.Protect Password="pass"

  • エクセルで2つのマクロを結合したい

    毎度お世話名なっております。 以前ここで教えてもらった保存時に全シートの入力済みセルに自動で保護がかかる<マクロ1>を教えてえもらって非常に多くのBookに採用しているのですが、今回同じBookの「計算表」シートの特定のいくつかのセルだけ保護がかからないようにしたく試行錯誤で2つのマクロをつなげてみたのですが情けないことに期待通りに動かず。 単に最初のマクロのEnd Subを削除しただけではうまくいかず。 どなたかHELPお願い致します。 <マクロ1> Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const MyPassword = "" 'パスワード(省略可) Dim sh As Worksheet On Error Resume Next For Each sh In Worksheets sh.Unprotect Password:=MyPassword With sh.Cells '全セルのロックを外す .Locked = False '定数が含まれているセルにロックを掛ける .SpecialCells(xlCellTypeConstants).Locked = True '数式が含まれているセルにロックを掛ける .SpecialCells(xlCellTypeFormulas).Locked = True End With sh.Protect DrawingObjects:=True, Contents:=True, _ Scenarios:=True, Password:=MyPassword Next On Error GoTo 0 End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub 保護解除() <マクロ2> ' 保護解除 Macro '' Sheets("計算表").Select Range("C6:D6").Select ActiveSheet.Unprotect End Sub

  • VBA実行時のシート(複数)保護解除について

     いつも勉強させていただいております。VBA初心者です。  早速ですが、あるマクロを複数のシートで実行するとき、 シートに設定されている「シートの保護」を解除したいのですが、 複数シートに対しての処理方法が分かりません。  インターネットで検索した結果、 ActiveSheet.Unprotect を実行したいマクロの冒頭にセットし、 最後にActiveSheet.Protectを設定すればよいことは分かりました。 (私としての理解:こうすることで、シートの保護解除⇒保護となる。)  その結果、 Sub カレンダー作成() 'ワークシートを非保護にする ActiveSheet.Unprotect Dim 日付, i As Integer 日付 = Application.InputBox _ ("yyyy/m 形式の年月を半角で入力してください" & Chr(10) _ & " 例)2013年の1月 → 2013/1") Range("c3").Value = 日付 If 日付 = False Or IsDate(日付) = False Then Exit Sub For i = 1 To Sheets.Count With Sheets(i) Select Case .Name Case "sheet1", "sheet5" .Range("G5").Resize(, 31).ClearContents .Range("C3,G5").Value = DateSerial(Year(日付), Month(日付), 1) .Range("G5").AutoFill Destination:=.Range("G5"). _ Resize(, Day(DateSerial(Year(日付), Month(日付) + 1, 0))) End Select End With Next 'ワークシートを保護する ActiveSheet.Protect End Sub  と言った構文を作成し、1シートについての作業は成功しました。 ところが、2シート目以降にはエラーとなるのです。  この作業を、複数のシートに対して同時に、1回の操作で実行したいのです。 色々と調べてみて、それらしいサイトも見てみたのですが、初心者の私には、 その内容を理解し、自分のVBAに組み込むことが到底できませんでした。  有識者のみなさま、どうかご指導をよろしくお願いいたします。

  • EXCELのVBAについて

    マクロのボタンで内容を削除する様に設定した所、 Dim re As Integer Sheets("投入シート").Select re = MsgBox("入力データをクリアします。" & vbCrLf & vbCrLf & "よろしいですか?", vbOKCancel, "クリア確認") If re <> vbCancel Then Sheets("投入シート").Select ActiveSheet.Unprotect Range("a1:c30").Select Selection.Copy Application.CutCopyMode = False Selection.Copy Sheets("work").Select Range("A1").Select ActiveSheet.Paste Sheets("投入シート").Select ActiveSheet.Unprotect Range("c4:c30").Select Selection.ClearContents Range("f31").Select Selection.Copy Range("c9").Select ActiveSheet.Paste Range("f33").Select Selection.Copy Range("c11").Select ActiveSheet.Paste Range("f32").Select Application.CutCopyMode = False Selection.Copy Range("c14").Select ActiveSheet.Paste Range("c4").Select Application.CutCopyMode = False 'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End If Sheets("投入シート").Select Range("c4").Select End Sub この様に入力したのですがセルのC11の計算式だけセル番号が消えてしまいます。 どうしてでしょうか?ご指導をお願いします。

  • パスワードでシート保護したExcelへの画像貼り付けについて

    Excel2000でロックしていないセルに画像を貼り付けようと思います。 パスワードでシート保護しています。 VBAで次のように処理したら画像は貼り付けられました。 しかしパスワード入力を求められ、入力すると画像の挿入後シートは保護されたのですが、パスワードは解除になっています。 パスワード解除にならずに画像挿入できる方法をご教示ください。 さらに挿入後のサイズ変更のVBAも併せて教えて頂ければ助かります。 当方VBAについては全くの初心者です。 Sub 画像挿入()   With ActiveSheet     'シート保護解除     .Unprotect     '画像挿入ダイアログ表示-->画像を挿入     Application.Dialogs(xlDialogInsertPicture).Show     '画像が挿入されたら、保護のロック対象外に設定     If TypeName(Selection) = "Picture" Then       Selection.Locked = False     End If     'シート保護     .Protect DrawingObjects:=False, Contents:=True   End With End Sub

  • 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 以上、よろしくお願いします。

  • シート保護のパスワードは・・・

    下の「シート保護」マクロは、パスワード「111」でシートを保護しなさい。    「シート保護解除」マクロは、パスワード「111」でシートの保護解除をしなさい。 という命令だと思うのですが・・・ Sub シート保護()   ActiveSheet.Protect possword = "111" End Sub Sub シート保護解除()   ActiveSheet.Unprotect possword = "111" End Sub パスワードを入力してシートの保護を解除しようとすると、 入力したパスワードは間違っています。 CapsLockキーがオフになっていることを確認し、 大文字と小文字が正しく使われていることを確認してください。 というメッセージが出るのですが・・・、 マクロで作成した保護は、マクロで解除しないとダメという意味なのですか? シートで保護解除できるようにしたいのですが、できますか?

専門家に質問してみよう