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

use*_*671 4 excel vba excel-2003 excel-vba

我有一个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
Run Code Online (Sandbox Code Playgroud)

基本上,如果If语句为真(单元格= 1),则应将特定工作表上的范围复制并粘贴到新工作表中,其范围为使用PasteSpecial值和格式设置.接下来,"新创建的"工作表应该将图像复制到模板的左上角单元格中,然后调用子程序来格式化新工作表的行.

.RangeWith Worksheets("Cable Cards")声明后的第一次调用时收到错误.我已经尝试过不使用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 Code Online (Sandbox Code Playgroud)

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

Sid*_*out 15

您的单元格对象不是完全限定的.您需要DOT在单元格对象之前添加一个.例如

With Worksheets("Cable Cards")
    .Range(.Cells(RangeStartRow, RangeStartColumn), _
           .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues
Run Code Online (Sandbox Code Playgroud)

同样,完全限定所有Cells对象.


san*_*ica 5

解决方案#1:您的陈述

.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues
Run Code Online (Sandbox Code Playgroud)

没有提到适当Range的行为.代替,

.Range(.Cells(RangeStartRow, RangeStartColumn), .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues
Run Code Online (Sandbox Code Playgroud)

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

解决方案#2:Worksheets("Cable Cards")在使用其细胞之前激活.

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

您可以执行两项检查以使其非常明显:

  1. Worksheets("Cable Cards")在执行之前激活你Sub,它将开始工作(现在你已经有了很好的Ranges).对于您发布的代码,将.Activate右后With...确实是一个解决方案,虽然指的是,当你可能有类似的问题在其他地方在你的代码Range中的另一个Worksheet.

  2. 使用非Worksheets("Cable Cards")活动工作表,在抛出错误的行处设置断点,启动您的Sub执行,并在执行中断时,在立即窗口中写入

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

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

    并看到不同的结果.

结论:使用CellsRange不使用指定的对象(例如,WorksheetRange)可能是危险的,尤其是在使用多个对象时Sheet,除非有人确定什么Sheet是活动的.