【问题标题】:Failing to copy one cell to another cell using Destination Copy无法使用目标复制将一个单元格复制到另一个单元格
【发布时间】:2020-03-10 20:50:19
【问题描述】:
Range("A1").Copy (Range("E5"))

这失败了,但是如果我将目标范围明确定义为目标,如下所示,它可以工作。

Range("A1").Copy Destination:=Range("E5")

如果我为我的目的地提供工作表参考,如下所示,它也可以:

Range("A1").Copy (Worksheets("Sheet1).Range("E5"))

为什么最简单的形式,不行,给我

运行时错误 1004:“Range 类的复制方法失败”

改为?

【问题讨论】:

    标签: excel vba copy range runtime-error


    【解决方案1】:

    两者的区别

    Range("A1").Copy (Range("E5"))
    

    Range("A1").Copy Range("E5")
    

    是第一个将ByRef 参数转换为ByVal 而第二个没有。此处的括号代表转换,而不是您所期望的。

    请注意,您只能在使用函数(返回值)时使用括号,而在使用过程时不能

    例子

    a = MyFunction(Parameter1, Parameter2)   'correct with parenthesis
    MyProcedure Parameter1, Parameter2       'correct w/o parenthesis
    
    a = MyFunction Parameter1, Parameter2    'it will error
    MyProcedure(Parameter1, Parameter2)      'it will error
    

    现在只有一个参数

    a = MyFunction(Parameter1)   'correct with parenthesis
    MyProcedure Parameter1       'correct w/o parenthesis
    
    a = MyFunction Parameter1    'it will error
    MyProcedure (Parameter1)     'it will NOT error but convert ByRef into ByVal !!!
    

    上面例子的最后一行做了一些与你预期完全不同的事情。您可以注意到过程名称和括号之间的额外空格。和下面的语法一样

    a = MyFunction((Parameter1), (Parameter2))   'convert ByRef into ByVal
    MyProcedure (Parameter1), (Parameter2)       'convert ByRef into ByVal
    

    所以我们可以记下来:

    • 如果函数返回一个我们想要写入变量的值:
      必须使用括号:a = MyFunction(Parameter1)
    • 如果过程(或函数)返回值,则:
      不得使用括号:MyProcedure Parameter1

    【讨论】:

    • 谢谢!那么,为什么我的最后一行代码(带有工作表)可以工作,即使它在括号中?
    • @Malady 实际上我无法解释它为什么起作用(可能是偶然的)。但是语法也是错误的(它也应该没有括号)。无论如何,总是为每个 RangeCells 对象指定一个工作表是一个好习惯。它使您的代码更加可靠,并阻止 Excel 猜测您打算使用哪个工作表。
    • @Malady 如果这回答了您的问题,请点赞/标记为已解决:Accepting Answers: How does it work?
    • 是的,我想我会的,然后在另一个问题中询问不一致的地方......
    • 提出问题,如果你想看:stackoverflow.com/questions/58996540/…
    【解决方案2】:

    你必须去掉括号

    Range("A1").Copy Range("E5")
    

    【讨论】:

    • 扩展为什么这会有所帮助,但也使它成为上述内容的欺骗......所以,也许删除?我不知道。
    • @Malady 不需要删除它,你可以投票给你最喜欢的解决方案并接受它作为答案Accepting Answers: How does it work?