在不同子例程中使用变量的不同方法

时间:2014-11-04 17:07:39

标签: vba excel-vba excel

我正在尝试设置一个要调用的子,并在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,我该怎么写呢?谢谢!

1 个答案:

答案 0 :(得分:4)

  

到目前为止,我一直在使用Function来继承价值。

很好,这就是功能的用途!当你只需要返回一个值时,最好的方法就是一个函数。

当您开始需要返回两个或更多值时,事情变得更加模糊。你可以:

  • 使用ByRef参数并将其用作“out”值。

    对于过程Sub)来说这是“好的”,并且对函数感到困惑 - 什么决定了哪个参数成为函数的返回值,以及哪些参数被传递{ {1}}?调用代码如何知道是否将初始值传递给那些ByRef参数?

    命名约定可以在这里提供帮助:

    ByRef

    “out”前缀可以告诉调用代码该参数是 out 值。

  • 将变量范围限定在调用者和被调用者都可访问的级别。

    这是一种不好的做法,很容易导致意大利面条代码。避免它 - 变量应该具有尽可能小的必要范围,并且在方法/函数/过程/模块之间传递,而不是在任何给定时间由任何人全局范围和访问!

  • 创建一个类来封装函数应该返回的所有值。

    绝对更多面向对象的,可以产生更清晰,可读的代码。唯一的缺点是VBA并不真的鼓励你这样做,始终这样做会导致你无法组织的无数课程。