【问题标题】:range.copy Destination "A1" vs "Cells(1,1)" Excel/VBArange.copy 目标“A1”与“单元格(1,1)”Excel/VBA
【发布时间】:2017-06-28 14:53:38
【问题描述】:

考虑以下:

    Sheets("X").Activate
    Sheets("X").Range(Cells(1, 1), Cells(1, 30)).Copy Destination:=Sheets("Y").Range("A1") 'Syntax 1
    Sheets("X").Range(Cells(1, 1), Cells(1, 30)).Copy Destination:=Sheets("Y").Range(Cells(1, 1)) 'Syntax 2

为什么语法 1 有效,而语法 2 遇到“应用程序定义的或对象定义的错误”?

【问题讨论】:

  • Range 是一个字符串或两个标记范围范围的单元格。你可以做Sheets("Y").Range(Sheets("Y").Cells(1, 1).Address(0,0)) 来返回一个字符串。但是你不能表示一个单元格的范围。

标签: excel syntax copy-paste vba


【解决方案1】:

不合格的Cells(1,1)属于ActiveSheet,目前是Sheets("X"),所以不属于Sheets("Y")

OTOH:这应该可行:

Destination:=Sheets("Y").Range(Sheets("Y").Cells(1, 1), Sheets("Y").Cells(1, 1)) 
'                             ^^^^^^^^^^^^^

不要使用不合格的范围。从您的代码中完全删除 Activate stuf。

【讨论】:

    【解决方案2】:

    您没有限定工作表名称。因此,复制发生在 ActiveSheet 上,然后尝试从 ActiveSheet 引用 Cell(1,1) 但在工作表 Y 上:

    Sheets("Y").Range(Cells(1, 1))

    Sheets("Y") 是工作表 Y。 Cells(1,1) 是 ActiveSheet。

    只有在您先激活工作表 X 后,该副本才有效。删除该行,选择另一张纸,它也会失败。

    【讨论】:

    • '复制只有在您先激活工作表 X 后才有效。'我很困惑,因为我激活了工作表“X”,而“A1”在工作表“Y”上引用(并且有效!)。知道 Microsoft 是否会发布任何说明其在后台工作的文档吗?
    • 是的,Sheets("Y").Range("A1") 的工作原理是指 Y 表上的 A1 - 这是一个参考。 Sheets("X").Range(Cells(1, 1), Cells(1, 30)) 使用三个引用 - Sheets("X").Range( 引用 Sheet X 而Cells(1, 1)Cells(1, 30) 引用 ActiveSheet。要让那些也参考工作表 X,您可以编写 Sheets("X").Range(Sheets("X").Cells(1, 1), Sheets("X").Cells(1, 30)) - 但随后它会查看活动工作簿,因此您也需要对其进行限定 - ThisWorkbook.Sheets("X").Range(ThisWorkbook.Sheets("X").Cells(1, 1), ThisWorkbook.Sheets("X").Cells(1, 30))
    • 我之前评论中的最后一段代码变得非常笨拙——这就是为什么会有With...End With 块。 msdn.microsoft.com/en-us/library/wc500chb(v=vs.90).aspx 或使用变量:Set wrkSht = ThisWorbook.Worksheets(X)wrksht.Range(wrksht.Cells(1, 1), wrksht.Cells(1, 30))
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多