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值和格式设置.接下来,"新创建的"工作表应该将图像复制到模板的左上角单元格中,然后调用子程序来格式化新工作表的行.
我.Range在With 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对象.
解决方案#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.
您可以执行两项检查以使其非常明显:
Worksheets("Cable Cards")在执行之前激活你Sub,它将开始工作(现在你已经有了很好的Ranges).对于您发布的代码,将.Activate右后With...确实是一个解决方案,虽然指的是,当你可能有类似的问题在其他地方在你的代码Range中的另一个Worksheet.
使用非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是活动的.