○○クラスの××メソッドが失敗しました。(など)(エラー番号:1004)


Sub Sample1()
    Range("A1").AutoFit
End Sub

いろいろなケースで発生するエラーです。

上のコードは、セルA1に対して"列幅の自動調整(AutoFitメソッド)"を実行しようとしたためエラーになりました。AutoFitメソッドは、行単位または列単位に対して実行しないといけないからです。正しくは、次のようにします。

Sub Sample1()
    Range("A1").Columns.AutoFit
End Sub

または

Sub Sample1()
    Range("A1").EntireColumn.AutoFit
End Sub

みたいに。

Excel 2007のVBAでは[ヘルプ]ボタンをクリックしても、解説ページが開きませんでした。

Excel 2003のVBAヘルプでは、次のように記載されています。

マクロ エラー
実行中のマクロにエラーが発生しました。次のいずれかの理由により、指定したメソッドは指定したオブジェクトで使用できません。
  • 引数に無効な値が含まれています。存在しないオブジェクトにアクセスしたことが原因と考えられます。たとえば、3 つのブックを開いているときに Workbooks(5) と指定するとエラーが発生します。
  • 適用された状況ではメソッドを使用できません。特に、Range オブジェクトの一部のメソッドでは、対象となる範囲にデータが入力されている必要があります。範囲にデータが入力されていない場合は、メソッドの実行に失敗します。
  • ファイルの読み取りの失敗、ファイルへの書き出しの失敗などの外部エラーが発生しました。
  • セキュリティ設定のために、メソッドとプロパティを使用できません。たとえば、Office のドキュメントに格納された Microsoft Visual Basic for Applications (VBA) コードを操作する VBE オブジェクトのプロパティとメソッドには、既定でアクセスできません。
メソッドの使い方に関する詳細については、Visual Basic のヘルプで目的のメソッド名を検索してください。

何だか、いろいろ書いてありますが、要するに「メソッドの実行に失敗した」というエラーでしょうか。

ちなみに、最初の例に挙げているケースでは、

実行時エラー'9'が発生します。

「インデックスが有効範囲にありません」の解説

2番目のケースは、確かに実行時エラー'1004'が発生しますね。次のコードは、データが何も入力されていない空欄セルで実行するとエラーになります。並べ替える対象がないのですから当然ですね。

同じようなエラーでも「○○クラスの××メソッドが失敗しました」ではないメッセージが表示されることもあります。次のコードも、アクティブセルが空欄だとエラーになります。

まぁ、操作の対象となるデータを選択していないのですから「データが選択されていません」の方が、親切ちゃ親切なアドバイスかもしれません。

また、もっと難解なメッセージが表示されることもあります。

Sub Sample5()
    Range("A1").Name = "=Sheet3!B3"
End Sub

名前には、セルのアドレス(参照)と間違えるような文字列は設定できません。という意味のエラーなのですが、それにしても「アプリケーション定義またはオブジェクト定義のエラー」って言われてもね~。昔のWindowsでよく見た「不正な処理をしました」とか「一般保護違反です」みたいな、ユーザーにとっては、何の参考にもならないエラーメッセージですね。ただし、もう少し分かりやすいメッセージになる場合もあります。

Sub Sample6()
    Range("A1").Name = "2007"
End Sub

こちらは分かりやすいです。親切丁寧に教えてくれています。ただ、あまりに丁寧すぎて、メッセージが全部表示し切れていませんけど・・・(^^;

3番目の例「ファイルの読み取りの失敗、ファイルへの書き出しの失敗」は、Openステートメントで外部ファイルを扱うようなケースでは、別のエラーが発生することも多いです。

「ファイル名または番号が不正です」の解説

「ファイルが見つかりません」の解説

「ファイル モードが不正です」の解説

「ファイルは既に開かれています」の解説

「ファイルにこれ以上データがありません」の解説

ただし、次のようにOpenメソッドや、Insertメソッドを使ったケースでは、この実行時エラー'1004'が発生します。

Sub Sample7()
    Workbooks.Open "C:\存在しないブック.xls"
End Sub

Sub Sample8()
    ActiveSheet.Pictures.Insert "C:\存在しない画像.jpg"
End Sub

ついでですから、最後の

  • セキュリティ設定のために、メソッドとプロパティを使用できません。たとえば、Office のドキュメントに格納された Microsoft Visual Basic for Applications (VBA) コードを操作する VBE オブジェクトのプロパティとメソッドには、既定でアクセスできません。

も、実際に試してみましょう。

Sub Sample9()
    MsgBox ThisWorkbook.VBProject.Name
End Sub

ただし、まったく同じ設定で、同じコードでも、次のメッセージが表示されることもあります。

要するに、メソッドの実行に失敗したとき発生するエラーのようです。メソッドはたくさんありますし、エラーが発生する状況もさまざまですから、表示されるメッセージもいろいろなのでしょう。なお、メソッドではなくプロパティ設定のエラーで実行時エラー'1004'が発生することもあります。

Sub Sample10()
    Range("A1").ColumnWidth = "tanaka"
End Sub

何だかもう「分類されないその他のエラー群」みたいな感じですね。ちなみに、ヘルプの「トラップできるエラー」の一覧には、この1004はリストアップされていません。でも、トラップできるので、解説に加えておきました。

(2019年1月追記)

さっき気づきました。開こうとしたブックが見つからないと、この1004エラーになるんですけど、そのメッセージが変わってますね。

謝っちゃってますw 申し訳ございませんってw これ、英語だとI'm so sorry...みたいな表示なんでしようか。たぶん「[ファイル]メニュー」という表記を消したかったんでしょうね。まぁ、エラーメッセージってのは、今までのちょこちょこ変わってましたから、いいんですけど。ちなみに確認したところ、Excel 2003~Excel 2010までは下図のメッセージでした。これは今までどおり。

Excel 2013以降は謝ってます。つーことは、VBAはExcel 2013以降で同じバージョンが使われているということですね。まぁ、調べれば分かりますけど。いずれにしても、Excel 2010までを改訂しなかったということは、Microsoftとしてはもう「2010はいいだろ~」って考えているということですね。2020年にはサポートも切れますし。