我遇到了问题:
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”。
感谢您的帮助。
答案 0 :(得分:0)
在下面的评论之后,我开始思考,并意识到我的原始答案(见下文)可能更基于(我自己的!)最佳实践,而不是技术上正确。
Function
和Subroutine
之间的主要区别在于Function
可以返回值,而Subroutine
则不能。
我听说过使用Function
而不是Subroutine
时遇到的其他问题,但现在找不到列表。你显然找到了一个!这些(也许)有关问题的谣言,就是为什么我倾向于将行动限制在Subroutines
,并将值返回Functions
。
经过一番挖掘后,我发现以下资源可能有助于进一步解释两者之间的区别。
来自Chip Pearson的网站:一个名为Macros and Functions的页面
来自ExcelFunctions.net:一个名为Excel VBA Tutorial Part 4 - VBA Functions & Subroutines的页面
看起来我今天学到了一些东西。
==原始答案==
简短回答和超级高级
Functions
通常不是执行操作的最佳位置(在工作表,单元格,文件,创建对象等)。他们非常擅长返回价值观,而这正是他们的目标。
Subs
或建立程序以采取行动。
我从未见过这个特定的问题,但是遇到了许多试图在Function
中执行此操作的问题。