VBA – 运行时错误1004'应用程序定义或对象定义错误'

我有一个Excel文档,第一次运行时将模板复制到新工作表中。 跟随此模板的任何更多工作表将附加到新创build的工作表。

我在代码的这一部分的标题中得到错误:

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语句为真(单元格= 1),那么应该复制特定工作表上的一个范围并将其粘贴到使用PasteSpecial给定范围内的新工作表中以获取值和格式。 之后,“新创build的”工作表应该将图像复制到模板的左上angular单元格中,然后调用子例程来格式化新工作表的行。

With Worksheets("Cable Cards")声明之后的第一个.Range调用中出现错误。 我试过不使用With语句,直接复制值而不是粘贴特殊等。奇怪的是,这将运行在第一个去,当新的工作表创build通过:

 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 

但在第二次Run Time Error 1004 'Application Defined or Object Defined Error' ,它完全失败, Run Time Error 1004 'Application Defined or Object Defined Error' 。 我会很感激任何帮助。

您的单元格对象不完全合格。 您需要在单元格对象之前添加一个DOT 。 例如

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

同样,完全限定您所有的单元格对象。

解决scheme1 :你的陈述

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

没有提到适当的Range来采取行动。 代替,

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

(和其他一些情况类似)。

解决scheme#2 :在使用其单元之前激活Worksheets("Cable Cards")

说明Cells(RangeStartRow, RangeStartColumn) (例如)给你一个Range ,这是好的,这就是为什么你经常看到Cells以这种方式使用。 但由于它不适用于特定的对象,它适用于ActiveSheet 。 因此,您的代码尝试使用.Range(rng1, rng2) ,其中.Range是一个Worksheet对象的方法,而rng1rng2是在不同的Worksheet

有两个检查,你可以做到这一点很明显:

  1. 激活你的Worksheets("Cable Cards")之前执行您的Sub ,它会开始工作(现在你有格式引用Range s)。 对于您发布的代码,在With...之后添加.Activate将确实是一个解决scheme,但是在引用另一个WorksheetRange时,您的代码中的其他位置可能也有类似的问题。

  2. 如果Worksheets("Cable Cards")以外的Worksheets("Cable Cards")处于活动状态,请在引发错误的行上设置断点,启动您的Sub ,并在执行中断时,在即时窗口

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

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

    并看到不同的结果。

结论 :在没有指定对象的情况下使用“ Cells或“ Range (例如, WorksheetRange )可能会非常危险,尤其是在处理多个工作Sheet ,除非确定工作Sheet是否有效。

确定一个以“=”开头的值将在公式评估中起作用,并在我的情况下给出了上面提到的错误#1004。 预先给它一个空格是我的门票。