Excel VBA,从不活动工作表中获取范围

Excel VBA, getting range from an inactive sheet

提问人:Aziz 提问时间:11/8/2011 最后编辑:feetwetAziz 更新时间:4/11/2021 访问量:77547

问:

当我查看“临时”工作表时,此脚本工作正常。但是当我在另一个工作表中时,复制命令失败了。它给出了一个:Application-defined or object-defined error

Sheets("Temp").Range(Cells(1), Cells(1).End(xlDown)).Copy
Sheets("Overview").Range("C40").PasteSpecial

我可以改用这个脚本,但是粘贴它时遇到了问题:

Sheets("Temp").Columns(1).Copy
Sheets("Overview").Range("C40").PasteSpecial

我不想激活“临时”表来获取此内容。

我还能做些什么?

Excel VBA

评论

0赞 Aziz 11/8/2011
我找到了一个有效的解决方案:Sheets(“Temp”)。范围(“A1:A1000”)。复制,但我不喜欢它。我不想要一个有限制的脚本。

答:

51赞 chris neilsen 11/8/2011 #1

您的问题是,由于 中的引用是不合格的,因此它们引用了默认工作表,这可能不是您想要的工作表。 对于标准模块、模块、自定义类和用户窗体模块,defeault 是 .对于模块背后的代码,就是那个工作表。CellRangeThisWorkbookActiveSheetWorksheet

对于模块后面的工作表代码以外的模块,您的代码实际上是在说

Sheets("Temp").Range(ActiveSheet.Cells(1), ActiveSheet.Cells(1).End(xlDown)).Copy
Sheets("Overview").Range("C40").PasteSpecial

对于模块背后的工作表代码,您的代码实际上是在说

Sheets("Temp").Range(Me.Cells(1), Me.Cells(1).End(xlDown)).Copy
Sheets("Overview").Range("C40").PasteSpecial

无论哪种情况,解决方案都是相同的:使用所需的工作簿完全限定范围引用:

Dim sh1 As Worksheet
Dim sh2 As Worksheet

Set sh1 = ActiveWorkbook.Sheets("Temp")
Set sh2 = ActiveWorkbook.Sheets("Overview")

With sh1
    .Range(.Cells(1,1), .Cells(1,1).End(xlDown)).Copy
End With
sh2.Range("C40").PasteSpecial

注意:使用时,这可能会导致范围超出您的预期。如果您的工作表布局允许,最好使用。如果没有,请首先检查引用的单元格和下面的单元格。.End(xlDown).End(xlUp)Empty

评论

4赞 Aziz 11/8/2011
答案是肯定的!你太棒了!:D多谢。我应该使用 Sheets(“Temp”)。范围(Sheets(“Temp”)。Cells(1), sheets(“temp”)。细胞(1)。结束(xlDown))。复制。但是你的版本很紧凑,形状更好,所以我抓住了它。:)
4赞 Anonymous 1/16/2015 #2

我自己也遇到过这样的问题:我试图搜索一个单独的工作表,看看单元格的颜色是否与列表中单元格的颜色匹配,并返回一个字符串值:如果你使用.单元格(行,列),你只需要这个: Sheets(“sheetname”)。单元格(行、列) 以引用该单元格范围。

我正在循环浏览一个由 500 个单元格组成的块,它对我来说工作得非常快。

我还没有尝试过.复制,但我认为它会以同样的方式工作。

3赞 GMalc 11/15/2017 #3

这样就可以了,我不喜欢在单元格为空的情况下使用(xlDown)。

Dim lRow As Long
lRow = Sheets("Temp").Cells(Cells.Rows.Count, "A").End(xlUp).Row

With Sheets("Temp")
     .Range("A1:A" & lRow).Copy Sheets("Overview").Range("C40")
End With

或者,如果您只想使用列...

Sheets("Temp").Columns(1).SpecialCells(xlCellTypeConstants).Copy Destination:=Sheets("Overview").Range("C40")