【问题标题】:VBA thinks Return is a variableVBA认为Return是一个变量
【发布时间】:2016-07-01 13:20:09
【问题描述】:

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

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 中使用
  • @TimWilliams 不应该。我希望它不再被使用。真的。
  • 我想我应该澄清一下在那种情况下 ;-)

标签: vba function fibonacci


【解决方案1】:

VBA 函数的返回值不与 Return 关键字一起返回。

事实上,Return 作为关键字的唯一有效用法是从 GoSub 跳转返回:

    foo = 42
    GoSub DoSomething
    Debug.Print foo

DoSomething:
    foo = foo / 2
    Return

GoSub 跳转到DoSomething 标签,将foo 除以 2 并返回调用子例程,将 21 输出到调试/立即窗格。

一个古老的关键字和结构,早于实际 SubFunction 结构的引入。

那么函数如何返回呢?

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

Function GetFoo() As Integer
    GetFoo = 42
End Function

对于属性获取器也是如此:

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

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

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

【讨论】:

  • (屏住呼吸捏住鼻子)。哈哈+1
  • 哇,GoSub 勾起了 25 年前的回忆。
【解决方案2】:

更改为...

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

【讨论】:

    【解决方案3】:

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

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

    虽然您的函数存在逻辑错误,但您的 for 循环返回 termo + 1 个元素,因为您包含元素 0、1、2 和 3。因此您可以将 for 循环设置为从 0 到 termo-1。

    【讨论】:

      猜你喜欢
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多