• ベストアンサー

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

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

  • ベストアンサー
  • taocat
  • ベストアンサー率61% (191/310)
回答No.2

こんにちは。 原因は、Protectで、UserInterFaceonly を使った時のバグです。 最後のProtectからそれを外してください。 処理前にはそれ付きでProtectしてますから、 外しても問題は無いですよね。 もちろん最後の Cells.Interior.ColorIndex = 0 'シートをもとにもどす と順番を逆にしないといけませんが。 ------------------------------------------------- Cells.Interior.ColorIndex = 0 'シートをもとにもどす .Protect Password:="aaa", DrawingObjects:=True, Contents:=True, Scenarios:= _ True'オブジェクトも保護 -------------------------------------------------- 以上です。

merlionXX
質問者

お礼

2000で確認がとれました。 おっしゃるとおりでした。 ありがとうございました。

merlionXX
質問者

補足

ありがとうございます。 バグでしたか!? ただし、2003では解消されているようですね。 今、手元にある2003でやってみましたが再現できませんでした。 連休明けに2000で試してみます。

その他の回答 (1)

  • stouma
  • ベストアンサー率35% (142/399)
回答No.1

面白いプログラムですね。 さて、私のPCでも動作確認に対しました。 Excel2003 Sheet1にてマクロを起動させました。 終了後、一度Excel自体も終了し起動しましたが、 Sheet1は保護されてましたよ。 当然他シートは保護されてませんけどね。(ActiveSheet)

merlionXX
質問者

お礼

ごめんなさい。 コードの改行が変になっちゃいました。 Sub HENDAYO() ActiveSheet.Protect Password:="aaa", DrawingObjects:=True, Contents:=True, Scenarios:= _ True, UserInterfaceonly:=True ActiveWorkbook.Close End Sub 以上です。

merlionXX
質問者

補足

早速ありがとうございます。 エクセルのバージョンを書かなかったですね、すみません。2000です。 話を簡単にするために下記のように書き直して試しました。 Sub HENDAYO() ActiveSheet.Protect Password:="aaa", DrawingObjects:=True, Contents:=True, Scenarios:= _ True, UserInterfaceonly:=True ActiveWorkbook.Close End Sub やはり保護されていません。 ひょっとして保存されてないのかとおもい、シートに変更を咥えたらちゃんと反映してましたので、保護だけが反映しないようです。 ActiveWorkbook.Saveを書き加えれば保護されてます。 変だよ~!

