普段はワークシートを保護して、ユーザーがみだりに編集できないようにしたい、しかし、時には保護を解除して編集したい、ということがよくあります。とくに、プロジェクトの開発途中では、そういう時がしょっちゅうあります。
そのための、保護/解除ボタンをつくってみました。
保護している時には、画面表示も、ユーザーのデータ入力やボタン操作に不必要な目盛り線や見出し、それからリボンも消して、できるだけエクセル色を薄めたい、というのが人情ですので、保護モードと画面表示モードをリンクさせることにしました。
そのためのマクロは後で紹介するとして、ボタンの設置から。
まず、ふたつのボタン画像を挿入して、「図の形式」→「オブジェクトの選択と表示」でそれぞれに "Protect" "Unprotect" という名前をつけておきます。次に両方を選択して "ProtectButton" というマクロを登録します。そうしておいてから、「オブジェクトの配置」を使って両画像の左揃え、上揃えを実行し、重ね合わせます。

Protectボタンをクリックすると、こんな感じになります。ワークシートが保護されて、余計な表示が画面から消えています。ボタンは Unprotectボタンに変わっています。
(ボタンの表示/非表示の様子がわかるように、右側のオブジェクトの選択のペインは表示したままにしてあります)

保護モード
ここで Unprotectボタンをクリックすると、保護が解除され、画面表示もすべて正常に戻ります。

解除モード
パブリックなサブルーチンとして、ProtectionInitialize() と ProtectButton() を用意しました。
ProtectionInitialize() は、ワークシートの Worksheet_Activate() イベントから呼び出して、そのワークシートの以前の設定状態に復元するためのものです。以前の設定状態は、ボタン Protect が見えているかどうかで判定できますので、それを利用しています。
ProtectButton() は、ボタン画像から呼び出すマクロです。設定状態を切り替えて、保護モードと画面表示モードを変更するものです。
作業の本体は、下の方のふたつの Let プロパティdisplayMode(sw)とprotectSheet(sw) です。
displayMode = sw
で画面表示モードが設定され
protectSheet = sw
で保護モードが設定されます。
ここでは、画面表示が False (保護モード)の場合はステイタスバーやワークシートのタブを含めてほとんどのパーツを消すようにしていますが、数式バーだけは常に1行分表示されるようにしました(上の図参照)。データ入力の助けに必要でしょうから。
これらの内容は、ニーズにあわせて適宜調整するとよいでしょう。場合によると、どこかに一覧表を作っておいて、ワークシートごとにその設定内容を変えるような運用も可能です。そこまで複雑にするのがよいかどうかは別にして。
標準モジュール ProtectButton()
'------ スイッチオブジェクトの取得
Private Property Get protectSw()
Set protectSw = ActiveSheet.Shapes("Protect")
End Property
Private Property Get unProtectSw()
Set unProtectSw = ActiveSheet.Shapes("Unprotect")
End Property
'----- スイッチ表示の切替
Private Property Let protectSwVisibility(sw)
protectSw.Visible = sw
unProtectSw.Visible = Not sw
End Property
'----- ワークシートを開いた時の初期化
Public Sub ProtectionInitialize()
Dim sw
sw = protectSw.Visible
displayMode = sw
protectSheet = sw
End Sub
'----- 保護ボタンクリック
Public Sub ProtectButton()
Dim sw
sw = Not protectSw.Visible
protectSwVisibility = sw
displayMode = sw
protectSheet = sw
End Sub
'----- 表示モードの切替
Private Property Let displayMode(sw)
Dim swStr
swStr = CStr(sw)
With Application
.ExecuteExcel4Macro "show.toolbar(""ribbon""," & swStr & ")"
.DisplayFormulaBar = True
.FormulaBarHeight = 1
.DisplayStatusBar = sw
End With
With ActiveWindow
.DisplayWorkbookTabs = sw
.DisplayHeadings = sw
.DisplayGridlines = sw
End With
End Property
'----- シート保護の切替
Private Property Let protectSheet(sw)
If sw Then ActiveSheet.Unprotect: Exit Property
ActiveSheet.Protect _
DrawingObjects:=True, _
Contents:=True, _
Scenarios:=True, _
UserInterfaceOnly:=True
End Property