• ベストアンサー

エクセルVBAでブック保護のUserInterfaceOnly:=Trueはダメ?

エクセル2000です。シート保護ならUserInterfaceOnly:=TrueでVBAでの変更は可能ですが、Book保護にもそういう機能はないのでしょうか?試しに、 Sub TEST1() ActiveWorkbook.Protect Password:="merlion" , UserInterfaceOnly:=True End Sub とやってみましたが、エラーになってしまいました。(泣)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

merlionXX さん、こんにちは。 Wendy02です。 >ところでサンプルコードでUnprotectする直前にもProtectをしているのは何故ですか? それ自体は、あくまでも、Protect をして、Unprotect をするというのは、サンプルで作ったままでコードをアップしただけです。 ただし、理由は、以下のような流れからです。 今回は、関係ないかもしれませんが、xlSheetVeryHidden を使う場合に、前回、考えたのは以下のような手順です。 開いた時に、一旦、 Window プロテクトを解除して シートの Visible = xlSheetVeryHidden Window プロテクトにしてから、そのブックを保存して、 それから、次に、もう一度、Window プロテクトを解除して、  シートをVisible = xlSheetVisible Window プロテクトをします。 ブックを閉じるときは、 Saved =True にさせてマクロ以外からは、保存させないようにします。ですから、BeforeSave イベントをCancel =True を置いておきます。 開いたままの状態では、保存をさせないのです。 Sheet のプロテクトの時に、 Application.EnableSelection = xlUnlockedCells を使うわけですが、 画面キャプチャーやスナップショットなどで画面を取られないように、Win32 API の RegisterHotKeyで、フックさせないようにさせます。Excelでプロテクトを期待してもしょうがない、という人もいますが、ある程度のことは可能です。 もう、デジタルカメラをPC外で使われればしょうがないですが(^^;

merlionXX
質問者

お礼

ご丁寧にありがとうございました。 ActiveSheet.EnableSelection = xlUnlockedCellsはわたしもよく使いますが、「BeforeSave イベントをCancel =True 」これは勉強になりました。有難うございます!

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。Wendy02です。 >ただブック保護するのではなく手動での変更は×だけどVBAでの変更は○としたいんです。 それを、どのレベルまで求めるかだと思います。私が、以下の方法を使うのは、例えば、シートの非表示と表示をマクロで行うような場合になりますね。今のところ、この方法しか思いつきません。一般の人には、この方法で有効だと思います。 最初に BeforeClose の時に、Sheet をxlVeryHidden にしておくようにして、以下の方法で、Visible にします。 '------------------------------------------- Sub MacroProtectTest1() Application.ScreenUpdating = False Application.Interactive = False Const MYPASSWORD = "merlion" With ActiveWorkbook  .Protect Password:=MYPASSWORD, Structure:=True, Windows:=True  .Unprotect MYPASSWORD  .Sheets(3).Visible = xlSheetVisible  .Protect Password:=MYPASSWORD, Structure:=True, Windows:=True End With Application.Interactive = True Application.ScreenUpdating = True End Sub '------------------------------------------- 本来はなくてもよいのですが、万が一を考えて、Application.Interactive =False で、マクロが動いている最中に、止めることは不可能ですから、そこで、割り込みは利きませんね。

merlionXX
質問者

お礼

Wendy02さん、いつもお世話様です。 やはり一旦Unprotectしなきゃいけないんですね。 そこで強制的にマクロを止められたり何らかの事情で止ることを怖れての質問だったのですがApplication.Interactive =False という新しい「呪文」で解決しました。ありがとうございました。 ところでサンプルコードでUnprotectする直前にもProtectをしているのは何故ですか?

  • keirika
  • ベストアンサー率42% (279/658)
回答No.2

No.1です 何か質問内容を勘違いしているようです。 先程の回答は忘れてください

merlionXX
質問者

お礼

はい、有難うございます。わたしもよく勘違いしちゃいます。

  • keirika
  • ベストアンサー率42% (279/658)
回答No.1

あまり自信ではありませんが・・・ マクロの自動記録をしてみました ActiveWorkbook.Protect Structure:=True, Windows:=False

merlionXX
質問者

お礼

さっそく有難うございます。 ActiveWorkbook.Protect Structure:=True, Windows:=Falseってただのブック保護ですよね。 ただブック保護するのではなく手動での変更は×だけどVBAでの変更は○としたいんです。シート保護ならUserInterfaceOnly:=Trueでそう出来るのですが・・・。

関連するQ&A