6/16/2021

Excel。VBA。トラブル頻発。パスワード付きシートの保護のデータをコピーするのは厄介です【Copy trouble】

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プロパティを追加することで、パスワード付きシートの保護に対応することができます。


実行して確認すると、コピーも出来ていますし、シートの保護は解除されることなく、しかもパスワードもきちんと設定されていることが確認できましたね。