[教えて!VBA] 第10回 Excelのシートの移動・削除を禁止する方法 & マクロ実行時だけ許可するにはどうすればいいの??

概要

この記事について

かんたんな概要と結論

ブックの保護機能を利用し、シートの移動・削除を禁止できます。
マクロからシート構成をいじりたい場合は、一時的に解除して再度復旧するようなコードの組み方をすることが必要です。

こんにちは、dedeです。

この記事では、
VBAマクロに関する質問のうち、
皆が疑問に思っているトピックについて解説いたします。

今回は、
Excelのシートの移動・削除を禁止する方法と、
それを一時的に許可してマクロの処理を実行する方法

を解説いたします。

※この記事は、Office VBAマクロのうち
Excel VBAマクロに関するトピックです。

レベル:初級者向け

やりたいこと

マクロを組んだExcelブックを他の人にツールとして配るとき、
シートの構成をいじられたら困る場合があるでしょう。

例えば、
非表示シートに商品データシートを置いておいてマクロから参照する場合、
商品データシートの名前を変えられたら参照できなくなる可能性があり、
また、商品データシートを削除されたら、データが失われます。

ユーザ操作により不具合が発生する例

よって、
シート構成をいじることができないように
プロテクト(保護)を掛ける必要があります。

また、シート構成を操作するようなマクロ実行時には、
一時的にプロテクトを解除するような手続きが必要になるでしょう。

以下の手順セクションでは、
シート構成の保護のやり方、
およびマクロのコードについて説明します。

環境

以下は、
Office 2016のExcel環境での説明です。

※2022/1時点の最新バージョンのExcelでも内容は変わりません。

保護機能について

まずExcelの保護機能について簡単に説明します。

ユーザーが誤ってデータの一部を毀損することを防ぐために、
Excelに備わっている動作制限機能のことを保護機能と呼びます。

校閲タブから操作できる保護機能は、
シートの保護 ブックの保護 の 二種類に分類されます。

保護の種類 対象 内容
ブックの保護 シート構成
(ワークシートの数、名前など)
非表示のワークシートの表示、ワークシートの追加、
移動、削除、非表示、ワークシートの名前変更を
行うことができないようになる
シートの保護 シート上のオブジェクト セル書き込み、セル追加・削除、図形の位置変更など
(細かく設定が可能)

手順

レベル1. シートの移動・削除を禁止する

シートの移動・削除を禁止する、すなわちシート構成の保護を実施するためには、
校閲タブの「ブックの保護」ボタンを押下します。

校閲タブの「ブックの保護」

保護のためのパスワードを入力し、実行します。

ブックの保護設定画面

シート構成が保護され、非表示メニューや名前変更メニューがグレーアウトされて
選択できなくなります。

シート構成保護

レベル2. 禁止を一時的に許可する

マクロからブックの保護を解除することができます。

1ThisWorkbook.Unprotect PassWord

解除したいワークブックのUnprotectメソッドを呼び出して、
引数にパスワードを指定します。

実行後、
グレーアウトされていた非表示メニューや名前変更メニューが再度選択可能になっています。

シート構成保護の解除

レベル3. マクロ実行時だけ許可し、復旧する

次のように、
GOTOの機構(例外処理の解説ページで詳細に説明しています)を使って、
必ず保護の復旧の処理が実行されるようにします。

このようにしないと、
エラーが起きた時に復旧されずにマクロが終了する可能性があるためです。

 1Public Sub マクロ実行時だけ許可()
 2    
 3    On Error GoTo ErrorHandler
 4    
 5    '//一時的に解除
 6    ThisWorkbook.Unprotect "test"
 7    
 8    '//シート構成を操作する処理……
 9    
10ExitHandler:
11    
12    '//保護の復旧
13    ThisWorkbook.Protect "test"
14    
15    Exit Sub
16    
17ErrorHandler:
18
19    MsgBox "エラーが発生したため、マクロを終了します。", vbCritical
20        
21    GoTo ExitHandler
22        
23End Sub
24

デモ

ABOUT

シートを追加したり消去したりするボタンを動作させるデモです。

実際にシートをイチから作成しているわけではなく、
非表示にしていたシートを追加したり、表示中のシートを非表示化するマクロです。

前提

まず、
シートが4種類あります。
そのうち、接頭辞が「追加シート」であるシートが3つあります。

デモ シート構成

シート1のシート上に、
シート追加ボタン、シート消去ボタンを作成します。

デモ用ボタン配置

それぞれのボタンにマクロを登録します。

 1Public Sub シート追加()
 2    
 3    Dim additinalSheetNumber As Long
 4    Dim vSheet As Object
 5    
 6    On Error GoTo ErrorHandler
 7    
 8    '//一時的に解除
 9    ThisWorkbook.Unprotect "test"
10    
11    '//表示中の追加シートの数を算出
12    additinalSheetNumber = 0
13    For Each vSheet In ThisWorkbook.Worksheets
14        If vSheet.Visible = True And InStr(vSheet.Name, "追加シート") > 0 Then
15            additinalSheetNumber = additinalSheetNumber + 1
16        End If
17    Next vSheet
18    
19    '//追加シートがすべて表示されているならば処理を終了
20    If additinalSheetNumber = 3 Then GoTo ExitHandler
21    
22    '//次の追加シートを表示
23    ThisWorkbook.Worksheets("追加シート" & (additinalSheetNumber + 1)).Visible = True
24    
25ExitHandler:
26    
27    '//保護の復旧
28    ThisWorkbook.Protect "test"
29    
30    Exit Sub
31    
32ErrorHandler:
33
34    MsgBox "エラーが発生したため、マクロを終了します。", vbCritical
35        
36    GoTo ExitHandler
37        
38End Sub
 1
 2Public Sub シート消去()
 3    
 4    Dim additinalSheetNumber As Long
 5    Dim vSheet As Object
 6    
 7    On Error GoTo ErrorHandler
 8    
 9    '//一時的に解除
10    ThisWorkbook.Unprotect "test"
11    
12    '//表示中の追加シートの数を算出
13    additinalSheetNumber = 0
14    For Each vSheet In ThisWorkbook.Worksheets
15        If vSheet.Visible = True And InStr(vSheet.Name, "追加シート") > 0 Then
16            additinalSheetNumber = additinalSheetNumber + 1
17        End If
18    Next vSheet
19    
20    '//追加シートがすべて非表示ならば処理を終了
21    If additinalSheetNumber = 0 Then GoTo ExitHandler
22    
23    '//最も連番の大きい追加シートを非表示
24    ThisWorkbook.Worksheets("追加シート" & additinalSheetNumber).Visible = False
25    
26ExitHandler:
27    
28    '//保護の復旧
29    ThisWorkbook.Protect "test"
30    
31    Exit Sub
32    
33ErrorHandler:
34
35    MsgBox "エラーが発生したため、マクロを終了します。", vbCritical
36        
37    GoTo ExitHandler
38        
39End Sub
40

3つの追加シートを、
ボタンを押すたびに次々と追加(消去)する処理を持っています。

それぞれの処理の最後に、
かならず保護を復旧するように組んでいます。

デモ

次の動画のように、
シートを追加したり消去したりできます。

また、➕マークがグレーアウトされていることからわかるように、
ブックの保護は継続されています。

デモで使用したファイルについて

こちらからダウンロードできます。

終わりに

保護機能を使いこなせば、
ユーザーフレンドリーで安全なツールを作成することができます。

機会があればシートの保護機能のほうについても
解説する記事を作成したいと思っています。

関連記事

comments powered by Disqus