和風スパゲティのレシピ

日本語でコーディングするExcelVBA

シート名変更中はRangeのメソッドが失敗する

知らずに落ちると抜け出せなくなるVBAの落とし穴です。

  • 原因不明の「Rangeクラスの○○メソッドが失敗しました」エラーが発生する
  • マクロを作った直後だけ発生し、ファイルを保存したりすると出なくなる

あたりにお悩みの方は、この落とし穴に落ちていないかご確認ください。

シート名の変更中はRangeオブジェクトにロックがかかる

セルの値を編集中(ダブルクリックやF2で編集モード中)は、
Rangeオブジェクトへのアクセスに制限がかかり、

セル編集中にグレーアウトするアイコン

このようにセルの編集関連のアイコンがグレーアウトします。


編集モード中はVBE(マクロを書く画面)には移動できませんので、
この状態でマクロを実行することはできません。


しかし、これと同じグレーアウト状態になる「シート名の編集」では、
VBEに移動が出来てしまうため、この状態でマクロが実行できてしまいます。


しかしセルを編集する各機能には依然としてロックがかかっていますので、
アイコン上でグレーアウトされているメソッドに差し掛かったところで、

Rangeクラスの○○メソッドが失敗しました

エラーが発生します。


例えば以下のコードを「シート名の編集中」に実行すると、
値と背景色は設定できますが、Deleteメソッドでエラーとなります。

Sub マクロのエラーテスト()

    Dim 処理シート As Worksheet: Set 処理シート = Worksheets("○○")

    処理シート.Range("A1").Value = 1 ' OK

    処理シート.Range("A1").Interior.Color = RGB(0, 0, 0) ' OK

    処理シート.Range("A1").Delete ' RangeクラスのDeleteメソッドが失敗しました

End Sub

 

このエラーは
「シート名をコピーしてWorksheets(○○)にペーストして実行!」
のような手順でマクロを実行したときによく発生するため、

  • テストシートでマクロを作り本番シートに書き換えて実行
  • 別ブックのマクロを移植してシート名だけ変更して実行

のようなパターンで発生することが多いと思います。


シート名をコピーしたら、Enterで確定してからVBEへ移動するよう心がけましょう。