[[20191018103501]] 『シート保護(パスワード付)されているシートの「』(あ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シート保護(パスワード付)されているシートの「グループ解除」操作を可能にしたい』(あ)

1つのエクセル内にシートが複数あります。

そのシートには、第三者に入力にしてほしいセルだけ入力可能とし(セルの書式設定からロックのチェックを外した)、それ以外のセルはシートの保護を解除しないと触れない状態にしました。

その上、各シートで「グループ解除」もできるようにしたかったので、ネットから拾った以下のコードを使用しました。

 Private Sub Workbook_Open()
     For Each W_Sheet In Worksheets
        With W_Sheet
         .EnableOutlining = True
         .Protect Contents:=True, UserInterfaceOnly:=True
         .Protect AllowFormattingCells:=True
        End With
    Next
 End Sub

シートの保護にパスワードを付けていない状態では、このコードで問題なく、シート保護+グループ解除ができていました。

しかし、シート保護をパスワード付にすると、エクセルを開いてマクロ有効化の為「コンテンツの有効化」ボタンを押すと、シートのパスワードを、保護されたシートの枚数分聞かれるようになりました。

このパスワードが分からない場合には、「グループ解除」も使えない状態です。

どうにか、シートの保護(パスワード付)+グループ解除を両立させることはできないでしょうか?
もし可能であれば、できるだけコード内にパスワードを入れたくありませんが、それしか方法がない場合は、それでも構いません。

ご教示の程、よろしくお願いいたします。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


マクロ有効化ボタンを押すと、InputBoxでパスワードの入力を求め、この文字列を使ってマクロでパスワード指定してUnprotectすれば良いかと思います。

以下は、1シート解除の例。

 Sub test()
    Dim cw As String
    cw = InputBox("パスワード?")
    On Error Resume Next
    ActiveSheet.Unprotect Password:=cw
    If Err.Number <> 0 Then
        MsgBox "パスワードが違います。", vbCritical
    End If
    On Error Resume Next
 End Sub
(???) 2019/10/18(金) 10:59

???さん

ご返信いただきありがとうございます。

ご教示いただいたコードはどのように貼り付けるべきなのでしょうか?
お恥ずかしながら、初心者で申し訳ありません。

このコードを入れることで、

1.エクセルを開く
2.コンテンツの有効化をクリックする
3.ポップアップ等は何も出てこない(即エクセルの入力に取り掛かれる)
4.シート保護(パスワード付)されているシートで、ロックがかかっていないセルは入力が可能
5.シート保護(パスワード付)されているシートで、グループ解除が可能

という操作ができるという理解でよいのでしょうか?

目的としては、
複数あるシートの中で、特定のセルだけ入力可能にして、かつグループ解除機能も使えるようにしたい、
です。

コード内にパスワードを記述したくないと前述しましたが、一番簡単な方法(VBA初心者向き)ですと以下のようなコードになるのでしょうか?
※パスワードをtestとしています。

 Private Sub Workbook_Open()
     For Each W_Sheet In Worksheets
        With W_Sheet
         .Unprotect Password:="test"
         .EnableOutlining = True
         .Protect Contents:=True, UserInterfaceOnly:=True
         .Protect AllowFormattingCells:=True
         .Protect Password:="test"
        End With
    Next
 End Sub

(あ) 2019/10/18(金) 11:21


応用はご自身で試行錯誤して欲しかったのですが、とりあえず以下でしょうか。(動作確認していません)
 Private Sub Workbook_Open()
    Dim W_Sheet As Worksheet
    Dim cw As String

    cw = InputBox("パスワード?")

    On Error Resume Next
     For Each W_Sheet In Worksheets
        With W_Sheet
            .Unprotect Password:=cw
            If Err.Number <> 0 Then
                MsgBox "パスワードが違います。", vbCritical
                Exit For
            End If
            .EnableOutlining = True
            .Protect Contents:=True, UserInterfaceOnly:=True
            .Protect AllowFormattingCells:=True
            .Protect Password:=cw
        End With
    Next
    On Error Resume Next
 End Sub
(???) 2019/10/18(金) 12:01

???さん

ご返信いただきありがとうございます。

1から10まで説明して下さりありがとうございます。
お手数おかけします。

教えていただいたコードを入れてみましたが、
前述したような1〜5の動きとは異なるようでした。

教えていただいたコードでは、
”パスワード付でシート保護がされている状態であっても、グループ解除機能は使用可能”
という状況を作ることができる、という理解でよいのでしょうか?

私の説明が悪いのかもしれないのですが、
第三者にはパスワードを教えず、シートが保護されたままの状態で、
第三者がグループ解除の機能を使えるようにしたいです。

色々と試行錯誤しようと思いますので、ヒントだけでも構いません。
よろしくお願いいたします。

(あ) 2019/10/18(金) 13:07


私が書いたのは、複数シートでいちいちパスワード入力を要求されるのを、1回の入力にした事だけです。 パスワードを知らない人でもグループ解除するためにパスワード保護を解くには、パスワードをマクロ内に書いておくしかないでしょうね。

または、素直にパスワードを書いておかずに、文字コードで入れ替えるとか、何らかの暗号化/復号化する処理を行った文字列にしておけば、簡単には解読されないでしょう。 更には、パスワードは平文でコーディングしても良いので、VBAプロジェクト自体にパスワードをかけてマクロを見せなくする、という方法もあります。

しかしながら、Excelのパスワード保護は甘いので、詳しい人なら何の文字列になっているかを無視して、パスワードを解除できます。 なので、私はプロジェクトにパスワードをかける事は、後継者に引き継ぐ際に邪魔になるだけと思っているので、パスワードを付けずにシート保護するだけで十分なのではないか、と思いますね。(詳しい人なら、シートの保護のパスワードも外せるから、効果が薄い)

誤入力を防ぐだけなのだし、パスワードを付けないシート保護でも目的を果たせますよね? 保護を手動で解除し不正入力される事に対策しようとするなら、Excelは向いてないですよ。
(???) 2019/10/18(金) 13:29


 ちょっと意味不明です。

 Private Sub Workbook_Open()

 では、保護をかけているんですよね?

 なぜパスワードを聞かれるのかわからないのですが・・・

 ユーザーの編集が終了して、保存するときは単純な上書き保存ですか? それともマクロ?

(渡辺ひかる) 2019/10/18(金) 13:52


???さん

詳細にご教示いただきありがとうございます。

パスワードを知らない人でもグループ解除するためにパスワード保護を解くには、パスワードをマクロ内に書いておくしかないでしょうね。

仰る通り、私のような初心者にとっても、後々の引継ぎを考えても、この方法がベストなように思いました。
少し前に、コードにパスワードを記述したものを挙げましたが、あれでうまく動いてくれているようなので、あのコードで行くようにします。

誤入力を防ぐだけなのだし、パスワードを付けないシート保護でも目的を果たせますよね? 保護を手動で解除し不正入力される事に対策しようとするなら、Excelは向いてないですよ。

確かに、誤入力を防ぐのが目的だけであればいいのですが、実際にはロックをしていてもパスワードが不要なことから変更してしまう人も居まして・・・。(何度注意しても変わらず)
パスワードをかけよう、という話に至りました。
ただ、その人もそこまでVBAの知識はないと思いますので、一旦これで試してみたいと思います。

丁寧に説明していただき、ありがとうございました。

(あ) 2019/10/18(金) 14:05


渡辺ひかるさん

シートにパスワードを掛けているのは、マクロではなく、シート名を右クリックしてシート保護をしています。

その状態でグループ化の開閉(解除と書きましたが、正確には開閉)が、通常はできません。
そのため、シート保護状態でも、VBAでグループ化の開閉ができるようなコードを組みました。

ユーザーの編集が終了して、保存するときは単純な上書き保存です。

何か他に良い方法がありそうでしょうか・・・?
(あ) 2019/10/18(金) 14:09


 >シートにパスワードを掛けているのは、マクロではなく、シート名を右クリックしてシート保護をしています。

 ですから、どの場面でパスワードを聞かれるんですか?

 最初に掲示されたコードは 保護するコードですよ

 >Private Sub Workbook_Open()
 >     For Each W_Sheet In Worksheets
 >        With W_Sheet
 >         .EnableOutlining = True
 >         .Protect Contents:=True, UserInterfaceOnly:=True
 >         .Protect AllowFormattingCells:=True
 >        End With
 >    Next
 > End Sub

(渡辺ひかる) 2019/10/18(金) 14:57


渡辺ひかるさん

パスワードを聞かれるのは、そのコードを入れたエクセルファイル(シートがパスワード付きで保護されている)を開いて、マクロを有効にするためコンテンツの有効化をクリックした後です。

もともと、パスワードなしでシート保護をしていました。
その時にシートが保護された状態でグループ化の開閉をできるようにしたかったので、最初に掲示したコードを使用し、希望通りに動いてくれていました。
(あ) 2019/10/18(金) 15:30


>最初に掲示したコード
で シートが「パスワード付きで保護」されている状態から「パスワードなしでシート保護」に変更されていると思いますが
それで
>希望通りに動いてくれていました。
なら、「パスワード付きで保護」で保存しなければよいのでは?

勘違いでしたらすいません。

(チオチモリン) 2019/10/18(金) 16:27


 >パスワードを聞かれるのは、そのコードを入れたエクセルファイル(シートがパスワード付きで保護されている)を開いて、マクロを有効にするためコンテンツの有効化をクリックした後です。 

 すみません、こちらでも再現しました。

 結局、すでに保護されているシートを保護しようとしているので、
 Excelが勝手に保護解除しようとして、パスワードの入力を求められるということですね?

 これは知りませんでした。

 パスワード無しの場合は、勝手に保護解除されて、
    .EnableOutlining = True
 を実行して、再度保護しているということですね

 しかも EnableOutlining プロパティ は 保護された状態でも Trueにはできますが
 効果はないということもわかりました

 また、EnableOutlining プロパティは ファイルを保存しても 再度開くとFalseになってしまうようですね

 対応策としては

 >(あ) 2019/10/18(金) 11:21

 のコードになるかと思いますが コードを見られたくなければ、VBAプロジェクトの保護という機能もあります
 (完全ではありませんが)

 参考まで

(渡辺ひかる) 2019/10/19(土) 13:59


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.