
サンプル.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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBA Workbooks.Addで作成されたブックのシート保護の解除について 1 2023/02/23 08:02
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/01/25 11:42
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/09 12:17
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/03/25 08:33
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルブックの全シートの非表示列を再表示したい 1 2022/12/24 20:48
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBA 複数のブックに同じ列を表示させる方法 2 2022/07/20 23:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel、同じフォルダ内のExcel...
-
エクセルの複数シートの保護を...
-
前の(左隣の)シートを連続参...
-
別シート参照のセルをシート毎...
-
エクセルでファイルを開いたと...
-
エクセル 計算式も入っていない...
-
VBAでシートコピー後、シート名...
-
エクセルVBAでパスの¥マークに...
-
エクセルで前シートを参照して...
-
Accessのスプレッドシートエク...
-
Excelで同じシートのコピーを一...
-
エクセルで毎回1枚目のシートを...
-
特定のシートの削除を禁止した...
-
Excelで金銭出納帳。繰越残高を...
-
Excelのシートを、まとめて表示...
-
複数のピボットを同じフィルタ...
-
エクセルで複数シートを別のシ...
-
エクセルでファイル保存時に複...
-
別シートの最終行に貼り付けす...
-
特定のセルだけ結果がおかしい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定のセルだけ結果がおかしい...
-
エクセルの複数シートの保護を...
-
前の(左隣の)シートを連続参...
-
別シート参照のセルをシート毎...
-
エクセルで前シートを参照して...
-
Excel、同じフォルダ内のExcel...
-
特定のシートの削除を禁止した...
-
EXCEL:同じセルへどんどん足し...
-
エクセル 計算式も入っていない...
-
Excelで金銭出納帳。繰越残高を...
-
複数シートの特定の位置に連番...
-
エクセルでファイルを開いたと...
-
シートの保護のあとセルの列、...
-
Accessのスプレッドシートエク...
-
VBAで条件によりフォントサイズ...
-
VBAでシートコピー後、シート名...
-
エクセルで前のシートを連続参...
-
エクセルVBAでパスの¥マークに...
-
EXCELで同一フォーマットのシー...
-
Excelで同じシートのコピーを一...
おすすめ情報