マクロのクリア設定がシートの保護を行うと機能しない理由

このQ&Aのポイント
  • マクロのクリア設定を行っている際に、シートの保護を行うとマクロが機能しない理由について説明します。
  • マクロを設定している場合、シートの保護を行うとマクロが制限されることがあります。
  • 特に、セルの保護設定が影響を与える場合があります。d列では「ロックなし」「表示する」、e列では「ロックなし」「表示しない」となっているため、マクロのクリア設定が正しく機能しない可能性があります。
回答を見る
  • ベストアンサー

マクロのクリア設定がシートの保護を行うと機能しません

マクロ、超初心者です。 どうにか、下記マクロを設定しました。 On Error Resume Next With ActiveSheet.Range("d:e").SpecialCells(xlCellTypeConstants, 23) .ClearContents End With シートの保護を行うと、上記マクロが機能しません。 ちなみに、セルの保護の状態は、 d列----「ロックなし」「表示する」 e列----「ロックなし」「表示しない」(数式が入っています) お暑いところ・お忙しいところ申し訳ありませんが、 どなたか、ご教授ください。 よろしくお願いいたします。

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

>sheet全てにプロテクトがかかってしまうという状況になり・・ 意味がよく解りませんが・・・。 マクロでは保護の掛かったシートを変更することができないので、プログラムを組む場合はそのことを頭に置いて、保護の解除と保護を適切なところで行う必要があります。 基本的には、保護シートを操作するマクロの先頭に「保護の解除」、最後に「保護」のコードを記入すれば良いのですが・・・。 保護設定のオプションもエクセルのバージョンによって違うので書きませんでしたが、記録マクロを使って保護を設定すれば、保護オプションを含めたコードを取得できるので、書き換えれば良いでしょう。 マクロで何度も保護の解除と保護設定をしなくても済むようにする方法がありますが、エクセル起動時に一度だけ実行して置く必要があります。 ActiveSheet.Protect UserInterfaceOnly:=True http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_030_040.html

sabotani17
質問者

お礼

ありがとうございました。 どうにか、設定することができました<__>

sabotani17
質問者

補足

