ActiveWorkbook.Names.add似乎与“功能”不兼容

时间:2014-10-23 17:42:40

标签: vba names

我遇到了问题:

Function Create_Model(adress As range, name As String) As String

    Dim Msg As String
    On Error GoTo ErrorHandler
    ActiveWorkbook.Names.add "toto", "=Interface!$I$19"
    Create_Model=name
    Exit Function
ErrorHandler:
    If Err.Number <> 0 Then
        Msg = "Error # " & Str(Err.Number) & " was generated by " _
         & Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description
        MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
    End If
Resume Next

End Function

的确,如果我这样做,我会得到:

"Error #  1004 was generated by VBAProject
 Error Line: 0
 Application-defined or object-defined error"

似乎问题来自于使用“功能”,因为如果我尝试使用“Sub”执行此操作,它就会起作用。

有人可以解释一下为什么我不能用“功能”做这个,以及我怎么能复制这个功能呢?

P.S:如果我使用Debug-&gt;编译VBAProject进行编译。我没有收到任何消息。

P.S.2:此功能旨在用于excel公式。

P.S.3:使用的参数是:adress = J18:L20和name =“Test”。最后,我想用名字替换“toto”和地址取代“= Interface!$ I $ 19”。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在下面的评论之后,我开始思考,并意识到我的原始答案(见下文)可能更基于(我自己的!)最佳实践,而不是技术上正确。

FunctionSubroutine之间的主要区别在于Function可以返回值,而Subroutine则不能。

我听说过使用Function而不是Subroutine时遇到的其他问题,但现在找不到列表。你显然找到了一个!这些(也许)有关问题的谣言,就是为什么我倾向于将行动限制在Subroutines,并将值返回Functions

经过一番挖掘后,我发现以下资源可能有助于进一步解释两者之间的区别。

来自Chip Pearson的网站:一个名为Macros and Functions的页面

来自ExcelFunctions.net:一个名为Excel VBA Tutorial Part 4 - VBA Functions & Subroutines的页面

看起来我今天学到了一些东西。

==原始答案==

简短回答和超级高级

Functions通常不是执行操作的最佳位置(在工作表,单元格,文件,创建对象等)。他们非常擅长返回价值观,而这正是他们的目标。

Subs或建立程序以采取行动。

我从未见过这个特定的问题,但是遇到了许多试图在Function中执行此操作的问题。