提问人:Aziz 提问时间:11/8/2011 最后编辑:feetwetAziz 更新时间:4/11/2021 访问量:77547
Excel VBA,从不活动工作表中获取范围
Excel VBA, getting range from an inactive sheet
问:
当我查看“临时”工作表时,此脚本工作正常。但是当我在另一个工作表中时,复制命令失败了。它给出了一个: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
我不想激活“临时”表来获取此内容。
我还能做些什么?
答:
51赞
chris neilsen
11/8/2011
#1
您的问题是,由于 中的引用是不合格的,因此它们引用了默认工作表,这可能不是您想要的工作表。
对于标准模块、模块、自定义类和用户窗体模块,defeault 是 .对于模块背后的代码,就是那个工作表。Cell
Range
ThisWorkbook
ActiveSheet
Worksheet
对于模块后面的工作表代码以外的模块,您的代码实际上是在说
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")
评论