• ベストアンサー

Excel マクロ ifステートメントでシート保護を判別するには?

こんにちは。 Excelでマクロを作成していますが、どうしても解らないので質問しました。 解る方いましたら回答よろしくお願いします。 ifステートメントで「シート保護」の有無を条件にしたいのですが、うまくいきません。  if activesheet.unprotect = true then   処理1  else   処理2  end if としていますが、「シート保護」の有無に関係なく、常に処理2となってしまいます。

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

  • ベストアンサー
noname#240783
noname#240783
回答No.1

Unprotectは「メソッド」ですねぇ。 シートまたはブックの保護を解除します。 ですから、いつも結果が同じになってしまいます。 ご質問の場合は、例えば If ActiveSheet.ProtectContents = True Then MsgBox "処理1" Else MsgBox "処理2" End If のように、ProtectContentsプロパティを判別すれば いいと思います。 他に、ProtectWindow、ProtectStructure等々関連プロパティが ありますのでヘルプで検索して検討してみてください。

bear-fruit
質問者

お礼

回答ありがとうございます。 ProtectContentsプロパティにより無事動作しました。 ありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

if activesheet.unprotect = true then をif ActiveSheet.ProtectContents = true then と ProtectContentsプロパティを使うのだろうと思います。 他にProtectScenarios、ProtectStracture、ProtectDrawingObjectsなどと分かれているようです。

bear-fruit
質問者

お礼

回答ありがとうございます。 ProtectContentsプロパティにより無事動作しました。 ありがとうございました。 他に教えていただいたプロパティについても勉強してみます。

