サンプル.xlsm というマクロブックがあるとします。
シートは以下の4シート構成になっています。
・メインシート
・説明書1
・説明書2
・説明書3
※初期は説明書1~3は非表示になっています
メインシート上のプルダウンリストの選択に連動して、メインシートのいくつかの行を非表示にし、「説明書1」を表示。
プルダウンを変更するとメインシートの別の行を非表示にし、「説明書1」が非表示になり、「説明書2」を表示、、、といった具合です。
第三者が各シートを編集できないように全てのシートに保護をかけており、
更にシートを操作されないように、ブックの保護もかけています。
シート保護の状態では、行の非表示ができないため、「ActiveSheet.Unprotect」で一時的に保護解除するようにしました。
同様に、シートの表示、非表示操作時に、「ActiveWorkbook.Unprotect」で一時的に保護解除し、
「ActiveWorkbook.Protect」で再度保護をかけているつもりなのですが、
保護が外れたままになってしまいます。
何が考えられるでしょうか?
ちなみに、プルダウンのイベント監視にて以下のような処理をしています。
Select Case Cells(8, 3).Value
Case "説明書1"
ActiveWorkbook.Unprotect Password:="zaisanshobun" '一時的にブック保護解除
ActiveSheet.Unprotect Password:="zaisanshobun" '一時的にシート保護解除
行表示、非表示操作
シート表示、非表示
ActiveWorkbook.Protect Password:="zaisanshobun", Structure:=False, Windows:=False 'ブック保護に戻す
ActiveSheet.Protect Password:="zaisanshobun" 'シート保護に戻す
Case "説明書2"
ActiveWorkbook.Unprotect Password:="zaisanshobun" '一時的にブック保護解除
ActiveSheet.Unprotect Password:="zaisanshobun" '一時的にシート保護解除
≪以下省略≫
End Select
改善点をご教示いただけると幸いです。
No.4ベストアンサー
- 回答日時:
こんにちは。
>ActiveWorkbook.Unprotect Password:="zaisanshobun" '一時的にブック保護解除
>ActiveSheet.Unprotect Password:="zaisanshobun" '一時的にシート保護解除
もちろん、Activeworkbook ではなく、ThisWorkbook でしょうけれども、これは、論理的(プログラム)には問題ないはずですが、両方を併記する種類のものではないはずです。以前、この手の質問があった時に、私の指摘に、質問者の方は信じないという反応で、こちらはかなり面食らいました。その後、どうなったのかは結果は知りません。
抽象的な内容になるのですが、私のコーディングで、時折、SleepやOnTime を使う理由は、物理的な時間差を取らないと、マクロが抜けてしまうことがあるからです。しかし、今回は、それ以上の重さを持ったものだと思います。
試しに、サンプルを考えてみました。情報が後出しで出てきて、内容が一変してしまう可能性もありますが、現在の質問に対する答です。
>メインシート上のプルダウンリストの選択に連動して、メインシートのいくつかの行を非表示にし、
・行表示、非表示操作(メインシート)
・シート表示、非表示(他のシート)
これを加えて、以下がそのサンプル・ソースです。
なお、パスワードは、カスタム・プロパティに収めることも出来ます。
'//標準モジュール
Option Explicit
Public Const PSWD As String = "123"
Sub OpenSheet()
Dim shName As Variant
Dim i As Long
With Worksheets(1).DropDowns(1)
shName = .List(.Value)
End With
Call HiddenLinesProg(shName)
If shName <> Worksheets(1).Name Then
If MsgBox("ページを開きますか?", vbOKCancel) = vbCancel Then
GoTo EndLine
End If
End If
ThisWorkbook.Unprotect PSWD
If shName <> "" Then
For i = 2 To Worksheets.Count
If LCase(Worksheets(i).Name) <> LCase(shName) Then
Worksheets(i).Visible = xlSheetVeryHidden
Else
Worksheets(i).Visible = xlSheetVisible
End If
Next
Worksheets(shName).Select
End If
ThisWorkbook.Protect PSWD, True, True
EndLine:
Call HiddenLinesProg(" ")
End Sub
Sub HiddenLinesProg(ByVal keyword As String)
With Worksheets(1)
.Range("A9").Resize(, 2).AutoFilter _
field:=1, _
Criteria1:=keyword, _
VisibleDropDown:=False
End With
End Sub
'//ThisWorkbook モジュール
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets(1).Select
ThisWorkbook.Save
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Worksheets(1).Select
End Sub
Private Sub Workbook_Open()
Dim Sh As Variant
For Each Sh In ThisWorkbook.Worksheets
Sh.Unprotect Password:=PSWD
Sh.Protect Password:=PSWD, UserInterfaceOnly:=True
Next Sh
If Worksheets(1).DropDowns(1).ListCount < 2 Then
Call SettingCombo
End If
Worksheets(1).DropDowns(1).ListIndex = 1
End Sub
Private Sub SettingCombo()
Dim i As Long, j As Long
Dim ar()
j = Worksheets.Count - 1
ReDim ar(j)
For i = 1 To Worksheets.Count
ar(i - 1) = Worksheets(i).Name
Next
With Worksheets(1).DropDowns(1)
.List = ar
.OnAction = "Module1.OpenSheet"
End With
Call HiddenLinesProg(" ") '非表示のためのダミー
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim i As Long
If Sh Is Worksheets(1) Then
ThisWorkbook.Unprotect PSWD
For i = 2 To Worksheets.Count
With Worksheets(i)
If .Visible < 2 Then
.Visible = xlSheetVeryHidden
End If
End With
Next i
ThisWorkbook.Protect PSWD, True, True
Worksheets(1).DropDowns(1).ListIndex = 1
Call HiddenLinesProg(" ") '非表示のためのダミー
End If
End Sub
'//
見た目よりも設定が複雑で問題が出る可能性もありますので、アップロードしました。
あくまでもサンプルです。Excel 2010 で作成。
パスワードは、このスレのURLの1から始まる8桁の番号
https://bit.ly/2I2Jzkq
オープンは投稿時間より約2週間ですが、途中で削除するかもしれません。
拡張子が、zipに変わってしまっていますから、xlsm に変えてください。zip -> xlsm プロパティの属性が変化していますので、プロパティを開けて、ブロックを解除します。
開いたら、セキュリティの警告の黄色の帯が出ていますので、「コンテンツの有効化」をクリック
これで、完了です。
ダウンロードして開くことができましたので削除していただいても大丈夫です。
ありがとうございます。
ちなみにシート、ブックの保護は123で解除できましたので、仰るパスワードをどこで使うのか不明でした。。。
No.3
- 回答日時:
No2です
失礼いたしました。少し勘違いしていたようです。
>質問はブックの保護についてなんです。
とは言え、ブックでも同様なので、保護をかけなおす文が確実に実行されているかをまず確認してみましょう。
StopやDebug.Printを利用すれば容易に確認できることと思います。
更に、その直後で、実際に保護がかかっているかを確認してみることで、原因をかな絞り込めるものと思います。
処理の最後を下記の記述にしたらうまくいきました。
ThisWorkbook.Protect Password:="PASSWORD", Structure:=True
Select case文の場合、Case毎に上記の記述をしなければいけません。
もっと良い方法ないでしょうか?
No.2
- 回答日時:
こんにちは
ご質問文に省略があるので確認はできませんが・・・
ActiveSheetに対して解除/保護を行っているようですので、処理途中でActiveSheetが入れ替わっていると保護のかけ忘れが発生しやすいかと思います。(コード上でも発見しにくいですね)
ご提示の内容からだけでは、上記が原因かどうかの判断はできませんが、対象ブックはフォーマット固定だと想像しますので、きちんとシートを明示して解除/保護を行った方が宜しいかと思います。
また、処理中にあちこちで解除/保護を行うよりも、最初に必要になるところで関係するシートをまとめて解除し、シート操作の終了時にまとめて保護するようにしておく方が、将来的にもわかりやすいコードになるのではないでしょうか?
No.1
- 回答日時:
回答になっていないですが、マクロを使わない方法として参考までに。
ひとつのシートにすべて表示させておいて、
たとえば、説明書1 の行をすべて選択し、
メニューより「グループとアウトラインの設定」-「グループ化」
(ショートカットで、Alt-D-G-G)
とすると、グループ化されます。
左側に+-のついたボタン?が出てくるので、表示させたり、隠したりできます。
book自体を読み込み専用ファイルにしておけば、データの書き換えをされずに
済むので、マクロを使わずにできます。
ご親切にありがとうございます。
アドバイスいただいた方法は既に承知している上で、
その方法だと駄目なのでマクロを使用しています。
また、このブックを各所に配布して、必要事項を入力して戻してもらうための書式ですので、
読み取り専用にもできません。
ブックの保護をかけた状態を維持する方法を探しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
チョコミントアイス
得意ですか?不得意ですか?できれば理由も教えてください。
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
あなたの習慣について教えてください!!
あなたが習慣だと思って実践しているものを共有してくださいませんか? 筋肉トレーニングでも朝シャワーでも、あなたが習慣だなと思えば何でも構いません
-
エクセル、特定のシートにパスワード(閲覧制限)をかける方法
Excel(エクセル)
-
Exel 一部のセルにのみ、閲覧制限をかけたい
Visual Basic(VBA)
-
Excelで別シートを見られないようにしたい
Excel(エクセル)
-
-
4
エクセルで一部のシートを見れないようにしたい
Excel(エクセル)
-
5
エクセル 非表示のシートをハイパーリンクで表示できますか?
Excel(エクセル)
-
6
エクセルシート毎の権限について
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの複数シートの保護を...
-
excelでシート毎の最終更新日を...
-
Excel、同じフォルダ内のExcel...
-
Excelのシートを、まとめて表示...
-
エクセルVBAでパスの¥マークに...
-
Excelで金銭出納帳。繰越残高を...
-
シートの保護のあとセルの列、...
-
複数シートの色付きセルがある...
-
エクセルのシート名をリスト化...
-
特定のシートの削除を禁止した...
-
EXCEL:同じセルへどんどん足し...
-
別シート参照のセルをシート毎...
-
Accessのスプレッドシートエク...
-
Excel VBA 複数のシートの行を...
-
シート名ではなく、相対位置で...
-
前の(左隣の)シートを連続参...
-
エクセルでファイルを開いたと...
-
エクセルで前シートを参照して...
-
別シートの最終行に貼り付けす...
-
エクセルで毎回1枚目のシートを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルの複数シートの保護を...
-
Excelで金銭出納帳。繰越残高を...
-
Excelのシートを、まとめて表示...
-
エクセルVBAでパスの¥マークに...
-
エクセルでファイルを開いたと...
-
excelでシート毎の最終更新日を...
-
別シート参照のセルをシート毎...
-
EXCEL:同じセルへどんどん足し...
-
前の(左隣の)シートを連続参...
-
エクセルで前シートを参照して...
-
Accessのスプレッドシートエク...
-
特定のシートの削除を禁止した...
-
シートの保護のあとセルの列、...
-
エクセルのシート名をリスト化...
-
VBAでシートコピー後、シート名...
-
EXCELで同一フォーマットのシー...
-
複数シートの特定の位置に連番...
-
エクセルで前のシートを連続参...
-
エクセルで複数設定したハイパーリンク先...
-
シートを追加・名前を次月に変...
おすすめ情報