使用子程序而不是函数进行输出

Using Subroutine for output instead of a function

此时我认为函数和子程序的作用对我来说已经很清楚了。不过现在不太确定了。。。一直看到写的

"Functions can return values / subroutines cannot return a value."

"a function can only return a single value"(我意识到他们也可以 return 数组等等)。

但如果我将 "result" 变量传递给子例程,我似乎可以有效地 "return a value from a subroutine"...这是否被视为 "poor practice?" 或我是否遗漏了其他一些关键这里的概念...

方法#1(使用函数):

Sub test1()

    Dim x As Integer
    Dim y As Integer
    Dim z As Integer

    x = 2
    y = 3
    z = test2(x, y)

End Sub

Function test2(var1 As Integer, var2 As Integer) As Integer

    test2 = var1 + var2

End Function

方法#2(使用子程序):

Sub test3()

    Dim x As Integer
    Dim y As Integer
    Dim z As Integer

    Call test4(x, y, z)

End Sub

Sub test4(var1 As Integer, var2 As Integer, var3 As Integer)

    var1 = 2
    var2 = 3
    var3 = var1 + var2

End Sub

通常,更改参数值是不好的做法。看看你的例子 - 很明显你的函数用 2 个参数和 returns 一个值(你写到 z)做了一些事情。在第二个示例中,除非您查看子例程,否则您看不到会发生什么 - 不仅是函数定义,您还需要阅读完整的代码,以便您可以判断哪些参数将被操作,哪些不会。

在软件开发中,当你调用一个子程序时,你不想看这个子程序——甚至经常是你看不到它。让子例程完成它的工作,但没有任何副作用。

Use a function whenever possible, it keeps your code much more readable. Trust me...

在(极少数)情况下,您希望从一个子例程中接收多个结果。在那种情况下,我建议在参数前面明确放置关键字 ByRef(即使在 VBA 中这在技术上是不必要的,因为它是默认设置)。并发表评论说明为什么会这样。当您在数周、数月或数年后查看您的代码时,您会感谢自己。