Excel VBA入門 その70:Insert エラー’1004’「RangeクラスのInsertメソッドが失敗しました」対処方法

エクセルVBA VBA



みなさんはInsertメソッドを使っていますか?

エクセルVBAでは、Insertメソッドを使ってセルや行を挿入したりする機会がとても多いものです。

その分、謎のエラーに悩まされることが多いことも事実です。

今回は、Insertメソッドを使ったときに発生する、エラー’1004’「RangeクラスのInsertメソッドが失敗しました」の対処方法について徹底的に説明していきます。



Insert エラー’1004’「RangeクラスのInsertメソッドが失敗しました」対処方法

Insertメソッドのエラー原因

Insertメソッドを実行したときに、以下のような「実行時エラー’1004’:RangeクラスのInsertメソッドが失敗しました。」とのメッセージボックスが表示されるときがあります。

Insertエラー文

この場合、主に考えられる原因は、

シートが「保護」の設定になっていることが挙げられます。

シートが保護されているのにInsertメソッドを使って行やセルを挿入しようとしたため、エラーになってしまうのです。

Insertのエラーは、シートの一部のみが保護設定されているときにも発生してしまうので注意が必要です。

Insertメソッドのエラー対処方法

Insertメソッドで発生した 「実行時エラー’1004’:RangeクラスのInsertメソッドが失敗しました。」 の対処方法は以下のことが挙げられます。

  1. シートの保護を解除する
  2. シートを保護したまま、マクロだけ実行可能にする

シートの保護を解除する

シートの保護を解除するには、「Unprotect」メソッド を使用します。

もし挿入を終えた後、シートを保護する必要があるのならば、 Protectメソッド を使用して再度保護を設定すればよいのです。

Unprotectメソッドを使って保護解除した後、挿入を実行後、Protectメソッドを使って保護を再設定するサンプルコードを以下に示します。

Sub 保護解除→保護設定()
    ActiveSheet.Unprotect
    Rows("5").Insert Shift:=xlDown
    ActiveSheet.Protect
End Sub

パスワード付きの保護をしている場合の解除方法については、次に説明していきます。

シートのパスワード付きの保護を解除する

保護設定の際にパスワードを設定した場合には、コードに解除パスワードを記述する必要があり、Unprotctメソッドの引数にパスワードを指定して実行します。

Sub パスワード付き保護解除()
    ActiveSheet.Unprotect Password:="1234"
    Rows("5").Insert Shift:=xlDown
    ActiveSheet.Protect
End Sub

もし、パスワード変更の頻度が高いなど、VBAにパスワードを記述することが難しい場合には、マクロ実行時にパスワードを手動で入力して保護解除することもできます。

Unprotectメソッドの引数Passwordを記述せずに省略した状態でマクロを実行し、パスワード付き保護を解除しようとすると、パスワード入力ボックスが表示され、入力すると解除されます。

パスワード入力ボックスが表示される

もし、パスワードの入力を間違うと、以下のようにエラーが表示されます。

パスワードの入力を間違うとエラーが表示される

シートを保護したまま、マクロだけ実行可能にする

シートの保護を設定した状態で、マクロの操作のみを解除することができます。

つまり、 ユーザーの手動操作を保護し、マクロの操作は解除されているという便利なVBAメソッドがあります。

これには、Protectメソッドの引数「UserInterfaceOnly」に「True」を指定します。

構文: ワークシートオブジェクト. Protect UserInterfaceOnly:=True

これは、すでにシートに保護設定されている状態でも、保護設定前でも、パスワード保護が設定されている状態でも実行可能です

サンプルコードは以下のとおりです。

Sub マクロの操作のみ解除する()
    Application.ActiveSheet.Protect UserInterfaceOnly:=True
    Rows("5").Insert Shift:=xlDown
End Sub

なお、マクロ実行後の、シートの保護設定の状態は以下のとおりです。

  • シートが「保護されていない状態」でマクロを実行 → シートが保護され、マクロの操作のみ解除された状態になる
  • シートが「保護設定されている状態」でマクロを実行 → シードが継続して保護され、マクロの操作のみ解除された状態になる

「Protect UserInterfaceOnly:=True」を使用した場合に注意しなければいけないのは、マクロを実行した状態(つまりマクロの操作のみ解除された状態)でワークシートを閉じて保存した場合です。

再度ワークシートを開くと、「マクロの操作が解除されていない状態」の保護に戻っています。

したがって、再度 「Protect UserInterfaceOnly:=True」 を実行する必要があります。

【まとめ】Insert エラー’1004’「RangeクラスのInsertメソッドが失敗しました」対処方法

Insertメソッドを使用したときのエラー原因は、シートが保護されていることが挙げられました。

対処方法は、以下のとおりです。

  • シートの保護を解除する
  • シートを保護したまま、マクロだけ実行可能にする

エクセルVBAでは挿入のためにInsertメソッドを使用する頻度が多いですので、ぜひ今回の記事を役立ててくださいね。

コメント

タイトルとURLをコピーしました