Excel。VBA。トラブル頻発。パスワード付きシートの保護のデータをコピーするのは厄介です
<Excel VBA>
シートの保護されたデータを範囲選択して、別のシートにコピーして貼り付ける。
何も気にすることもなく出来る処理ですが、Excel VBAをつかってマクロを実行すると、トラブルやらメッセージが表示され、スマートに実行できません。
次の表は、シートの保護を設定しています。
試しに、C8を修正しようとしたら、シートの保護がされているというメッセージが表示されます。
A1からある表を、別シートにコピーするだけですが、頻度が多いので、Excel VBAをつくって対応していきます。
Sub シートの保護コピー ()
Range("a1").CurrentRegion.Copy Destination:=Worksheets("COPY").Range("a1")
End Sub
プログラム文を説明します。
Range("a1").CurrentRegion.Copy は、A1から始まるCurrentRegion(連続した範囲)をコピーします。
さらに、
Destination:=Worksheets("COPY").Range("a1")
で、COPYというシートのA1に貼り付けます。Destinationは、貼付け先です。
要するに、「A1から連続する範囲をコピーして、シート名COPYのA1に貼り付ける」という意味です。
なんら、問題はありません。
「シートの保護」を設定しないで、実行してみると、問題なくコピーできることが確認できます。
ところが、シートの保護を設定しておくと、どうなるでしょうか?
「実行時エラー1004」が表示されてしまいました。
よくみると、シートの保護が設定されていると実行できないとのこと。
シートの保護が設定されただけで、問題なく使えていたマクロが動かなくなるわけですね。
では、どのようにしたらいいのでしょうか?
プログラム文を次のように修正してみましょう。
Sub シートの保護コピー保護解除()
Worksheets("hogo").Unprotect
Range("a1").CurrentRegion.Copy Destination:=Worksheets("COPY").Range("a1")
Worksheets("hogo").Protect
End Sub
コピーする行の前後に、一行追加しました。
Worksheets("hogo").Unprotect
今回元のデータがあるシート名を「hogo」としています。
そのシートに設定されている「シートの保護」を解除するのが、「Unprotectメソッド」です。
コピーした後に、シートの保護を解除しているので、
Worksheets("hogo").Protect
「Protectメソッド」でシートの保護を再設定しています。
それでは、マクロを実行してみましょう。
「実行時エラー1004」も表示されることなく、希望通りに処理することができました。
ところが、シートの保護には、「パスワード」設定ができるわけです。
パスワード付きシートの保護だとどうなるか、確認してみます。
パスワードは「123」としました。
マクロを実行してみると、シートの保護の解除ダイアログボックスが表示されてきました。
パスワードを入力してOKボタンをクリックすれば、無事にコピーすることができますが、いちいち、パスワードを入力するのは面倒です。
そこで、次のように、プログラム文を加筆していきます。
Sub シート保護コピー保護解除()
Worksheets("hogo").Unprotect Password:="123"
Range("a1").CurrentRegion.Copy Destination:=Worksheets("COPY").Range("a1")
Worksheets("hogo").Protect Password:="123"
End Sub
Unprotectメソッドと、Protectメソッドのあとに、Password:="123"というPasswordプロパティを追加することで、パスワード付きシートの保護に対応することができます。
実行して確認すると、コピーも出来ていますし、シートの保護は解除されることなく、しかもパスワードもきちんと設定されていることが確認できましたね。