Excel VBA でプログラミングしたコードを実行する時に 「シートの保護」を解除したい場合があります。
「シートの保護」を設定することでセルへの誤入力を防止できるので、必要な場合には使用したい機能です。
ただ、Excel VBA では保護されたセルの値を読み込む、あるいは保護されたセルへ値を書き出すということができません。
そこで、Excel シート上で「シートの保護」を設定しつつもコードを実行する時だけは解除したいわけですね。
今日は、その方法についてお話しします。
1、シートの保護とは
まず、シートの保護についてざっとお話しします。
一言で言えば、セルを編集できなくする機能のことです。
設定するとセルへの値の入力もできませんし、セルの色を変えることもできなくなります(部分的に編集を可能にする方法もありますが)。
シートの保護の設定
「校閲」タブの「シートの保護」を選択しパスワードを入力します。一度入力すると確認の意味で再入力を求められるので、同じパスワードを再入力します。これでシートの保護が設定できました。
逆にシートの保護を解除する場合には、「校閲」タブの「シートの保護の解除」を選択し最初に設定したパスワードを入力します。
これでシートの保護が解除され元の状態(保護されていない状態)に戻ります。
なお、パスワードを忘れると「シートの保護」を解除できなくなってしまいますので忘れないように注意しましょう。
特定のセルのみにシートの保護を設定する
さて、このシートの保護は特定のセルのみに行うこともできます。
正確には一部のセルだけにはシートの保護がかからないようにすることができるということです。
一例として次のようなシートを取り上げたいと思います。
次のシートのクリーム色のセルE6〜17 に月々の売上高(税込)を入力します。そして、セルF6〜17 では税抜金額を計算しています(E列の金額を 1.08 で割っている)。
さて、最終的には F列の売上高(税抜)につき VBA を使って以下を計算するものとします。
・平均値(セル F21 に書きだし)
・最大値(セル F22 に書きだし)
・最小値(セル F23 に書きだし)
※実際には VBA を使う必要のないことですが今回は事例として敢えて使います。
F列のセルには、売上高を税抜金額にするための計算式が埋め込んであるので、これを誤操作(Deleteキー、BSキー)でうっかり消してしまわないようにしなければなりません。
そこで、「シートの保護」により、入力が必要な特定のセル(E6〜17)以外のセルの編集ができないようにしておきます。
逆に言えばセルE6〜17 だけは編集(入力)ができるようにしておくということですね。
セルE6〜17 を選択した状態で「Ctrl + 1」を押して「セルの書式設定」を出します。
そして、「保護」のロックのチェック(✔︎)を外します。
続いてシートの保護を設定します。
「校閲」タブの「シートの保護」を選択しパスワードを2回入力しましょう。
これにより、セル E6〜17 以外は編集(入力)不可になりました。試しに何か入力を試みると以下のメッセージが出て拒まれます。
なおこちらの記事にも同様のことを書いていますので参考にして下さい。
2、コード実行時だけ「シートの保護」を解除する方法
さて、先に書いたようにF列の売上高(税抜)について VBA を使って平均値、最大値、最小値を計算します。
売上高(税抜)を F列から読み込んでこれらを計算しますが、「シートの保護」をした状態では数値を読み込むことはできません。
「シートの保護」をしていなければ読み込むことができますが、それでは誤入力防止という元々の目的を果たせません。
そこで
「シートの保護」をした状態で、コード実行時だけ解除する
という方法を取りたいと思います。
上記方法を取りつつ、平均値、最大値、最小値を計算するプログラミングコードを紹介します!
プログラミングコード
コードを以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
Sub Calc() '変数の定義' Dim Start_Gyou 'データの最初の行' Dim Uriage_Retsu '売上高データの列' Dim Goukei '売上高(税抜)の合計額' Dim Ave_Uriage '売上高(税抜)の平均値' Dim Max_Uriage '売上高(税抜)の最大値' Dim Min_Uriage '売上高(税抜)の最小値' Dim Uriage(1 To 12) '売上高(税抜)' Dim x 'シートの保護解除' Worksheets("Sheet1").Unprotect Password:="123456" Start_Gyou = 6 '6行目' Uriage_Retsu = 6 'F列目' Goukei = 0 '平均値計算' For i = 1 To 12 Uriage(i) = Cells(Start_Gyou + i - 1, Uriage_Retsu) Goukei = Goukei + Uriage(i) Next i Ave_Uriage = Round(Goukei / 12, 0) '最大値計算' For i = 1 To 11 If Uriage(i) > Uriage(i + 1) Then x = Uriage(i + 1) Uriage(i + 1) = Uriage(i) Uriage(i) = x Else End If Next i Max_Uriage = Uriage(12) '最小値計算' For i = 1 To 11 If Uriage(i) < Uriage(i + 1) Then x = Uriage(i + 1) Uriage(i + 1) = Uriage(i) Uriage(i) = x Else End If Next i Min_Uriage = Uriage(12) '計算結果の書き出し' Cells(21, 6) = Ave_Uriage '平均値' Cells(22, 6) = Max_Uriage '最大値' Cells(23, 6) = Min_Uriage '最小値' 'シートの保護' Worksheets("Sheet1").Protect Password:="123456" End Sub |
コード説明
コードを説明します。
シートの保護の解除(14行目)、シートの保護(68行目)
今回のコードの一番のポイントですね!
シートの保護のパスワードは「123456」と設定しているものとします。
シートの保護の解除(14行目)↓
1 |
Worksheets("Sheet1").Unprotect Password:="123456" |
コード実行直後にまずシートの保護を解除することによって、セルE6〜17から数値を読み込めるようになります。
シートの保護(68行目)↓
1 |
Worksheets("Sheet1").Protect Password:="123456" |
最後には再びシートを保護しておきます。
こうすることでコードの実行が終了したら元どおりにシートの保護がかかった状態に戻っています。
最初と最後にこれらのコードを書いておき、間に目的とする計算を行うコードを書くことになります。
今回最も大事なことですので、きっちり押さえて下さい。
平均値計算(20~28行目)
1 2 3 4 5 6 7 8 9 |
'平均値計算' For i = 1 To 12 Uriage(i) = Cells(Start_Gyou + i - 1, Uriage_Retsu) Goukei = Goukei + Uriage(i) Next i Ave_Uriage = Round(Goukei / 12, 0) |
売上高(税抜)を12ヶ月分読み込みながら加算していき合計額を計算しています。
最後に合計額を 12 で割って平均値を計算しています。
最大値計算(30~44行目)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
'最大値計算' For i = 1 To 11 If Uriage(i) > Uriage(i + 1) Then x = Uriage(i + 1) Uriage(i + 1) = Uriage(i) Uriage(i) = x Else End If Next i Max_Uriage = Uriage(12) |
売上高(税抜)の配列データを順番に比較して行き、金額が最も大きいもの(最大値)が配列の最後の番号(12)の要素となるように並べ替えています。
最小値計算(46~60行目)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
'最小値計算' For i = 1 To 11 If Uriage(i) < Uriage(i + 1) Then x = Uriage(i + 1) Uriage(i + 1) = Uriage(i) Uriage(i) = x Else End If Next i Min_Uriage = Uriage(12) |
売上高(税抜)の配列データを順番に比較して行き、金額が最も小さいもの(最小値)が配列の最後の番号(12)の要素となるように並べ替えています。
計算結果の書き出し(62~65行目)
1 2 3 4 |
'計算結果の書き出し' Cells(21, 6) = Ave_Uriage '平均値' Cells(22, 6) = Max_Uriage '最大値' Cells(23, 6) = Min_Uriage '最小値' |
セル「F21」に平均値、「F22」に最大値、「F23」に最小値を書き出しています。
3、まとめ
Excel VBA でコードを実行する時だけシートの保護を解除する方法を説明しました。
シートの保護は誤入力の防止に使えますが、VBA を使ったときには保護したセルからは値を読み込めないという問題があります。
今回の方法は、シートを保護を維持しつつ VBAでの値の読み込みも可能にしています。
用途に応じて活用して頂ければと思います。