お忙しいところご回答いただきありがとうございました。 マクロを組んでいる際は、シート保護をかけていないのですが、 マクロ1(ソート) Sub test() Range("A6:C111").Select Selection.Sort Key1:=Range("A6"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("D6").Select End Sub マクロ2(クリア) On Error Resume Next With ActiveSheet.Range("d:e").SpecialCells(xlCellTypeConstants, 23) .ClearContents End With 2つのマクロを設定した後、シート保護をかけた段階で、 ソートのマクロはうまく機能いくのですが、クリアのマクロが機能しません (;;) 的外れな、補足かもしれませんが・・・ ご助言いただけると、助かります。

その他の回答 (1)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

マクロで、シート保護の解除と保護の設定を行うだけです。 sub test() ActiveSheet.UnProtect '処理 ActiveSheet.Protect end sub

sabotani17
質問者

お礼

ありがとうございました。 どうにか、設定することができました<__>

sabotani17
質問者

補足

早々にご回答ありがとうございます <(__)>。 ご回答いただいたマクロを利用すると、sheet全てにプロテクトがかかってしまうという状況になり・・・エラーになってしまいます。 実は、もう一つマクロ↓を入れておりまして、 Sub test() Range("A6:C111").Select Selection.Sort Key1:=Range("A6"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("D6").Select End Sub このマクロを実行した後に、d列およびe列のセル内容表示をクリアし、 『d列は、再入力できる状態に、e列は結果を表示』 を繰り返し行えるようにしたいのですが・・・。 お力を貸して頂けると幸いです。

関連するQ&A

  • Excelのマクロについて教えてください。

    Excelのマクロについて教えてください。 下記のマクロがあります。 With Range("A" & Rows.Count).End(xlUp) .EntireRow.Copy .Offset(1) .Offset(1).EntireRow.SpecialCells(xlCellTypeConstants).ClearContents .Offset(1).Value = .Value + 1 End With 実際にデータが入っているのはA列~E列までで .EntireRow(行全体)ではなく A?:E? と範囲を指定して上記を実行させたいのですが どのように変更するといいでしょうか。 よろしくお願いします。

  • マクロ シートの保護

    下記のマクロにおいて、A列以外のセルに文字なり数字なりを書くと、シートの保護が解除されてしまいます。 また、保護が解除されている状態でA列に20091010と入力してマクロを実行させるとシートが保護されます。 ずーっと保護された状態を続けるようにするにはどのようにすればよいですか? Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim r As Range Dim flg As Long flg = 0 If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect flg = 1 End If If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub 'A列のみを対象 最初につなげるところ For Each r In Target Dim a As Long Dim b As String With r If Not .NumberFormatLocal = "ge.m.d" Or .Value = "" Then .NumberFormatLocal = "G/標準" 'セルの書式設定がH00.m.d形式だったら標準に戻す 'セルが 数字    且      整数    且  101以上  且    991231以下 の場合 If IsNumeric(.Value) And Int(.Value) = .Value And .Value >= 19010101 And .Value <= 20991231 Then b = Left(.Value, 4) & "/" & Mid(.Value, 5, 2) & "/" & Right(.Value, 2) If IsDate(b) Then 'もしbがDateの形なら .Value = CDate(b) 'データ型を日付にする 'ここにつなげる。 変数はtmpからbに直す .NumberFormatLocal = "ggg" & _ IIf(Format(b, "e") > 9, "e年", "_0e年") & _ IIf(Month(b) > 9, "m月", "_1m月") & _ IIf(Day(b) > 9, "d日", "_1d日") If ActiveSheet.UnprotectContents = True Then ActiveSheet.Protect flg = 1 End If End If End If End With Next If flg = 1 Then ActiveSheet.Protect End Sub

  • エクセルで2つのマクロを結合したい

    毎度お世話名なっております。 以前ここで教えてもらった保存時に全シートの入力済みセルに自動で保護がかかる<マクロ1>を教えてえもらって非常に多くのBookに採用しているのですが、今回同じBookの「計算表」シートの特定のいくつかのセルだけ保護がかからないようにしたく試行錯誤で2つのマクロをつなげてみたのですが情けないことに期待通りに動かず。 単に最初のマクロのEnd Subを削除しただけではうまくいかず。 どなたかHELPお願い致します。 <マクロ1> Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const MyPassword = "" 'パスワード(省略可) Dim sh As Worksheet On Error Resume Next For Each sh In Worksheets sh.Unprotect Password:=MyPassword With sh.Cells '全セルのロックを外す .Locked = False '定数が含まれているセルにロックを掛ける .SpecialCells(xlCellTypeConstants).Locked = True '数式が含まれているセルにロックを掛ける .SpecialCells(xlCellTypeFormulas).Locked = True End With sh.Protect DrawingObjects:=True, Contents:=True, _ Scenarios:=True, Password:=MyPassword Next On Error GoTo 0 End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub 保護解除() <マクロ2> ' 保護解除 Macro '' Sheets("計算表").Select Range("C6:D6").Select ActiveSheet.Unprotect End Sub

  • マクロ、串刺しの指定範囲のみの値をクリアー

    WINDOWS XP EXCELL 2003です。 現在値のみのクリアーを下記のマクロを使用しています。 Sub Clear() On Error Resume Next Cells.SpecialCells(xlCellTypeConstants).ClearContents End Sub 不必要ななセルの値までクリアーする不都合があります。 御指導を仰ぎたいのは下記の範囲の値のみをクリァーするには上記のマクロをどう変更すればいいでしょうか。     H2 G4 C10 C15 F15 G15 もし可能ならばご教授いたたけませんてしょうか。 よろしく御願いします。

  • マクロを書き変えたいのですが、

    マクロを書き変えたいのですが、 現在使用してる 下記のマクロがあるのですが、 このマクロに Sheet1~Sheet18までの セル E12・E14・F14データーを消す式を足したいのですが、 どのように書いたらよいでしょうか? Sub 打ち出しデーター削除() ' ' 打ち出しデーター削除 Macro ' 打ち出しシートの時間・判定を クリアーにする。 ' ' Sheets("打 ち 込  用 ").Select Application.ScreenUpdating = False Selection.SpecialCells(xlCellTypeConstants, 1).Select Selection.ClearContents Sheets("★スタッフ一覧").Select Range("A1").Select End Sub あと シート数を指定しない場合も知りたいのです。 どなたか 力を貸してください。

  • シートの移動又はコピー したシートの値のクリアー

    WINDOWS XP EXCELL 2003です。 「値のクリァー」のマクロはすでに、 ここで御指導いただいたマクロは下記です。 http://okwave.jp/qa/q6663748.html Sub Clear() On Error Resume Next range("H2,G4,C10,C15,F15,G15").SpecialCells(xlCellTypeConstants).ClearContents End Sub 上記マクロは「納請書3」にそうにして「シート追加」で「納請書4」作成したところ下記のマクロを実行すると「納請書3」のシートの値がクリアーになります。 御指導いただきたいのは既に「納請書3」値が有りこれはクリアーしたくありません。 新たにシートを追加してゆくと前のシートの値か残り追加シートの値をクリアーするにはクリアーは可能でしょうか。 もし可能ならば「値のクリアー」のマクロをどう変更すればいいのかご教授いただけないでしょうか。 よろしく御願いします。 ※ 参考で既に「納請書3」のシートには下記マクロの2点が登録しています。 1  「シートの追加」のマクロが下記です。 Sub シートの追加()    Dim NewNo As Integer   NewNo = Sheets("月請求書").Index Sheets("納請書3").Copy Before:=Sheets("月請求書")   ActiveSheet.Name = "納請書" & NewNo   ActiveSheet.Range("G4").Value = "" End Sub 2  日付とシート表示の色付け    Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$10" Then Target.Offset(-6, 2).Value = Date End If If Target.Address = "$G$15" Then ActiveSheet.Tab.ColorIndex = 49 End If End Sub

  • EXCELのマクロのシートを指定する方法

    下記にあるEXCELのマクロは、以前こちらのサイトで教えて頂いたマクロです。 私の質問の仕方がまずかったのですが、シートが指定ではなくて、次のシートとなっています。 これを、1列の元データがシート2で新しく貼り付ける場所をシート1という風に変更したくていろいろやってみましたが、EXCELのマクロ自体、初心者で全然できませんでした…。 どなたか教えて頂けないでしょうか?よろしくお願いします。 下記のマクロは 【Excel2003でA列に1行にあるデータ(半角英数字)を次のシートに、1行ずつコピーして、それを5列に振り分けするというマクロです(ただし、コピーは2つずつの時もあります。) 元データ(これをシート2にしたい) ●A列 B列 C列  1  2  3  4  5  ・  ・ 加工後 (シート1に貼り付けたい) ●A列 B列 C列 D列 E列   1   1   2   2   3   3   4   4   5   5  『sub macro1()  dim i as long, j as long, k as long  dim n, m  on error resume next  k = application.inputbox("duplication", type:=1)  if k = 0 then exit sub  activesheet.next.range("A:E").clearcontents  for n = 1 to range("A65536").end(xlup).row   for m = 1 to k    activesheet.next.cells(j + 1, i + 1).value = cells(n, "A").value    i = (i + 1) mod 5    j = iif(i = 0, j + 1, j)   next m  next n  activesheet.next.select end sub』

  • 指定した範囲内が空白なら行削除するマクロ

    エクセルで指定した範囲内(A列からC列まで)で何も文字が入っていなければ(空白)、行を削除する、というマクロを教えてください。 いくつか調べて、以下を試しましたが、何も動作しませんでした。 どなたかアドバイスをいただければ助かります。 よろしくお願いします。 Sub DeleteBlankRows2() Application.ScreenUpdating = False On Error Resume Next With Columns("A:C") .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = True .SpecialCells(xlCellTypeComments).EntireRow.Hidden = True .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With Application.ScreenUpdating = True End Sub

  • 保護されているシートでマクロ実行するとエラー

    Excel2010で勤務表を作っています。 A列にとある文字列(承認)と入力すると、その行が保護されるマクロを、下記URLからコピペして使わせて頂いてます。 http://questionbox.jp.msn.com/qa3277541.html 勤務表なので、土日祝日は網掛けになるよう条件付き書式を使っています。 休暇取得した場合は網掛けを付けて、休日出勤した場合には網掛けなしにしたり出来るようマクロをマクロの自動記録で作りました。 ところが、どこかの行が保護されている状態で、セルの網掛けを変更するマクロを実行すると 「実行時エラー'1004'アプリケーション定義またはオブジェクトの定義エラーです」と出てしまいます。 保護されている行ではなく、まだ保護はされていない行に実行しています。 エラーが出ているのは網掛けマクロから出ています。 以下、今エクセルファイルにあるマクロの構文になります。 網掛けマクロは全部で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 ※この中のSelection.FormatConditions.Add Type:=xlExpression, Formula1:= _ "=WEEKDAY($B6,2)>=6"の部分がエラーと出ています。 ※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 6)行ごとに保護するマクロです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r, rng As Range Set rng = Intersect(Target, Columns(1)) If Not rng Is Nothing Then If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If For Each r In rng If r.Value = "承認" Then r.EntireRow.Locked = True Else r.EntireRow.Locked = False End If Next r ActiveSheet.Protect DrawingObjects:=True, Contents:=True End If End Sub マクロに関してはド素人で、自動記録かWebで調べて見つけたマクロをちょっと加工して使う程度です。 どうか知恵をお貸しください。よろしくお願いします。

  • マクロで不要な行を削除したい

    エクセル97を使っています。  日付 名前 品目 ・・・  1 2 3 ・ ・ といった表で、日付は2003/2/13という表示になっています。 そこで、今日以前(今日は含まない)の日付の行を削除してしまいたいのですが どうすればいいでしょうか? ちなみに、空白行を削除するのに、 Application.ScreenUpdating = False On Error Resume Next With Columns("E:F") .SpecialCells(xlCellTypeConstants).EntireRow.Hidden >=TODAY() .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden >=TODAY() .SpecialCells(xlCellTypeComments).EntireRow.Hidden >=TODAY() .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With このような記述を使っています。 「今日」というとTODAY()関数ですよね。 でも、関数ってマクロに組み込めるのでしょうか? しかも「今日以前」という記述はどうすればいいのか? など考えると、わけがわからなくなりました。 今日以前の行を削除するマクロを教えてください。 ちなみに、日付の行では、曜日を追記する関数を使っております。 条件書式も3パターン使い切っております。 よって、マクロで行いたいです。 宜しくお願いします。

専門家に質問してみよう