我正在研究一个宏,它需要使用以下方法引用大量命名范围:
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
感谢您的帮助!
答案 0 :(得分:3)
Return
语句确实存在于VBA中,但它与过时的GoSub
语句一起使用,从Sub
和Function
范围之前的时间开始是一件事 - 提示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数据类型。)