2015-11-19 58 views
0

为什么可以使用:差范围(和表()柱

Sheets("SKU Opt").Columns("D:D").Copy 

从任何片,但是我只可以使用:

Sheets("SKU Opt").Range(Range("D2"), Range("D2").End(xlDown)).Copy 

从' SKU Opt'表单?

当我尝试运行除“SKU Opt”表单之外的任何表单中的第二个表单时,出现“应用程序定义的错误或对象定义的错误”。

+0

问题是'Range(“D2”)'是不合格的,并且默认为活动工作表。你需要用......和'.Range(“D2”)',正如BruceWayne所指出的那样。 –

回答

2

您需要在与多个工作努力改变这种以

Sheets("SKU Opt").Range(Sheets("SKU Opt").Range("D2"), Sheets("SKU Opt").Range("D2").End(xlDown)).Copy

,你应该总是符合你正在使用的工作表。正如你所看到的,当你不知道的时候,可能会出现错误。正如您所见,它正在寻找一个范围的“SKU Opt”页面,但后来的范围并不完全清楚。没有指定,Range()集将来自活动工作表。当活动工作表与“SKU选项”不同时,它最有可能发生错误。

另一种方法是使用With

With Sheets("SKU Opt") 
    .Range(.Range("D2"),.Range("D2").End(xlDown)).Copy 
End With 
+0

@ScottCraner - 哈哈,是的,当我看到你的评论出现时,我正在输入我的答案。不打算带走您的答案:P – BruceWayne

+0

非常感谢!我一直在努力学习如何在没有选择vba代码的情况下进行选择。它使我的代码变得更加清晰,但也让这样的事情变得更加混乱。感谢您的帮助!对此,我真的非常感激! –

+0

@CollinC。 “我一直在努力学习如何在不使用vb​​a代码的情况下。选择...”,**是的,**这就是我喜欢听到的!它会为你做很多好事。我建议做一些“标准”的excel事情,并用宏录像机记录下来。然后,检查代码并尝试删除* all *'.Select'(基本上,你只需将两行以'.Select'结尾并以'Selection.'开头。此外,这里有一个[nice SO thread](http ://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros)避免'.Select'。你的作业是通读:P – BruceWayne

0

我个人喜欢使用以下格式在我的代码的顶部。可能有多个工作簿在同一个Excel实例(应用程序)中打开。使用相同的工作表名称,因此您想要指定工作簿以更安全。

这也有让您的代码更容易阅读的额外好处!

Dim sheet as Worksheet 

set sheet = ThisWorkbook.Worksheets("SKU Opt") 

sheet.Range(sheet.Range("D2"), sheet.Range("D2").End(xlDown)).Copy 
+0

替代方法是使用'With'语句,而不是声明图纸变量然后使用它。 'With'告诉代码,任何来源不明的引用。即:'With Sheets(1)'后面跟着一行说'.Range(“D2”)。Formula =“Foobar”'的行后面跟着结尾'End With'。请注意,你仍然需要一个“。”在Range的前面,表明你正在引用“With”语句中的一个项目。 –

+0

只是一个注释 - 我个人建议不要使用'Sheet'(也是'Cell')作为工作表的变量名称。这是因为它非常接近受保护的单词“表格”,并可能导致一些混淆。也许可以使用'mainWS'或其他一些东西,这些描述更具描述性,你可以一目了然地看到你正在使用的工作表,而不是一个通用的单词,而这个单词并不真正。 – BruceWayne

+0

这个方法也能真正帮助我。我要投入蝙蝠侠的改进并开始使用它。谢谢! –

0

上其他的答案另一种变化:

Dim firstCell, lastCell As Range 
Set firstCell = Sheets("SKU Opt").Range("D2") 
Set lastCell = firstCell.End(xlDown) 
Range(firstCell, lastCell).Copy 

注意lastCellfirstCell和片材仅需要设置firstCell时要参考的。