関連するQ&A

  • 行ごとに保護するマクロにパスワードを付けたい

    Excel2010を使用しております。 A列に「承認」という文字が入ると、その行が保護されるマクロがあります。 今の状態ですと、[校閲]-[シート保護の解除]を押すと解除されてしまいますので 保護を解除する際にパスワードを設定したいのですが上手く行きません。 どうかお助け下さい。宜しくお願い致します。 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, AllowFormattingCells:=True End If End Sub

  • マクロ シートの保護

    下記のマクロにおいて、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

  • エクセル シートを保護してる時のセル結合

    エクセル2010を使用しています。 仕事の成果を一定の様式に記入してもらいます。書式、関数などを変更してもらいたくないのでシートに保護をかけました。 記入してもらうところだけセルのロックをはずし入力OKに設定しました。 しかし、シートの保護をかけるとロックをはずしててもセルの結合はできないんですね。なので、過去の質問からシートの保護がかかっていてもマクロですべての操作をしようできるというマクロ↓を参考にしてみました。 Sub seru() ActiveSheet.Protect UserInterFaceOnly:=True End Sub これと、セルを結合するマクロ↓を考えたのですが、どのように2つをくっつけたらいいのかがわかりません。 If TypeName(Selection)="Range"and Selection.Cells.Count>1 Then Selection.Merge ActiveSheet.Protect,AllowFormattingCells:=True End If 何かぬけているのかマクロを実行しても全く働いてくれません。 どうかよろしくです。

  • Excel 2000にて特定のシート(シート名 1~30)セル保護をし

    Excel 2000にて特定のシート(シート名 1~30)セル保護をしていないデータ(結合セルを含む)を一括削除を行いたいのですが、サイトで見つけた物を使用してみたのですが、うまくいきませんでした。 よろしくお願いします。 Sub test2() ? Dim c As Range ? With ActiveSheet ??? .Unprotect ??? For Each c In .UsedRange ????? If Not (c.Locked) Then c.MergeArea.ClearContents ??? Next ??? .Protect UserInterfaceOnly:=True ? End With End Sub シートは40枚程あるのですが、削除したいのはシート1~30迄のデータです。 マクロのレベルは初級レベルです。 よろしくお願いします。

  • エクセルのマクロ(オートフィルタとテーブル)

    こんにちは! エクセル2016を使用しています。 下記のようなマクロを書いたのですが、長くて不細工ですよね。 もう少し簡単にする方法ってありますでしょうか? それと動作がちょっと遅いので、動作も早くなれば助かります。 Sheet1に下記のマクロを Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Address = "$G$5:$H$5" Then  Else: Call 処理1  End If    If Target.Address = "$G$73:$H$73" Then  Else: Call 処理2  End If    If Target.Address = "$G$141:$H$141" Then  Else: Call 処理3  End If 。。。処理48までつづく  End Sub Module1に下記のマクロを書いてます。  Sub 処理1()  ActiveSheet.ListObjects("テーブル1").AutoFilter.ApplyFilter  End Sub  Sub 処理2()  ActiveSheet.ListObjects("テーブル2").AutoFilter.ApplyFilter  End Sub  Sub 処理3()  ActiveSheet.ListObjects("テーブル3").AutoFilter.ApplyFilter  End Sub 。。。処理48までつづく

  • シートの保護解除を、変数で試したい

    はじめて質問します。よろしくお願いします。 常用のパスワードを配列に準備しておき、 ActiveSheet.Unprotect Password:=mystrを実行して、保護解除ができない場合に、 パスワードを変更するようにエラー処理をして、適合するパスワードを探すようにしました。 結果、excel20101では、予定の動きをするのですが、 excel2007では、(1)を実行後、パスワードを求めるダイアログがでて、(2)以降を実行してしまいます。 Public Sub test() tt = False ps = Array("test", "rrr", "1234", "123", "qqq") p = 0 mystr = "" Application.DisplayAlerts = False Worksheets(1).Activate On Error GoTo e1 ActiveSheet.Unprotect Password:=mystr '・・・・(1) On Error GoTo 0 Application.DisplayAlerts = True          '・・・・(2) MsgBox mystr tt = True Exit Sub e1:   '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・(3) If p < UBound(ps) Then mystr = ps(p) p = p + 1 Resume Else mystr = InputBox("??", "EE", "") If mystr = "" Then Exit Sub Else Resume End If End If End Sub この Application.DisplayAlerts = False や On Error GoTo によるエラー処理は、 1 2010では機能するのに、2007では機能していないのでは?   *どこかに、設定する場所があるのでしょうか。 2 2007でも、シート保護の解除以外の時では、この記述で機能するのですが・・・・ <やりたいこと> 複数のユーザー作成のBookは、それぞれのパスワードが決まっている。ユーザーごとのパスワードをマクロで解除したいのですが、うまくいきません。  だらだらと、長い文章で分かりにくい質問ですが、どなたか、ご教授をお願いします。

  • Excel VBAで「こういう状態の時にトグルボタン押下」は?

    Excelで、シートの保護をするためのトグルボタンをつけています。 (押してある時は保護) よく考えたら、ツールバーから保護された時にも ボタンが押下状態にならないと使いづらいのではないかと思い、 If ActiveSheet.protect Then ボタン名 = True End If If ActiveSheet.Unprotect Then ボタン名 = False End If とやってみたんですが、うまく機能しません。 どうしたら良いのでしょうか?

  • ExitでIFステートメントを抜けたい

    Sub test() Dim n As Byte, i As Byte For i = 0 To 5   If n = 0 Then    n = n + 1   Else    Exit For '(1)ここから   End If i = i + 1 '(2)ここへ来たい(IFステートメントだけ抜けたい) Next i End Sub のように(1)から(2)へ行きたいのですが このコードを実行すると Forステートメントを抜けてしまい、マクロが終了してしまいます。 「Exit If」にするとエラーになってしまいます。 Exitを使用してIFステートメントだけ抜け、 Forステートメントに戻るにはどうすればいいでしょうか? ご教授よろしくお願いします。

  • IFステートメントの使い方 どちらでもないならば

    「出金も入金も0じゃないならば」としたい場合、どのようなifステートメントを作ればいいでしょう? Sub test() Dim 出金 As Currency Dim 入金 As Currency 出金 = 0 入金 = 0 '(1) If Not (出金 = 0) And Not (入金 = 0) Then MsgBox "出金0入金0ではありません" End If '(2) If (出金 = 0) And (入金 = 0) Then Else MsgBox "出金0入金0ではありません" End If End Sub (1)だとうまくいきません。 (2)のように Elseを使って対応するしかないのでしょうか? (2)でいけますが、今後の勉強の為にelseを使わずに、「どちらでもないならば」の方法を教えてください。

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

    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で調べて見つけたマクロをちょっと加工して使う程度です。 どうか知恵をお貸しください。よろしくお願いします。

専門家に質問してみよう