2014-10-18 88 views
-2

我知道这是一个愚蠢的问题,但我在机智的最终试图弄清楚。在Excel中的范围方法VBA

这段小小的代码导致运行时错误'1004':对象'_Worksheet'的方法'范围'失败。但只有当Sheet3不是活动工作表时。它在Sheet3处于活动状态时会发生什么。

With Sheet3.Range(Cells(1, 1), Cells(nrows1, ncols1)) 
    .Clear 
    .Value = SCDevNeeds1 
End With 

而且,如果我改变的参考表的标签名称,我仍然得到一个运行时错误,但是这一次它是一个应用程序定义或对象定义的错误。这种情况只发生在纸张不活动时:

With Sheets("newest").Range(Cells(1, 1), Cells(nrows1, ncols1)) 
    .Clear 
    .Value = SCDevNeeds1 
End With 

我在想什么?

+1

线被执行时什么是** nrows1,ncols1,**和** ** SCDevNeeds1价值观 – 2014-10-18 21:41:34

+4

如果您不具备参考特定工作表的资格,单元格()始终指向活动工作表。您的代码错误是因为Range引用了sheet3,但Cells()不会除非sheet3处于活动状态。 – 2014-10-18 21:43:28

+1

在这种情况下,是的,但并不总是取决于代码的位置,这使得它更容易出错。 (请参阅下面的答案) – KekuSemau 2014-10-18 22:02:16

回答

1

在表达Sheet3.Range(Cells(1, 1), Cells(nrows1, ncols1))Cells是指:
a)如果代码是一个单独的代码模块
b)该模块的片材,如果代码是一个工作表模块中的活性片。

因此,如果代码位于Sheet3模块内部,代码就可以工作,而不会意外。
您应始终使用对所有Range对象(如Cells,Range,Rows,Columns,...)的完整引用。

Sheet3.Range(Sheet3.Cells(1, 1), Sheet3.Cells(nrows1, ncols1))

1

尝试此代码段

With ThisWorkbook.Sheets("Sheet3") 
    With .Range(.Cells(1, 1), .Cells(100, 2)) 
     .Clear 
     .Value = "" 
    End With 

End With

+0

谢谢ZAZ。 KekuSemau的工作。你的建议似乎是非常高效的代码,但它给了我一个下标超出范围的错误,我不喜欢搞清楚!不过,我很欣赏这个答案。我知道我可以让它工作。 – SteveS 2014-10-18 22:11:32

+0

如果它解决了问题,请接受这个答案。 – ZAZ 2014-10-18 22:24:38

+0

这个论坛比较新。我可以接受这两个答案吗?似乎它不会让我。我确实提出了你的答案。 – SteveS 2014-10-18 22:39:00