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

Posted

技术标签:

【中文标题】Excel VBA,从非活动工作表中获取范围【英文标题】:Excel VBA, getting range from an inactive sheet 【发布时间】:2011-12-24 06:41:57 【问题描述】:

当我查看“临时”表时,此脚本运行良好。但是当我在另一张纸上时,复制命令就会失败。它给出了一个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

我不想激活“临时”表来获取这个。

我还能做什么?

【问题讨论】:

我找到了一个有效的解决方案: Sheets("Temp").Range("A1:A1000").Copy ,但我不喜欢它。我不想要有限制的脚本。 【参考方案1】:

您的问题是,因为 Range 中的 Cell 引用是不合格的,它们引用了默认工作表,这可能不是您想要的工作表。 对于标准模块、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

【讨论】:

当然!你太棒了! :D 非常感谢。我应该使用 Sheets("Temp").Range(Sheets("Temp").Cells(1), Sheets("Temp").Cells(1).End(xlDown)).Copy 。但是您的版本紧凑且格式更好,所以我抓住了它。 :)【参考方案2】:

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

我正在遍历一个包含 500 个单元的块,它对我来说工作得非常快。

我没有用 .Copy 尝试过这个,但我认为它会以同样的方式工作。

【讨论】:

【参考方案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")

【讨论】:

以上是关于Excel VBA,从非活动工作表中获取范围的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA:如果在范围内找不到值,请转到

Excel VBA 用户定义函数:在工作表函数中获取单元格被调用

当其他Excel实例具有焦点时,无法获取活动工作表或选定范围

将控件(ActiveX或非ActiveX)添加到图表(Excel VBA)

Excel VBA - 循环遍历多个文件夹中的文件,复制范围,粘贴到此工作簿中

Excel VBA获取选定数据透视表行的项目详细信息