- ベストアンサー
保護されているシートでマクロ実行するとエラー
- Excel2010で勤務表を作っています。A列にとある文字列(承認)と入力すると、その行が保護されるマクロを使っています。
- 勤務表には条件付き書式を使い、土日祝日は網掛けになるようにしています。
- 保護されている行ではなく、保護されていない行でセルの網掛けを変更するマクロを実行するとエラーが発生します。保護解除してから実行すると正常に動くようです。マクロについてはあまり詳しくないので、解決策が分かりません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
再掲: >ご自分で改造できない場合は,問題のマクロ(とアナタがいま実際に使ってる保 >護マクロも)を実際のエクセルからコピーしてご質問に明示し,改めて別にご相 >談を投稿してみてください。 ヒトの話きいてますか? とりあえず「考えられる対応その1」で問題がクリアしたと言うことで,なによりです。 その2はトラブルの詳細が不明のまま「考えられる内容」を回答したので,ハズレだったようです。 その3は,今後の課題と言うことで頑張ってみてください。 最初のご相談では「網掛け」としかありませんでしたが,実際には「色々あれもこれもイッパイしたかった」中で,一体どの部分を自動処理にして(=シートモジュールに書く「イベントプロシジャ」で処理させる),どの部分はそれ単独でマクロにする(=標準モジュールに sub macro1() みたいにして書く)のか,あなたが使いやすいやり方を考えて仕事を振り分けてください。
その他の回答 (1)
- keithin
- ベストアンサー率66% (5278/7941)
「シート保護(セルのロック)を制御するマクロ」と「網掛けマクロ」の2つが出てきますが,肝心の,実際にエラーを起こす「網掛けマクロ」がどんなマクロなのか説明が抜けてますね。 ま,とりあえず。。 考えられる方法1: いったんシートの保護を解除する Ctrl+Aでシートの全てのセルの隅々まで選択し,セルの書式設定の保護のロックを外しておく 改めて問題のマクロを作用させてみる。 考えられる方法2: 「保護するマクロ」を次のように変更してみる private sub worksheet_change(byval Target as excel.range) dim h as range activesheet.protect userinterfaceonly:=true set h = application.intersect(target, range("A:A")) if h is nothing then exit sub h.entirerow.locked = (h.cells(1) <> "") end sub いちどどこかのセルに記入して保護マクロを走らせてから,改めて問題の網掛けマクロを使ってみる。 考えられる方法3: 実際には今ナイショの「休暇/休日出勤の網掛け変更」マクロも,上述のworksheet_changeのマクロの中に組み込んだ方が,たぶん話はもっと簡単になります。 ご自分で改造できない場合は,問題のマクロ(とアナタがいま実際に使ってる保護マクロも)を実際のエクセルからコピーしてご質問に明示し,改めて別にご相談を投稿してみてください。
補足
ご回答ありがとうございます。 説明不足で申し訳ありませんでした。 網掛けマクロは全部で4つ作りました。(コレも多分スマートなやり方ではないと思いますが) 1)休日出勤した際に条件付き書式をクリアして網掛けなしにするマクロです。 Sub 休日出勤() ' 条件書式クリア Selection.FormatConditions.Delete End Sub 2)平日休んだ日に網掛けをするマクロです。 Sub 休日() ' 網掛け With Selection.Interior .ColorIndex = 0 .Pattern = xlGray16 .PatternColorIndex = xlAutomatic End With End Sub 3)2)のマクロで休日にしたけど、やっぱり出勤したという時に、1)だと網掛けなしにならなかったので、網掛けなしにするマクロを作りました。 Sub網掛けなし() ' 網掛けなし With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With End Sub 4)ごちゃごちゃいじってしまって最初の状態に戻したいと思ったので条件付き書式を再設定するマクロを作りました。が、2)の休日マクロを実行したセルは元に戻らないので仕方なく3)の網掛けなしマクロを実行しなければなりません。 Sub 書式クリア() ' 条件書式再設定 Range("A6:K36").Select Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ "=WEEKDAY($B6,2)>=6" Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority With Selection.FormatConditions(1).Interior .Pattern = xlGray16 .PatternColorIndex = xlAutomatic .ColorIndex = xlAutomatic End With Selection.FormatConditions(1).StopIfTrue = False Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ "=OR(WEEKDAY($B6)=1,COUNTIF(祝日,$B6))" Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority With Selection.FormatConditions(1).Interior .Pattern = xlGray16 .PatternColorIndex = xlAutomatic .ColorIndex = xlAutomatic End With Selection.FormatConditions(1).StopIfTrue = False End Sub ※1)から3)は網掛けしたいところ、網掛けなしにしたいところを範囲選択してから実行しなければなりません。 その他、保護を解除する際にパスワード認証が欲しかったので、「保護解除」ボタンを押すためにパスワード認証させるマクロもあります。 これは特に問題なく動いています。 5)パスワード認証つき保護解除マクロ Sub password() Dim pw As Long pw = Application.InputBox( _ prompt:="パスワード入力", Type:=1) If pw <> "123" Then MsgBox "パスワードが違います" Exit Sub Else MsgBox "保護解除しました" ActiveSheet.Unprotect End If End Sub 以下はkeithinさんの方法を試してみた結果です。 考えられる方法1: 保護のロックを外した状態ですと、網掛けマクロは問題なく動作しました。 考えられる方法2: 1)の休日出勤マクロを実行すると実行時エラーになりました。 Selection.FormatConditions.Delete 2)と3)は問題なく動きました。 4)もエラーになりました。 Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ "=WEEKDAY($B6,2)>=6" 考えられる方法3: 「休暇/休日出勤の網掛け変更」マクロも組み込みたいと思ってます。 ちなみに、本当に初歩的な質問で申し訳ないのですが、1)から5)のマクロが記述されている場所がそれぞれ違いますが、これも問題の一つなのでしょうか? 1)と5)はMicrosoft Excel Objectsの下のSheet1(勤務表)にあり 2)3)4)は標準モジュールのModule1に記述されています。 長々と失礼しました。
お礼
大変失礼を致しました。 今後気をつけます。 色々とご教示ありがとうございました。
補足
質問を再掲しました。 http://questionbox.jp.msn.com/qa6971639.html