2013-12-16 257 views
4

我有一个Excel文档,它会在第一次运行时将模板工作表复制到新工作表中。任何遵循此模板的更多工作表都会附加到新创建的工作表。VBA - 运行时错误1004'应用程序定义或对象定义错误'

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

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进行值和格式设置的范围内的新工作表中。之后,“新创建的”工作表应该将图像复制到模板的左上角单元格中,然后调用子例程来格式化新工作表的行。

我在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 

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

回答

14

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

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

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

+1

很好地发现。 +1 – hammus

+1

就是这样,谢谢你,否则就永远不会发现它! – user3105671

+0

+1人们经常发现由于不合格的范围导致错误的频率非常高。 –

5

解决方案#1: 你的陈述

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

并不是指到正确的Range时采取行动。相反,

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

确实(以及类似的在其他一些情况下)。在使用其细胞之前激活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确实是一种解决方案,但在您的代码中另一个Worksheet中提及Range时,您可能在其他位置有类似的问题。

  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是活性。

1

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

相关问题