スポンサーリンク

VBAシートの保護したらマクロエラーになった時の対処法

VBAシートの保護Excel-VBA

エクセルで様々な計算式の入った表などを作った時に、エクセル関数が入っているセルの保護をかけ忘れて、誤って消してしまったことありませんか

ボウリングのリーグ戦での成績表も同じように、スコアーを入力すると自動的に計算をして成績一覧表が出来上がるように作っています。

当然ながらHDCPなど複雑な数式を入れてあるので、1か所でも誤って消されてしまっては困るので、シートの保護を設定しています。

そんな時、シート保護を設定したらマクロがエラーになったことありませんか

なぜなら、ユーザーフォームのテキストボックスに入力値をセルに転記したり、順位の並び替えをしたりするのもシートの保護を設定すると、できなくなってしまいエラーになるのです。

と、いうことで、簡単な解決法がありますのでご紹介します。

スポンサーリンク

UnprotectとProtectを使う

VBAでシートの保護解除(Unprotect)とシートの保護(Protect)を各コマンドボタンの記述済みVBAコードの最初と最後に書き加えるだけです。

例として、「ボウリング成績表メインメニュー画面~LTBリーグ編」でも同じようにシートの保護・解除の設定をしているので設定手順をご紹介します。

Workbookの設定

エクセルファイルを開いたら自動的にシートの保護を設定します。

Microsoft Visual VasicのVBA Projectの中にある、ThisWorkBookに下記コードを記述します。

ThisWorkBookの場所についてはこちらに記載していますのでご参考下さいませ。

詳しくはこちらに記載しています

https://tripbowl.net/vba-workbook-open/

Private Sub Workbook_Open()
Worksheets(“HOME”).Activate
Range(“A1”).Select
ActiveSheet.Protect
UserForm5.Show
End Sub
  1. エクセルファイルが開いたら
  2. シート名「HOME」を前面にして作業するシートとする
  3. セルA1を選択する
  4. 開いたシートを保護する
  5. ユーザーフォーム5を表示する
  6. マクロ記録終了

5行目にActiveSheet.Protectを書くだけなのです。

パスワード設定や部分許可の設定をしないシンプルな方法です。

各コマンドボタンの設定

先ほどブックでシートの保護を自動的に設定したので、各コマンドボタンにはすでに書いてあるプログラムの開始前にシートの解除設定をして、プログラムが終了するEnd Subの直前にシートの保護を設定するだけです。

スケジュール設定方法~LTB個人リーグ編」を例に書いていくと、祝日などで開催日が変更になる時にテキストボックスに数字を入力しますが、シートの保護が設定されているままでは、入力値がセルへ転記できなくなりエラーになります。

次のようにコマンドボタンをクリックしたらすぐにシートの保護解除

Private Sub CommandButton1_Click()
ActiveSheet.Unprotect
For i = 1 To 30
Cells(i + 2, 61).Value = UserForm4.Controls(“TextBox” & i).Value
Next i
For j = 1 To 30
With UserForm4.Controls(“Label” & j)
.Caption = Cells(j + 2, 59)
End With
Next j
ActiveSheet.Protect
End Sub

このようにするだけで、シートの保護を設定してもプログラム開始直前に解除・実行・保護となるのでコードを書き直したりする必要が無いので必ず使っていますよ。

Excel-VBAもくじへ

コメント