我正在尝试设置一个要调用的子,并在main子元素中使用其结果的值。到目前为止,我一直在使用Function来继承价值。但是,我想知道是否有其他方法可以做同样的事情?我认为ByVal / ByRef是另一种使用Sub而不是Function的方法。我目前的代码如下:
Sub Main()
Dim i as Long
i = lr("A")
'some other calculations using i
End Sub
Function lr(Tar As String) As Long
Dim twb As Workbook
Set twb = ThisWorkbook
lr = ThisWorkbook.Sheets(1).Range(Tar & Rows.Count).End(xlUp).Row
End Function
我的问题是,如果我使用Sub而不是Function,我该怎么写呢?谢谢!
答案 0 :(得分:4)
到目前为止,我一直在使用Function来继承价值。
很好,这就是功能的用途!当你只需要返回一个值时,最好的方法就是一个函数。
当您开始需要返回两个或更多值时,事情变得更加模糊。你可以:
使用ByRef
参数并将其用作“out”值。
对于过程(Sub
)来说这是“好的”,并且对函数感到困惑 - 什么决定了哪个参数成为函数的返回值,以及哪些参数被传递{ {1}}?调用代码如何知道是否将初始值传递给那些ByRef
参数?
命名约定可以在这里提供帮助:
ByRef
“out”前缀可以告诉调用代码该参数是 out 值。
将变量范围限定在调用者和被调用者都可访问的级别。
这是一种不好的做法,很容易导致意大利面条代码。避免它 - 变量应该具有尽可能小的必要范围,并且在方法/函数/过程/模块之间传递,而不是在任何给定时间由任何人全局范围和访问!
创建一个类来封装函数应该返回的所有值。
绝对更多面向对象的,可以产生更清晰,可读的代码。唯一的缺点是VBA并不真的鼓励你这样做,始终这样做会导致你无法组织的无数课程。