VBA シートを保護する

はじめに

Excel VBA マクロでシートを保護する方法を紹介します。

Sheets.Protect または Worksheets.Protect メソッドから、シートを保護できます。パスワードも設定できます。

Unprotect メソッドから、シートの保護を解除できます。

ProtectContents プロパティから、シートが保護されているか判定できます。

シートを指定して取得するには「シートを取得する」をご覧ください。
  • 目次
    • シートを保護する
    • シートの保護を解除する
    • セルをロックする
    • シートが保護されているか判定する
    • 別ブックのシートを保護する

シートを保護する

Sheets の引数にインデックスかシート名を指定すると、そのシートを保護できます。

1 番左のシートを保護するには Sheets(1).Protect または Worksheets(1).Protect を入力します。1 番左のシートが 1 です。

Sheets(1).Protect        ' 1 番左のシートを保護
Sheets("Sheet1").Protect ' シート「Sheet1」を保護

Worksheets(1).Protect        ' 1 番左のシートを保護
Worksheets("Sheet1").Protect ' シート「Sheet1」を保護

引数でパスワードなどを設定できます。

引数には次のものがあり、すべて省略できます。

引数名 説明 既定値
Password保護を解除するためのパスワードを設定します。半角英数字を指定します。大文字と小文字を区別します。
Contentsオブジェクトの内容を保護させるには、True を指定します。ワークシートの場合はロックされているセルが保護されます。True
Scenariosシナリオを保護するには、True を指定します。True
UserInterfaceOnly True を指定すると、画面上からの変更は保護されますが、マクロからの変更は保護されません。この引数を省略すると、マクロからも、画面上も変更することができなくなります。False
AllowFormattingCellsTrue を指定すると、セルの書式設定ができます。False
AllowFormattingColumnsTrue を指定すると、列の書式設定ができます。False
AllowFormattingRowsTrue を指定すると、行の書式設定ができます。False
AllowInsertingColumnsTrue を指定すると、列を挿入できます。False
AllowInsertingRowsTrue を指定すると、行を挿入できます。False
AllowInsertingHyperlinksTrue を指定すると、ハイパーリンクを挿入できます。False
AllowDeletingColumnsTrue を指定すると、列を削除でき、削除される列のセルはすべてロック解除されます。False
AllowDeletingRowsTrue を指定すると、行を削除でき、削除される行のセルはすべてロック解除されます。False
AllowSortingTrue を指定すると、並べ替えができます。並べ替え範囲内のセルは、ロックと保護が解除されている必要があります。False
AllowFilteringTrue を指定すると、フィルタを設定できます。ユーザーは、フィルタ条件を変更できますが、オート フィルタの有効と無効を切り替えることはできません。False
AllowUsingPivotTablesTrue を指定すると、ピボットテーブル レポートを使用できます。False
Call Sheets(1).Protect                          ' Excel で保護を解除できる
Call Sheets(1).Protect(Password:="Tips")        ' 保護を解除時にパスワードが必要
Call Sheets(1).Protect(UserInterfaceOnly:=True) ' Excel の操作を保護し、マクロからは編集できる

引数「Password」には日本語を設定できますが半角英数字を指定します。これは Excel の操作では半角英数字しか入力できないからです。クリップボードから貼り付けしたときは日本語も入力できます。パスワードを忘れると解除できなくなるので、注意が必要です。

引数「UserInterfaceOnly」を True にすると、マクロから編集可能な状態になり、Excel からの編集は保護されます。ただし、Excel を閉じて再度開いたときはマクロからの編集が不可になります。再度 UserInterfaceOnly を True にする必要があります。

Sheets と Worksheets の違いはワークシート以外を取得するかどうかです。

  • Sheets:すべてのシートを取得
  • Worksheets:ワークシートのみ取得(グラフシートなどは取得しない)

このためグラフシートなどは Worksheets.Protect で保護できません。

シートの保護を解除する

シートを保護を解除するには Unprotect を入力します。

Sheets(1).Unprotect
Worksheets("Sheet1").Unprotect

パスワードを設定しているときは引数「Password」を指定して、パスワード付きの保護を解除できます。

Call Sheets(1).Unprotect(Password:="Tips") ' パスワード付きの保護を解除する

Excel の操作ではパスワードに半角英数字しか入力できません。クリップボードから貼り付けしたときは日本語も入力できます。そのため、通常は日本語をパスワードに設定したときは Unprotect 以外の方法では保護を解除できません。

セルをロックする

すべてのセルをロックするには Cells.Locked = True を入力します。

セルの範囲「A1」~「B2」のロックを解除するには Range("A1:B2").Locked = False を入力します。

' A1 ~ B2 のロックを解除
Cells.Locked = True
Range("A1:B2").Locked = False

' A1 ~ B2 のセルをロック
Cells.Locked = False
Range("A1:B2").Locked = True

Call Sheets(1).Protect                    ' シートを保護
' Call Sheets(1).Protect(Contents:=False) ' ロックされているセルは保護されない

セルのロックの既定値は True です。シートを保護したときに有効になります。保護した後にセルのロックを編集できません。

引数「UserInterfaceOnly」を True 指定すると、保護した後でもセルのロックを編集できます。

引数「Contents」に False を指定すると、ロックされているセルは保護されません。

エクセルでセルをロックするには「セルを保護・ロックする」をご覧ください。

シートが保護されているか判定する

シートが保護されているか判定するには Sheets.ProtectContents が True なら保護されています。

Dim ws As Variant
For Each ws In Sheets
    If ws.ProtectContents = True Then
        Debug.Print("シート保護")
    Else
        Debug.Print("解除")
    End If
Next

別ブックのシートを保護する

ブックを指定しないシートの操作はすべて「アクティブブック」に対して行われます。

  • アクティブブック:開いているすべてのブックの中で一番手前に表示されているブックです。
  • VBA を実行しているブック:実行している VBA のコードがあるブックです。

アクティブブック

ブックを指定しないシートの操作は、アクティブブックを表す ActiveWorkbook. が省略されています。

' どちらも同じコード
Call Sheets.Add
Call ActiveWorkbook.Sheets.Add
ショートカットや VBA の IDE から実行したときに、別ブックがアクティブになっていることがあります。

VBA を実行しているブック

VBA を実行しているブックに対して操作するには ThisWorkbook を入力します。

' VBA を実行しているブックに対して操作
Call ThisWorkbook.Sheets.Add
Call ThisWorkbook.Worksheets.Add

ブックを指定

ブックを指定するには Workbooks の引数にブック名またはインデックスを指定します。

ブック「Book2.xlsx」を指定するには Workbooks("Book2.xlsx") を入力します。

' ブック「Book2.xlsx」のシート「Sheet1」を保護
Call Workbooks("Book2.xlsx").Sheets("Sheet1").Protect

' 2 番目のブックの 2 番目のシートを保護
Call Workbooks(2).Sheets(2).Protect

' アクティブブックのシートを保護
Call ActiveWorkbook.Sheets("Sheet1").Protect

' VBA を実行しているブックのシートを保護
Call ThisWorkbook.Sheets(2).Protect

Workbooks のインデックスは、ブックを開いた順番に 1 からスタートします。