【问题标题】:How does ByRef to ByVal by parentheses work, when the ByRef is a Range with a Worksheet reference?当 ByRef 是带有 Worksheet 引用的 Range 时,ByRef 到 ByVal 的括号如何工作?
【发布时间】:2019-11-23 01:11:19
【问题描述】:

Apparently,VBA 函数参数中的括号将 ByRefs 转换为 ByVals,

而 Range Copy,其唯一可用的变量是 Destination Range,需要该目的地是 ByRef 吗?

那么,这是如何工作的?使用 Worksheet Specified 引用的 Cell 是括号中的 ByRef 是否应该转换为 ByVal 并导致 Copy 失败?

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

【问题讨论】:

  • 谁说它需要目的地通过ByRef
  • @Rory - 这就是我从上一个问题的答案中得到的。 - stackoverflow.com/questions/58864512/…
  • 我不确定这是否正确。它需要一个Range 对象,这是真的。检查以下结果:typename((sheets(1).range("A1")))typename((range("A1"))),你应该明白为什么一个有效而另一个无效。
  • @Rory - Range vs. String... 所以我最初的问题接受的答案充满了真实的东西,但对我的问题的解释有误吗?
  • 要将其标记为重复:OP 有兴趣阅读的两个候选人:stackoverflow.com/q/56692769/9101981stackoverflow.com/q/45747604/9101981。可惜我不能在一个标志中添加两个重复项,因为两个帖子都有全面的答案(由 Mathieu 撰写)

标签: excel vba


【解决方案1】:

显然,VBA 函数参数中的括号将 ByRefs 转换为 ByVals。

嗯,不,不完全是。

括号使参数成为一个表达式,该表达式被求值,然后它的被传递。

当你调用一个有两个参数的 Sub 时你会看到这个:

mySub 1, 2       ' this is OK
mySub (1, 2)     ' this makes VB complain

第二个例子由(1, 2) 组成一个表达式;但是,表达式是无效的,所以 VB 会抱怨。

如果你调用一个函数而不使用返回值,那么不要使用括号

myFunction 1, 2        ' this is OK
myFunction (1, 2)      ' this is an error
i = myFunction (1, 2)  ' here the parentheses are required.

【讨论】:

    【解决方案2】:

    有几点:

    1. 复制不关心你如何传递目标Range,只要它是一个Range 对象。所以,例如:

      Range("A1").Copy ByVal Range("B1")

    会正常工作的。

    1. 括号试图评估它们作为表达式的内容。因此,在您的第一种情况下,您最终传递的是范围的 ,而不是范围本身。奇怪的部分实际上是当您添加 Worksheets() 调用时,评估会正确返回 Range 对象。据我所知,这与后期绑定有一些有关,因为 Worksheets 调用返回 Object 类型,而不是 Worksheet。如果您要使用工作表代码名称(例如Sheet1.Range("A1")),则会遇到与最初相同的问题。真的需要像 Mathieu 这样的人来解释它的内部工作原理。

    【讨论】:

    • 一个有用的解释;通过CodeName +1 与参考文献进行比较的好点 :-)
    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2013-03-16
    • 2011-06-21
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多