[[20130307145217]] 『シート保護とマクロ』(くま) ページの最後に飛ぶ

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

 

『シート保護とマクロ』(くま)

はじめまして。シートの保護をするとマクロが動かなくなってしまいました。

マクロで並べ替えをするだけのボタンを作りました。

Sub 並べ替え()
Private Sub Workbook_Open()

    ActiveSheet.Unprotect
Range("A13:AR100").Sort _
        Key1:=Range("F14"), _
        Order1:=xlAscending, _
        Header:=xlYes, _
        Orientation:=xlTopToBottom
        ActiveSheet.Protect UserInterfaceOnly:=True
End Sub

色々な人が触るシートなので、気づくと中身が削除されいたため、
セルを選んでシートの保護をしてみました。
今度はマクロが動かなくなってしまいました。

この上記のマクロの中に、
「シートの保護を外して、並び替えをして、再度シートの保護をする」
という式を加えたいのですが、自分では出来ませんでした。

調べてみてこういう式があるのまではわかったのですが・・

「Private Sub Workbook_Open()

    ' 一旦、シート保護を解除
    ActiveSheet.Unprotect
    ' シート保護を設定(UIのみ)
    ActiveSheet.Protect UserInterfaceOnly:=True」

どなたかご教授いただけないでしょうか?
バックアップを取ったりして対応していたのですが、それでは対応しきれなくなってしまいました。
宜しくお願い致します。


 ブックを開いたときに、どのシートがアクティブになっているかは、前回保存時に、どのシートをアクティブにして
 閉じたかということによるので、神のみぞしる?

 なので、開いたときの ActiveSheet 指定は感心しないね。
 SHeets("シート名").なんたら と シート名を特定したほうがいいよ。

 さて、アップしたコードで言えば 最初の ActiveSheet.Unprotect が不要で、その場所に
 ActiveSheet.Protect UserInterfaceOnly:=True を移動。
 (ただし、シートは 前述のとおり ActiveSheet はやめようね)

 これによって、操作者からは保護され、マクロは(条件付き書式関連の変更以外は)オールマイティになる。
 注意してほしいのは、何が許可され、何が許可されないかはProtectの引数で規定される。
 (前の条件を継承するわけではない)
 アップされたような形であれば、それぞれの設定値が【省略時の規定値】になる。
 それでいいならOK。心配なら Protectメソッドのヘルプで、それぞれの引数の規定値をチェックしておいてね。

 (ぶらっと)


 #ぶつかりましたけれど、せっかく書いたので一応アップ。

 >Sub 並べ替え()
 >Private Sub Workbook_Open() 
 は無茶ですねw。

 まず、内容を正確に理解したほうが良いように見えます。
 Protect(シート保護)はマクロで実行する場合オプションとして、
 UserInterfaceOnly があり、これはユーザ操作に対してだけシート保護して、
 マクロは処理できる、というものです。

 ですが、これは保護するときにかけても、EXCEL の再起動で無効になってしまう
 ので、EXCEL 起動時(ThisWorkbook の Workbook_Open)でシートの保護の解除、
 シートの保護(UserInterfaceOnlyのオプションを指定して)を行い、
 後は通常通りマクロの処理をするということです。

 ですからThisWorkbook の下の Workbook_Open では 調べたままを処理を記述し、
 ファイルを再起動するれば、その他のマクロはシート保護をかける前と同様に
 実行できるはずですけれど。
 (Mook)


 ぶらっとさんのコメントを見て追記ですが、

 エラーの回避の方法は何通りかあって、上記の他にも従来のマクロの処理の前後
 で保護を解除・設定するという方法もありますし、UserInterfaceOnly の指定も
 起動時ではなくとも実行前に行うことも出来ます。

 ただいずれの場合も、Protect のときのオプションで保護内容を指定する必要があるので、
 そのあたりはネットやヘルプを参照下さい。
http://www.officepro.jp/excelvba/sheet_ope/index2.html
 (Mook)

皆様

返信ありがとうございます。
皆様の返信を見てから気づきましたが、貼り付け間違いをしておりました。

データが消えてあせっていたため、違う並び替えマクロを貼り付けておりました。
わざわざご回答いただいたのに大変申し訳ありません。
再度、ご教授いただければと思います。
使用しているマクロは下記のになります。
宜しくお願い致します。

Sub 並べ替え()
Range("A13:AR100").Sort _

        Key1:=Range("F14"), _
        Order1:=xlAscending, _
        Header:=xlYes, _
        Orientation:=xlTopToBottom
End Sub

 まず、私のレスで

 (条件付き書式関連の変更以外は)とコメントしたけど、これは (入力規則関連の変更以外は)の間違い。

 さて、再度アップされたコードは、標準モジュールに書かれていて、実行時には、必ず、処理したいシートが
 アクティブになっているということだね?

 本当は、この形であっても、どのシートなのかを特定したほうが望ましいんだけど、それは横に置き。

 Sub 並べ替え()  の下に

 ActiveSheet.Protect UserInterfaceOnly:=True  (必要な許可条件を設定するなら引数も記述)

 (ぶらっと)

ぶらっとさん出来ました!
どのシートなのか特定はしていなかったので勉強になりました!

皆様ありがとうございました!!


コメント返信:

[ 一覧(最新更新順) ]


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