是否可以创建一个返回对象的函数?

时间:2018-06-14 16:11:24

标签: excel vba excel-vba

我正在研究一个宏,它需要使用以下方法引用大量命名范围:

ThisWorkbook.Names("$NAMEDRANGE$").RefersToRange.$METHOD$

我认为如果我可以创建一个我可以使用的函数,它可能会使代码更容易阅读/使用,如下所示:

NamedRange("$NAMEDRANGE$").$METHOD$

如果不知道它是否可行,我尝试了以下内容:

Function NamedRange(ByVal sName As String) As Object
    return ThisWorkbook.Names(sName).RefersToRange

End Function

这甚至不会编译,产生

  

预期:声明结束

我想我可能需要使用课程模块,但我对它们并不熟悉。这是可能的,还是我应该在每一行上拼出整个参考文献?

我在C上花了太多时间。这段代码完美无缺:

Function NamedRange(ByVal sName As String) As Object
   Set NamedRange = ThisWorkbook.Names(sName).RefersToRange

End Function

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

Return语句确实存在于VBA中,但它与过时的GoSub语句一起使用,从SubFunction范围之前的时间开始是一件事 - 提示QBasic回忆......

    foo = 42
    GoSub Increment
    Debug.Print foo ' prints 43
    Exit Sub
Increment:
    foo = foo + 1
    Return

所以VBA真的希望语句能够立即跟随Return令牌,因此"预期:结束声明"错误。

这不是你想要的。在VBA中,Function(和Property Get)成员的返回值是通过字面分配给成员标识符来分配的:

Function GetFoo() As Long
    GetFoo = 42
End Function

由于您要返回对象引用,因此需要Set关键字:

Function GetBar() As Something
    Set GetBar = New Something
End Function

请注意,执行不会立即将返回给调用者 - 如果您需要立即退出函数范围,则需要Exit Function explcitly。

答案 1 :(得分:2)

我不确定您的某些语法(您是否正在组合语言?),但要回答您的问题......

是的,VBA函数可以返回一个对象。

您必须确保正确声明它并且返回值为Set,就像将对象分配给变量一样。

Function myFunction() As Worksheet
    Set myFunction = Worksheets("Sheet1")
End Function

Sub myTest()
    Debug.Print myFunction.Name
End Sub

我不知道在VBA中这个意义上使用return,也不知道$美元符号。 ($可以用作shortcut来指定String数据类型。)