Excel VBA 別ブックの保護されたワークシートを一括解除

Power Query について勉強し始めたら、かなり覚えることが多くてなかなか VBA に戻ってこられなくなっていました。今回は久々に VBA の記事です。

とはいえ内容は「プチネタ」的な内容です。仕事で時々使うプチツールの一つ「別ブックのシート保護を解除するツール」を紹介します。

くるみこ
くるみこ

ずいぶんVBAについてはご無沙汰でしたが、今回は VBA を使った「ミニツール」を紹介します。ほとんどは、今まで勉強して生きたことを応用すればできる内容なので復習として勉強しましょう。

VBA の応用の仕方を勉強するということでしょうか?
よろしくお願いしますm(__)m

【この記事でわかることは】
・シート保護のパスワード設定・解除方法がわかります
・別ブックのシートを選択する方法とループ処理の方法がわかります

この記事と関連する内容の記事がこちらです。ブログカードをクリックすれば開きます(^^ゞ

・ワークシートの操作に関する記事とループ処理についての記事です。

ワークシートの保護/解除

ワークシートの保護と解除について解説します。保護と解除はワンセットで覚えましょう。

Protect / Unprotect メソッド

Worksheet.Protect メソッド で保護設定

ワークシートを保護し、変更できないようにするには Worksheet.Protect メソッドを使います。
次のコードではアクティブなワークシートの保護を “password” というパスワードを付けて実行しています。パスワード無しでも保護は可能です。

Sub Protect_Sheet()
    ActiveSheet.Protect Password:="password"
End Sub
Worksheet.Protect の構文

Worksheet.Protect ( Password, DrawingObjects, Contents , Scenarios , UserInterfaceOnly, AllowFormattingCells, AllowFormattingColumns, AllowFormattingRows, AllowInsertingColumns, AllowInsertingRows, AllowInsertingHyperlinks, AllowDeletingColumns, AllowDeletingRows, AllowSorting , AllowSorting, AllowUsingPivotTables)

・引数がたくさんありますが「Password」以外の引数は省略可能です。

引数「Password」でワークシートまたはブックのパスワード文字列を指定します。
・パスワードでは大文字と小文字が区別されます。
・この引数を省略すると、パスワードの使用なしで保護されます。
・この引数を指定すると、保護解除には設定したパスワードが必要になります。

引数「UserInterfaceOnly」に True が指定された場合(既定値は False
画面上で手動操作による変更は保護されますが、マクロでの変更は保護されません
※これは覚えておけば使う場面がありそうですね。

Worksheet.Unprotect メソッド で保護解除

ワークシートまたはブックの保護を解除するには Worksheet.Unprotect メソッドを実行します。
※ 保護されていないシートやブックに対しては、このメソッドは無効です。
次のコードはアクティブなワークシートのパスワード付き保護を解除しています。

Sub Unprotect_Sheet()
    ActiveSheet.Unprotect Password:="password"
End Sub
Worksheet.Unprotect の構文

Worksheet.Unprotect ( Password)

上の例では、Password は名前付き引数として「Password:=“パスワード文字列”」のように記述しています。

Protect に比べてこちらはあっさりしていますね。

PW付き保護シートを解除するプチツール

職場である社員が、シートがPW付きで保護されているため、手入力でPWを入力して解除してから内容を修正する作業を行っている場面に出くわしました。
詳しく聞いてみると、ファイルには7枚のシートがあり、それぞれ個別に違う内容の手入力作業を行っているというのです。
ヒアリングしてみた内容は次のようなものでした。

  • 処理するファイル数 90個
  • ファイル内シート数 7枚 (7×90=630枚) 別に隠しシートあり
  • シートはPW付きで保護されている(PWは判っている)
  • ファイル自体にPWは設定されていない
  • ファイルを閉じる際にPWが再度自動設定されるようになっている
  • ファイルのVBAProject にパスワードがかかっている(PWは不明)

なんと最大で 7シート×90個 = 630回 もパスワードを入力して解除している!
最後の2つが厄介ですね。仕方ないのでシートのパスワード解除だけならどうにかできそう。
・せめてこれだけでも何とかしてあげたいということでVBAで解除できるように設定してみました。

全体の設定を検討します

・別ブックのシート保護を解除するだけの単純なものにします
・個別シートか全てのシートかを選択できるように CheckBox を使います
・ターゲットとなるファイルの指定は Application.InputBox Type:=8を使います
・全シート対象の場合、For Each…Next ループを使います。

シートの設定

・ActiveX の CheckBoxCommandButton を配置しました。
・この部分は セルシェイプ でも代用できますけど、一応カッコつけるために(^^;

設定したVBAコード

'PW付き保護シートを解除する
Sub UnprotectSheet()
    Dim pw As String
    Dim rn As Range
    Dim sh As Worksheet
    Dim wb As Workbook
    Dim chk As Boolean
    Dim i As Long
    
    pw = Range("B2").Value      'PW文字列取得
    If pw = "" Then _
        MsgBox "解除用 PW が指定されていません。" & vbCrLf & _
                "指定後に再実行してください!": Exit Sub
    chk = Sheet1.CheckBox1.Value 'ChectBoxの状態取得
    
    'Application.InputBoxでシートのセルを選択させる
    On Error Resume Next
    Set rn = Application.InputBox( _
            Prompt:="PWを解除するシートの" & _
                    "任意のセルを選択してください", _
            Title:="任意のセル選択", Type:=8)
    On Error GoTo 0
    If rn Is Nothing Then Exit Sub
    Set sh = rn.Parent  'Rangeからシート取得
    Set rn = Nothing
    '全シートか単独かで分岐処理
    If chk = True Then
        Set wb = sh.Parent  'シートからブック取得
        Set sh = Nothing
        Application.ScreenUpdating = False  '画面描画停止
        'シート数分ループさせる
        For Each sh In wb.Sheets
            sh.Unprotect Password:=pw
        Next sh
        Set wb = Nothing
        Application.ScreenUpdating = True   '画面描画再開
    Else
        sh.Unprotect Password:=pw
    End If
    Set sh = Nothing
End Sub

・10行目で、パスワード文字列をセルから取得しています。
・11行目では、取得していない場合メッセージして終了します。PW必須としています。
・14行目で、チェックボックスの設定を変数 chk に代入しています。
・18行目は、Application.InputBox Type:=8でターゲットを指定できるようにしています。
・27行目で、チェックボックスの設定によって処理を分岐しています。
・28~36行目までが、全シート対象の場合で For Each…Next ループ でブック内の全シート数を処理させています。
・38行目は、シートが単独指定の場合の処理です。
以上、こんな感じです(^^ゞ

Application.InputBox については下記の記事で詳しく解説しています。

実行はコマンドボタンから

・コマンドボタンのクリックイベントに次のコードを設定します。

Private Sub CommandButton1_Click()
    Call UnprotectSheet
End Sub

保護を設定する場合にも流用できます

先ほどのVBAコードは「保護解除」にしていますが、UnprotectProtect に変えるだけで「保護」するように改変できます。

是非やってみてください。

スポンサーリンク

まとめ(おわりに)

以上、別ブックの保護されたワークシートを一括解除するための VBAコード を紹介しました。

サンプルファイルをダウンロードできるように登録していますのでご利用ください。

まとめと感想など

くるみこ
くるみこ

これで手作業する時間と手間を削減することができるようになりました。きっとストレス軽減にもなっているのではないかと思います(^^)
普段、我慢して行っている定型的な作業など、視点を変えてみたりすると効率化できる部分がまだまだありそうですね。

ホントそうですね。
効率化できることがないかどうかを意識を持っていることが大事なんですね(^^;

【今回わかったことは】
・シート保護のパスワード設定・解除方法がわかりました
・その他、別ブックのシート指定方法やループ処理の方法がわかりました

★★★ ランキング参加中! クリックしてね(^^)/ ★★★

【今後の記事について】

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてる」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にご期待ください(^^)/

過去記事のサンプルファイルをダウンロードできます

今回記事のサンプルファイルを登録しています
過去の記事で使用したサンプルファイルをダウンロードできるようにページを設置していますので、こちら(このリンク先)からご利用ください