文書番号: 210684 - 最終更新日: 2007年5月18日 - リビジョン: 6.3

Excel でプログラムを使用してワークシートをコピーするとランタイム エラー 1004 が発生する

目次

すべて展開する | すべて折りたたむ

現象

Microsoft Excel で、ワークシートをコピーしてからコピー元と同じブックに追加するマクロを実行すると、次のいずれかのようなエラー メッセージが表示される場合があります。
実行時エラー '1004':
Worksheet クラスの Copy メソッドが失敗しました。
実行時エラー '1004':
アプリケーション定義またはオブジェクト定義のエラーです。

原因

マイクロソフトは、この情報をプログラミング言語の使用方法の一例として提供するだけであり、市場性および特定目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。この資料は、例示されているプログラミング言語やプロシージャの作成およびデバッグに使用するツールについて理解されているユーザーを対象としています。Microsoft Support 担当者は、特定のプロシージャの機能についての問い合わせにはお答えできますが、ユーザー固有の目的に合わせた機能の追加、プロシージャの作成などの内容変更は行っておりません。

この問題は、次のサンプル コードのように、ブックに定義名を指定してから、ブックを保存したり閉じたりせずにワークシートを複数回コピーした場合に発生することがあります。
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
				

解決方法

この問題を解決するには、次のサンプル コードのように、コピー処理中にブックを定期的に保存したり閉じたりします。
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
				
: ブックを保存する前にワークシートをコピーできる回数は、ワークシートのサイズによって異なります。

回避策

この問題を回避するには、既存のワークシートをコピーせずに、新しいワークシートをテンプレートから挿入します。これを行うには、実行している Excel のバージョンに応じて次のいずれかの手順を実行します。

Microsoft Office Excel 2007

  1. 新しいブックを作成し、1 つを残して他のワークシートをすべて削除します。
  2. ブックの書式を設定し、テンプレートにデフォルトで必要なテキスト、データ、およびグラフを追加します。
  3. Microsoft Office ボタンをクリックし、[名前を付けて保存] をクリックします。
  4. [ファイル名] ボックスに、Excel テンプレートの名前を入力します。
  5. [ファイルの種類] ボックスの一覧の [Excel テンプレート (*.xltx)] をクリックし、[保存] をクリックします。
  6. プログラムを使用してこのテンプレートを挿入するには、次のコードを使用します。
    Sheets.Add Type:=path\filename
    このコードで、path\filename は、シート テンプレートの完全なパスとファイル名を含む文字列です。

Microsoft Office Excel 2003 およびそれ以前のバージョンの Excel

  1. 新しいブックを作成し、1 つを残して他のワークシートをすべて削除します。
  2. ブックの書式を設定し、テンプレートにデフォルトで必要なテキスト、データ、およびグラフを追加します。
  3. [ファイル] メニューの [名前を付けて保存] をクリックします。
  4. [ファイル名] ボックスに、Excel テンプレートの名前を入力します。
  5. [ファイルの種類] ボックスの一覧の [テンプレート (*.xlt)] をクリックし、[保存] をクリックします。
  6. プログラムを使用してこのテンプレートを挿入するには、次のコードを使用します。
    Sheets.Add Type:=path\filename
    このコードで、path\filename は、シート テンプレートの完全なパスとファイル名を含む文字列です。

状況

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

この資料は以下の製品について記述したものです。
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
キーワード:?
kbprogramming kbmacro kbautomation kbvba kbexpertiseinter kbbug kberrmsg kbpending KB210684
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
 

サポート技術情報の翻訳

 

Related Support Centers