仅当从引用的工作表中调用时,范围才有效

时间:2018-12-03 18:07:14

标签: excel vba range ms-error-1004

VBA /在这里编程新手!我为宏分配了两个按钮,每个按钮都位于不同的工作表上:“打印页面1”和“优化”。宏从第一个获取信息,然后知道第二次复制范围的次数。

在“优化”处于活动状态时调用时,代码可以正常工作,但是在“打印页面1”工作表处于活动状态时调用时,将在该行上生成“ 1004错误:应用程序定义或对象定义的错误”复制范围。见下文:

Sub Range_Tester()

Dim PrintRow, WallQty

WallQty = Worksheets("Print Page 1").Cells(24, 4)
PrintRow = 20

While WallQty > 1
    Worksheets("Optimization").Range(Cells(PrintRow - 1, 2), Cells(PrintRow - 1, 4)).Copy Worksheets("Optimization").Range(Cells(PrintRow, 2), Cells(PrintRow, 4))
    WallQty = WallQty - 1
    PrintRow = PrintRow + 1
Wend

End Sub

我认为问题是我的范围语法;如果我替换

     Worksheets("Optimization").Range(Cells(PrintRow - 1, 2), Cells(PrintRow - 1, 4)).Copy Worksheets("Optimization").Range(Cells(PrintRow, 2), Cells(PrintRow, 4))

使用

    Worksheets("Optimization").Cells(PrintRow - 1, 2).Copy Worksheets("Optimization").Cells(PrintRow, 2)
    Worksheets("Optimization").Cells(PrintRow - 1, 3).Copy Worksheets("Optimization").Cells(PrintRow, 3)
    Worksheets("Optimization").Cells(PrintRow - 1, 4).Copy Worksheets("Optimization").Cells(PrintRow, 4)

无论哪个工作表处于活动状态,信息都可以完美复制。

我很抱歉问到一个可能是一个愚蠢的简单问题,我只是没有运气找到正确定义可更改位置的范围的信息。

1 个答案:

答案 0 :(得分:2)

Cells是不合格的,隐式指的是ActiveSheet,因为该代码不是在工作表模块中编写的。如果是这样,那么不合格的Cells就像Me.Cells。其他任何地方都是ActiveSheet.Cells

始终使用适当的Worksheet对象显式限定Worksheet成员调用,您可以避免此问题。

Worksheets("Optimization").Range(Cells(PrintRow - 1, 2), Cells(PrintRow - 1, 4)).Copy Worksheets("Optimization").Range(Cells(PrintRow, 2), Cells(PrintRow, 4))

在这里,您要针对.Range调用Worksheets("Optimization"),然后使用Cells(PrintRow - 1, 2)对其进行参数化,其中 可能属于另一个工作表(无论{{1 }}是。当它发生时,事情就炸了。

ActiveSheet引用捕获到Worksheets("Optimization")块变量(或普通的旧局部变量)中:

With

请注意,With Worksheets("Optimization") .Range(.Cells(PrintRow - 1, 2), .Cells(PrintRow - 1, 4)).Copy .Range(.Cells(PrintRow, 2), .Cells(PrintRow, 4)) End With 取消引用运算符使..Cells一样在Worksheets("Optimization")下工作,确保所有内容都从同一张纸中提取。