• ベストアンサー

エクセル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

  • エクセル VBA

    先日初めてVBAに触れた者です 知恵をお貸しください エクセルのバージョンは2000です ブックのデータを誰も編集できないようにして、 尚且つオートフィルタだけを有効にする方法を探しています。 この条件だけならば、 Sub Auto_Open() Worksheets("Sheet1").EnableAutoFilter = True Worksheets("Sheet1").Protect UserInterfaceOnly:=True End Sub で、可能になったのですが あとこのシートに「パスワード保護」をかけることは 出来るでしょうか? 私には「出来る」か「出来ないか」すらわからないです。 お手数をおかけして申し訳ないですが どうぞお助けくださいませ。 よろしくお願いします

  • エクセルVBAでUserInterfaceOnly:=Trueが効かない?!

    以下のコード(要点だけに簡略化していますが)を実行すると、実行時エラー1004「アプリケーション定義またはオブジェクト定義のエラーです。」となります。 もちろんシートをProtectしなければエラーになりませんが、UserInterfaceOnly:=True にして、マクロからの変更は可能にしているはずなのに・・・・。 Valueプロパティは設定できるのにIDプロパティが設定できないのはどうしてでしょうか? また、一旦シートをUnprotectしてから再度Protectすること以外の対処法がありますか? Sub test01() With ActiveSheet .Protect Password:="merlion", UserInterfaceOnly:=True .Range("A1").Value = 999 .Range("A1").ID = .Range("A1").Value '←ここでエラーになります。 End With End Sub Excel2000、2003とも同じ結果でした。 よろしくお願いいたします。

  • エクセル2000で動いたマクロが2003で実行時エラー!

    会社のWindows2000、エクセル2000では問題なく動いたマクロですが Sub test01() ActiveSheet.Protect , Password:="XX", UserInterfaceonly:=True End Sub これを自宅のWindowsXP エクセル2003でうごかすと実行時エラーがでます。 「実行時エラー448 名前付き引数が見つかりません。」となってしまうのです。 Sub test02() ActiveSheet.Protect , UserInterfaceonly:=True End Sub とすれば動くのですが、そうするとシートに保護がかかっているのでパスワードを聞いてくるようになってしまいます。 エクセル2003ではどのように書くべきなのでしょうか?できれば2000も2003も共通の記述でOKになるようにしたいのですが。 ご教示をお願いします。

  • VBAでブック保護非保護を判定するには?

    エクセルVBAでブックが保護されているのかどうかを判定するにはどう書けばいいのでしょうか? If ActiveWorkbook.Protect Then ではだめでした。 また、シート保護の判定方法も教えてください。

  • EXCEL VBAで条件付き保護について

    VBA初心者です、よろしくお願いします。 列Eでオートフィルタを使用可能と設定したいので、下記のようにしましたが、「シートの保護を設定」のステップを終えた後オートフィルタも使用できません。 「AllowFiltering:=True」でEXCELのオートフィルタの使用にチェックを入れた状態になると考えていましたが、思うようになりませんでした。 「シートの保護を設定」のステップがおかしいと思うのですが、わかりません。 教えてください。 ------------------------------------------------------ Private Sub Auto_Open() '一旦、シート保護を解除 ActiveSheet.Unprotect Password:="AAA" 列Hのデータを重複データを無視で列Oに抽出 セルH2は「入力規則-リスト」~列Oのデータを使用   ・   ・   ・ ' シート保護を設定 ActiveSheet.Protect Password:="AAA", UserInterfaceOnly:=True, AllowFiltering:=True End Sub

  • エクセルVBA/原因不明の保護解除?!

    下記のコードを実行すると、終了後次回立ち上げたとき、シートの保護が解除されています。 コードではオブジェクトを含めてシートを保護し、終了時には「保存」をしているのですが、なぜか次の立ち上げでは保護が解除されています。 原因がわかりません。お助けください。 Sub Test01() Dim s, i, cr With ActiveSheet .Protect Password:="aaa", DrawingObjects:=False, Contents:=True, Scenarios:= _ True, UserInterfaceonly:=True 'オブジェクトのみ保護解除 Cells.Interior.ColorIndex = 1 'シートを黒色に Set s = .Shapes.AddShape(msoShape4pointStar, 100#, 125#, 200#, 200#) '星を配置 s.Fill.Visible = msoTrue s.Fill.Solid Randomize cr = Int((30 * Rnd) + 1) s.Fill.ForeColor.SchemeColor = cr '色をランダムに For i = 1 To 300 '点滅 s.Visible = False DoEvents s.Visible = True DoEvents Next s.Delete '星を削除 .Protect Password:="aaa", DrawingObjects:=True, Contents:=True, Scenarios:= _ True, UserInterfaceonly:=True 'オブジェクトも保護 Cells.Interior.ColorIndex = 0 'シートをもとにもどす End With ActiveWorkbook.Close '終了する End Sub

  • 下記のVBAを他のワークシートにも適用する方法?

    下記のVBAを他の同じエクセルファイル内の他のワークシート(Sheet2,Sheet3,Sheet4)にも反映するためにはどのようにしたらよろしいでしょうか? 現在書きVBAを本ワークブックという箇所に貼り付けております。 お手数ですがご教示いただきます様お願いいたします。 Private Sub Workbook_Open() With Sheets("Sheet1") .EnableOutlining = True .Protect Password:="****", UserInterfaceonly:=True End With End Sub

  • エクセルのマクロをブック全体に

    マクロに関してはずぶの素人です、Q&Aのサイトで目的にかなったものを見つけ 設定したら結果は満足するものでした。 「シートを保護した状態で、グループ化の表示・非表示を切り替えるマクロ」 Sub Auto_Open() With Worksheets("Sheet1") .EnableOutlining = True .Protect UserInterfaceOnly:=True End With End Sub これをブック全体に反映できるマクロを教えて下さい。 ブック内のシート数は多いもので10シートほど、シート名は和英混合です。 ブックの数は40程有り全てのシートにマクロを設定するのは途方もなく 時間が掛かりそうで困っています。 当方のエクセルはExcel2007SP3です、宜しくお願いします。

  • エクセルVBA 保護シート&フィルタ実行 全シート

    VBA超初心者です。 たくさんのシートのあるエクセルで、 シート保護後もフィルタを使用できるようにVBAを設定したいと思ってます。 (現在エクセル2000を使用してます) ネットで調べてVBAを設定してみました。 しかし下記のようにするとコンパイルエラーになってしまうのですが、 正しい方法を教えていただけると助かります。 Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean)   Application.CommandBars("Cell").Reset End Sub Private Sub Workbook_Open()   With Application.CommandBars("Cell").Controls.Add( _            Type:=msoControlButton, Before:=1, Temporary:=True)     .Caption = "AutoFilter"     .OnAction = "ThisWorkbook.filter"   End With   With Worksheets.Select     .Unprotect     .EnableAutoFilter = True     .Protect UserInterfaceOnly:=True   End With End Sub Private Sub filter()   On Error Resume Next   Selection.AutoFilter End Sub

  • Excelで新たに追加するシートにも特別なシート保護を適用させたい。

    Excelで新たに追加するシートにも特別なシート保護を適用させたい。 VBAの知識がかなり浅いので質問や記述内容もつたないと思いますがご了承ください。 1つのワークブック内の全てのシートに対し、 シートの保護をかけつつ、グループとアウトライン設定だけは有効にしたいため、 ThisWorkbook内に以下のように記述しました。 Private Sub Workbook_Open() Dim x As Worksheet For Each x In ThisWorkbook.Sheets x.EnableOutlining = True x.Protect Password:="xxxxxxxx", UserInterfaceonly:=True Next End Sub これで既存のワークシートに対しては希望の動きをしましたが、 シートをコピー・複製して増やしていくため、 新たにコピーして追加されたシートに対しては機能しません。 追加したシートにもこの特別な保護が有効になるようにするには、どうしたらよいのでしょうか。 ご教授いただけるとうれしいです。 よろしくお願いいたします。

専門家に質問してみよう