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」以外の引数は省略可能です。
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 の CheckBox と CommandButton を配置しました。
・この部分は セル や シェイプ でも代用できますけど、一応カッコつけるために(^^;
設定した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コードは「保護解除」にしていますが、Unprotect を Protect に変えるだけで「保護」するように改変できます。
是非やってみてください。
まとめ(おわりに)
以上、別ブックの保護されたワークシートを一括解除するための VBAコード を紹介しました。
サンプルファイルをダウンロードできるように登録していますのでご利用ください。
まとめと感想など
これで手作業する時間と手間を削減することができるようになりました。きっとストレス軽減にもなっているのではないかと思います(^^)
普段、我慢して行っている定型的な作業など、視点を変えてみたりすると効率化できる部分がまだまだありそうですね。
ホントそうですね。
効率化できることがないかどうかを意識を持っていることが大事なんですね(^^;
★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★
【今後の記事について】
今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてる」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m
【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にご期待ください(^^)/
過去記事のサンプルファイルをダウンロードできます
今回記事のサンプルファイルをリンク先に登録しています!
過去の記事で使用したサンプルファイルをダウンロードできるようにページを設置していますので、こちら(このリンク先)からご利用ください
・シート保護のパスワード設定・解除方法がわかりました
・その他、別ブックのシート指定方法やループ処理の方法がわかりました