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
对象的方法,而rng1
和rng2
是在不同的Worksheet
。
有两个检查,你可以做到这一点很明显:
-
激活你的
Worksheets("Cable Cards")
之前执行您的Sub
,它会开始工作(现在你有格式引用Range
s)。 对于您发布的代码,在With...
之后添加.Activate
将确实是一个解决scheme,但是在引用另一个Worksheet
的Range
时,您的代码中的其他位置可能也有类似的问题。 -
如果
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
(例如, Worksheet
或Range
)可能会非常危险,尤其是在处理多个工作Sheet
,除非确定工作Sheet
是否有效。
确定一个以“=”开头的值将在公式评估中起作用,并在我的情况下给出了上面提到的错误#1004。 预先给它一个空格是我的门票。