[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『シート保護とマクロ』(くま)
はじめまして。シートの保護をするとマクロが動かなくなってしまいました。
マクロで並べ替えをするだけのボタンを作りました。
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.