web-dev-qa-db-ja.com

VBA-実行時エラー1004「アプリケーション定義またはオブジェクト定義エラー」

テンプレートシートを初めて実行するときに新しいシートにコピーするExcelドキュメントがあります。このテンプレートに続くシートは、新しく作成されたシートに追加されます。

コードのこのセクションのタイトルでエラーが発生しています:

_If Worksheets("User Configuration").Cells(9, 15).Value = 1 Then
  Worksheets("Cable Cards Template").Range("A1:J33").Copy

  With Worksheets("Cable Cards")
  **.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues**
    .Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlFormats
  End With

  Worksheets("Cable Cards Template").Shapes("Picture 1").Copy
  Worksheets("Cable Cards").Paste Cells(RangeStartRow, RangeStartColumn)

  Call Sheets.FormatCableCardRows      
End If
_

基本的にIfステートメントがtrue(セル= 1)の場合、特定のシートの範囲をコピーして、値と書式設定にPasteSpecialを使用して指定された範囲で新しいシートに貼り付けます。 。それに続いて、「新しく作成された」シートの画像がテンプレートの左上のセルにコピーされ、サブルーチンが呼び出されて新しいシートの行をフォーマットします。

With Worksheets("Cable Cards")ステートメントの後の最初の_.Range_呼び出しでエラーが発生しています。 Withステートメントを使用せずに、特殊貼り付けなどの代わりに値を直接コピーしようとしました。奇妙なことは、新しいシートが作成されたときに、これが最初に実行されることです。

_If (RangeStartRow = 1) Then
  Worksheets.Add().Name = "Cable Cards" ' Create new sheet with given name only on first cable card
  Columns(1).ColumnWidth = 9.43
  Columns(6).ColumnWidth = 11
  Columns(10).ColumnWidth = 9
  Call FormatForA5Printing("Cable Cards", 71)
End If
_

しかし、2回目には、_Run Time Error 1004 'Application Defined or Object Defined Error'_で完全に失敗します。私はどんな助けにも感謝します。

4
user3105671

セルオブジェクトは完全修飾されていません。 cellsオブジェクトの前にDOTを追加する必要があります。例えば

With Worksheets("Cable Cards")
    .Range(.Cells(RangeStartRow, RangeStartColumn), _
           .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues

同様に、すべてのCellsオブジェクトを完全に修飾します。

14
Siddharth Rout

ソリューション#1:あなたの声明

_.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues
_

適切なRangeを参照していません。代わりに、

_.Range(.Cells(RangeStartRow, RangeStartColumn), .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues
_

します(他の場合も同様です)。

ソリューション#2:セルを使用する前にWorksheets("Cable Cards")をアクティブにします。

説明Cells(RangeStartRow, RangeStartColumn)(eg)はRangeを提供し、そのwouldは大丈夫です。このようにCellsがよく使用されるのはなぜですか。ただし、特定のオブジェクトには適用されないため、ActiveSheetに適用されます。したがって、コードは.Range(rng1, rng2)を使用しようとします。ここで_.Range_は1つのWorksheetオブジェクトのメソッドであり、_rng1_と_rng2_は異なるWorksheetにあります。

これを明確にするためにできるチェックは2つあります。

  1. Subを実行する前にWorksheets("Cable Cards")をアクティブにすると、動作し始めます(これで、Rangesへの整形式の参照ができました)。投稿したコードの場合、_.Activate_の直後に_With..._を追加することが実際に解決策となりますが、別のRangeWorksheetを参照するときにコード内のどこかで同様の問題が発生する可能性があります。

  2. Worksheets("Cable Cards")以外のシートを使用して、エラーをスローする行にブレークポイントを設定し、Subを開始し、実行が中断したときにイミディエイトウィンドウに書き込みます。

    Debug.Print Cells(RangeStartRow, RangeStartColumn).Address(external:=True)

    Debug.Print .Cells(RangeStartRow, RangeStartColumn).Address(external:=True)

    異なる結果を確認してください。

結論:指定されたオブジェクト(CellsRangeなど)なしでWorksheetまたはRangeを使用することは、特にSheetがアクティブであるかどうかがわからない限り、複数のSheetで作業する場合は危険です。

5
sancho.s

「=」で始まる値を割り当てると、式の評価が開始され、私の場合、上記のエラー#1004が発生します。スペースを前に付けることは私にとって切符でした。

1
Mosca Pt