VBA 认为 Return 是一个变量

VBA thinks Return is a variable

我试图以这样的递归方式制作斐波那契数列:

Option Explicit
Dim n, contador, termo

function fibonacci(n)
  if n < 2 then
    Return n
  else
    Return fibonacci(n-1) + fibonacci(n-2)
  end if        
End function

termo = InputBox("Diga ate que termo vai a sequencia de fibonacci")*1

for contador = 0 to termo
  MsgBox fibonacci(contador)
next

但我收到错误:变量未定义:'Return' 我的代码有什么问题?

VBA 函数的 return 值未 return 使用 Return 关键字编辑。

事实上,Return 作为关键字的唯一有效用法是 return 来自 GoSub 跳转:

    foo = 42
    GoSub DoSomething
    Debug.Print foo

DoSomething:
    foo = foo / 2
    Return

GoSub跳转到DoSomething标签,将foo除以2和returns到调用子程序, 将 21 输出到 debug/immediate 窗格。

早于实际 SubFunction 构造的古老关键字和构造。

那么函数return那么如何呢?

通过...(屏住呼吸并捏住鼻子)... 分配给函数的标识符:

Function GetFoo() As Integer
    GetFoo = 42
End Function

属性 吸气剂相同:

Property Get Foo() As Integer
    Foo = 42
End Property

最好的部分?这样做不会 return。它决定了return值。如果你需要立即退出(比如,因为有其他代码会 运行 否则),你需要使用 Exit Function.

Function GetFoo() As Integer
    GetFoo = 42
    Exit Function
    Debug.Print "dead code here"
End Function

当您想 return 函数的值时,您可以将该值设置为函数的名称,如下所示:

function fibonacci(n)
  if n < 2 then
    fibonacci = n
  else
    fibonacci = fibonacci(n-1) + fibonacci(n-2)
  end if        
End function

你的函数有一个逻辑错误,你的 for 循环是 returning termo + 1 个元素,因为你包含了元素 0、1、2 和 3。所以你可以将 for 循环设置为从 0 到 termo-1.

改为...

Function fibonacci(n)
    If n < 1 Then
        fibonacci = n
    Else
        fibonacci = n + fibonacci(n - 1)
    End if        
End Function