【问题标题】:Excel VBA, getting range from an inactive sheetExcel VBA,从非活动工作表中获取范围
【发布时间】: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 ,但我不喜欢它。我不想要有限制的脚本。

标签: excel vba


【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多