Excelで実行時エラー1004を修正する方法

実行時エラー1004は、Microsoft Excelユーザーに影響することが知られているMicrosoft Visual Basicに関連するエラーコードです。 このエラーはExcel 2003およびExcel 2007で最も一般的であることが知られていますが、Microsoftの一般的なコンピューター用ワークシートアプリケーションのバージョンは、ランタイムエラー1004の脅威から安全ではありません。実行時エラー1004の2つの異なるバリエーション。全体として、実行時エラー1004の2つのバリエーションは次のとおりです。

実行時エラー '1004':

ワークシートクラスのコピーメソッドが失敗しました ''

実行時エラー '1004':

アプリケーション定義またはオブジェクト定義のエラー”

表示される正確なエラーメッセージは、いくつかのケースでは若干異なる場合がありますが、エラーコードは同じままです。 ただし、発生する問題のバージョンに関係なく、ワークシートをコピーし、コピーを元のワークシートと同じブックに配置するように設計されたマクロをExcelで実行すると、ほとんど常に発生します。

最悪の技術的な問題とは異なり、Microsoft Excel内の実行時エラー1004の原因はわかっています。 実行時エラー1004は、マクロを実行する前に保存して閉じなかった定義済みの名前で、実行中のマクロが元のワークシートをブックにコピーしているときに発生します。 このようなマクロの例は、次のコードで見ることができます。

 Sub CopySheetTest() Dim iTemp As Integer Dim oBook As Workbook Dim iCounter As Integer ' Create a new blank workbook: iTemp = Application.SheetsInNewWorkbook Application.SheetsInNewWorkbook = 1 Set oBook = Application.Workbooks.Add Application.SheetsInNewWorkbook = iTemp ' Add a defined name to the workbook ' that RefersTo a range: oBook.Names.Add Name:="tempRange", _ RefersTo:="=Sheet1!$A$1" ' Save the workbook: oBook.SaveAs "c:\test2.xls" ' Copy the sheet in a loop. Eventually, ' you get error 1004: Copy Method of ' Worksheet class failed. For iCounter = 1 To 275 oBook.Worksheets(1).Copy After:=oBook.Worksheets(1) Next End Sub 

Microsoft Excelのコンテキストでの実行時エラー1004の原因は、解像度と同様にわかっているためです。 この問題の解決策に加えて、この問題の影響を受けるユーザーが利用できるのは、解決策が機能しない場合、または解決策が実行可能なオプションであることが分からない場合に使用できる回避策です。

ソリューション:

この特定の問題の解決策は、実行中のマクロのコードを編集して、ワークシートのコピーを作成している間、定期的にターゲットブックを保存して閉じるようにすることです。 これを行うマクロのコードは、次の行に沿って表示されます。

 Sub CopySheetTest() Dim iTemp As Integer Dim oBook As Workbook Dim iCounter As Integer ' Create a new blank workbook: iTemp = Application.SheetsInNewWorkbook Application.SheetsInNewWorkbook = 1 Set oBook = Application.Workbooks.Add Application.SheetsInNewWorkbook = iTemp ' Add a defined name to the workbook ' that RefersTo a range: oBook.Names.Add Name:="tempRange", _ RefersTo:="=Sheet1!$A$1" ' Save the workbook: oBook.SaveAs "c:\test2.xls" ' Copy the sheet in a loop. Eventually, ' you get error 1004: Copy Method of ' Worksheet class failed. For iCounter = 1 To 275 oBook.Worksheets(1).Copy After:=oBook.Worksheets(1) 'Uncomment this code for the workaround: 'Save, close, and reopen after every 100 iterations: If iCounter Mod 100 = 0 Then oBook.Close SaveChanges:=True Set oBook = Nothing Set oBook = Application.Workbooks.Open("c:\test2.xls") End If Next End Sub 

注:コピーを保存するワークブックを保存して閉じる前にワークシートをコピーできる正確な回数は、コピーを作成するワークシートのサイズに依存するため、ケースごとに異なります。

回避策:

前述のように、この特定の問題に対する回避策も存在します。 この問題を回避するには、既存のワークシートのコピーを作成するのではなく、テンプレートから新しいワークシートを挿入するだけです。 この問題を回避したい場合は、次のことを行う必要があります。

  1. Excelを起動します
  2. 新しいワークブックを作成し、ワークブックに含まれるすべてのワークシートを削除して、1つずつ保存します。

  3. ブックをフォーマットします。
  4. デフォルトでテンプレートに含めるテキスト、データ、グラフをワークブックに含まれる唯一のワークシートに追加します。
  5. Excel 2003以前を使用している場合は、[ ファイル ]> [ 名前を付けて保存 ]をクリックします 。 一方、Excel 2007以降を使用している場合は、[ Microsoft Office ]ボタンをクリックし、[名前を付けて保存 ]をクリックします

  6. [ファイル名 ]フィールドに、テンプレートを呼び出す名前を入力します。
  7. [ ファイルの 種類 ]フィールドの横にあるドロップダウンメニューを開き、Excel 2003以前を使用している場合はExcel テンプレート(.xlt)をクリックし、Excel 2007以降を使用している場合はExcel テンプレート(.xltx)をクリックして選択します。

  8. 保存をクリックします

  9. テンプレートを正常に作成したら、次のコード行を使用してプログラムで挿入できます。

    Sheets.Add Type:= path \ filename

注:上記のコード行では、作成したばかりのシートテンプレートの場所のpath \ filenameを完全なファイル名(完全なファイル名を含む)に置き換える必要があります。

興味深い記事