関連するQ&A

  • エクセル:常に保護をかけるがマクロは有効

    シートに、マクロ実行時以外保護をかけておきたいです。 (マクロで、ロックをかけたセルを操作したいので) 「マクロを記録する」で保護をかける操作を記録してもらったところ、 「許可する操作」は以下の記述で実行されるようです。 ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ AllowInsertingColumns:=True, AllowInsertingRows:=True, _ AllowDeletingColumns:=True, AllowDeletingRows:=True ここに「マクロからの変更は有効」の UserInterfaceOnly:=True を加えた以下のコードは、 ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ AllowInsertingColumns:=True, AllowInsertingRows:=True, _ AllowDeletingColumns:=True, AllowDeletingRows:=True, UserInterfaceOnly:=True どのSubに記述すればよいでしょうか。 ワークシートに直接書込むんですよね? Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub に書いてみたら一時期正常に動いていたと思うのですが、どうやら勘違いだったみたいです。 ActiveもChangeも違うようなのですが(なぜかどちらも一時は動いたような…)。

  • シートの保護につきまして

    行・列の追加削除だけ、無効にする方法は ありますか? 単にシートを保護するだけなら下記で行っております。 ActiveSheet.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True ご回答のほど、よろしくお願いいたします。

  • EXCEL VBA シート保護のエラー

    こんにちは。 ここでいろいろ質問をさせていただき、なんとかマクロを完成させましたが・・・ 自分のPCで動かす分には、なにも問題なくうごくのですが、他のPCで動かしたところ”1004”のエラーが出てしまい動かなくなりました(”1004”は、アプリケーション定義がなんとかいうものです) Private Sub CommandButton1_Click() Worksheets("A").Unprotect Password:="○○○" Worksheets("B").Unprotect Password:="○○○" Worksheets("B").Range("B50:L100").ClearContents Worksheets("A").Range("B50:L100").AutoFilter field:=1, Criteria1:="=" Worksheets("A").Range("B50:L100").Copy Worksheets("B").Range("B50") Worksheets("B").Range("B36:L100").Interior.ColorIndex = xlNone Worksheets("A").AutoFilterMode = False Worksheets("A").Protect Password:="○○○", DrawingObjects:=True, Contents:=True, Scenarios:=True _ , AllowFormattingCells:=True Worksheets("B").Protect Password:="○○○", DrawingObjects:=True, Contents:=True, Scenarios:=True _ , AllowFormattingCells:=True End Sub 黄色くなるところは、 Worksheets("A").Protect Password:="○○○", DrawingObjects:=True, Contents:=True, Scenarios:=True _ , AllowFormattingCells:=True の部分です。そして画面には10枚あるすべてのシートのエラーが・・・。 Worksheets("A")と指定しているのに、10枚全てのエラーがでるのも?だし、自分のPCではうまくいくのに他ではダメというところが分かりません。よろしくお願いします。

  • 保護の解除・設定

    いつもありがとうございます。 現在シートの保護がパスワード入りでかかっています。 マクロで保護を解除するときに、 パスワードを入力不要で解除できませんか? また、引続きシートを保護するときに、 パスワードを入力しないで、元の、パスワードで、 保護が出来るでしょうか? 現在は、下記のようになっています。 (マクロの記録でしか作れませんので・・、) ActiveSheet.Unprotect ActiveWindow.SmallScroll Down:=24 Range("B50:X69").Select Selection.Copy ActiveWindow.LargeScroll Down:=-2 ActiveWindow.LargeScroll ToRight:=-3 ActiveWindow.SmallScroll Down:=-9 Range("B1").Select ActiveSheet.Paste Range("B2").Select Application.CutCopyMode = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True 以上、よろしくお願い致します。

  • エクセルVBAでのバージョン情報の取得

    エクセル2000,2002の混在の職場にいます。 マクロで文字色の変更を試みましたが、エクセル2002のシート保護の機能が高くなっている為、2000と20002とでシート保護命令を変える必要が生じました。 (2002ではProtect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFormattingCells:=Trueは有効ですが、2000ではマクロがバグってしまいます) そこで、IF ○○とエクセルのバージョン情報を参照する手段をご存じの方、教示願います。

  • Excelファイルを開いた時に、特定のシートに保護をかけたいです。

    Excelファイルを開いた時に、特定のシートに保護をかけたいです。 http://okwave.jp/qa/q6067314.html 本日質問しましたカーソルの変な動作の原因というか引き金がわかりましたので、 再度質問致します。 Sheet1, Sheet2, Sheet3の3シートがあるExcelファイルを開いた時に、Sheet2に保護をかけたいです。 そこで、 ThisWorkbookの中に、以下のように記述しました。 Private Sub Workbook_Open()  Worksheets("Sheet2").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True  Worksheets("Sheet2").EnableSelection = xlUnlockedCells  'マクロ使用時には保護を無視したい End Sub このように記述し、Excelファイルを開くと、Sheet2に保護がかかります。 ただし、 (Excelファイルを開く際は、「前回保存時に開いていたシートで開く」と思うのですが、) このExcelファイルをSheet1またはSheet3を表示させた状態で保存すると、 次にこのExcelファイルを開いた時になぜかSheet1または3にも保護がかかってしまいます。 この「Sheet1または3にかかった保護」は、一度別のシートに切り替えることで解除される一時的なものなのですが、 なぜ指定していないSheet1または3にも保護がかかってしまうのでしょうか。 ThisWorkbookへの書き方がまずいでしょうか。 以上、知っている方いましたらよろしくお願いいたします。

  • エクセルのマクロ実行後にカーソルが見えなくなった

    ThisWorkbook内に以下のコードを記述し、Sheet1に保護をかけています。 Worksheets("Sheet1").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True Worksheets("Sheet1").EnableSelection = xlUnlockedCells マクロで、 1.保護しているSheet1をコピーし、シートを新たに作成。 2.そのシートを「Sheet2」にリネーム。 3.Sheet2を保護。 という操作をしています。 Sheet2への保護に使っている記述は上に挙げたコードと同じです。 このマクロを実行すると、 作成したSheet2においてセルに載るカーソル(黒枠)が見えなくなっていまいます。 クリック後にキー入力をすると文字は入るので見えなくなっているだけのようです。 同じ記述で保護しているSheet1は普通にカーソルは見えています。 マクロの「3.Sheet2を保護」をコメントアウトすると、普通にカーソルが見えるようになります。 何故カーソルが見えなくなってしまうのでしょうか。

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

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

  • シートの保護について

    特定のセル("C3:I3")を編集不可にしたいのですが、 下記プログラムにするとすべてのセル(シート)が保護されてしまいます。 どこがおかしいのでしょうか。 Private Sub CommandButton1_Click() ActiveSheet.Unprotect ・・・・・・・・・・ Range("C3:I3").Locked = True ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub

  • EXCEL(VBA)でシート保護がかかったシートにクリックボードから貼り付けしたい

    EXCEL2000のVBAで、クリップボードにコピーしたデータ(複数のセル範囲)を、シート保護がかかった別のシートにコピーする操作を行ないたいと考えています。 手順としては「1.クリップボードにコピー」→「2.シート保護解除」→「3.貼り付け」→「4.シート保護」なのですが、下記マクロを作成して試してみたところ、2.のシート保護解除を行なった時点でクリップボードが空になるようで、「実行時エラー'1004':RangeクラスのPasteSpecialメソッドが失敗しました。」と表示され貼り付けができません。 これについて何か回避策はないでしょうか? Range("A1:C3").Select Selection.Copy Sheets("貼り付け先シート").Select ActiveSheet.Unprotect Range("A1").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True 以上、よろしくお願いします。

専門家に質問してみよう