首页 > 解决方案 > 无法使用目标复制将一个单元格复制到另一个单元格

问题描述

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

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

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

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

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

为什么最简单的形式,不起作用,给我

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

反而?

标签: excelvbacopyrangeruntime-error

解决方案


和...之间的不同

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

推荐阅读