[教えて!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つの追加シートを、
ボタンを押すたびに次々と追加(消去)する処理を持っています。
それぞれの処理の最後に、
かならず保護を復旧するように組んでいます。
デモ
次の動画のように、
シートを追加したり消去したりできます。
また、➕マークがグレーアウトされていることからわかるように、
ブックの保護は継続されています。
デモで使用したファイルについて
こちらからダウンロードできます。
終わりに
保護機能を使いこなせば、
ユーザーフレンドリーで安全なツールを作成することができます。
機会があればシートの保護機能のほうについても
解説する記事を作成したいと思っています。
関連記事
- [教えて!VBA] 第9回 フォントやボタンをカスタマイズできるメッセージボックスを作成するにはどうすればいいの??
- [教えて!VBA] 第8回 変更前のセルの値を保持/利用するにはどうすればいいの??
- [教えて!VBA] 第7回 フォルダを開く(+ファイルを操作する)にはどうすればいいの??
- [教えて!VBA] 第6回 エクセルVBAマクロで、マクロを終了するにはどうすればいいの??
- [教えて!VBA] 第5回 ブックの最初のシートの最初のセルを選択した状態にするにはどうすればいいの??