【问题标题】:ActiveWorkbook.Names.add seems to be incompatible with "Function"ActiveWorkbook.Names.add 似乎与“功能”不兼容
【发布时间】:2014-10-23 17:42:40
【问题描述】:

我有一个问题:

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"

问题似乎来自“功能”的使用,因为如果我尝试使用“子”执行它,它就可以工作。

谁能解释一下为什么我不能用“函数”来做这个,否则我该如何复制这个函数?

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

P.S.2 : 此函数旨在用于 excel 公式。

P.S.3:使用的参数是:地址 = J18:L20 和名称 =“测试”。最后,我想用名称替换“toto”,用地址替换“=Interface!$I$19”。

感谢您的帮助。

【问题讨论】:

  • 你的代码能编译吗?做一个调试 - >编译。你的函数返回什么?
  • 你传递给函数的参数是什么?我刚刚通过代码没有错误。另外,尝试转到工具>>选项>>常规并选择“所有错误中断”。这将使您结束错误处理程序的路由并查看实际情况。

标签: vba names


【解决方案1】:

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

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 中执行这些问题的事情。

【讨论】:

  • 我理解您的评论,但我确实需要使用“功能”,因为我希望用户能够轻松创建名称,只需告知范围和名称。并且输出中的名称将用于其他将使用此名称传递的范围的函数。
  • 我认为情况并非如此。我的印象是一个函数等同于一个 Sub,除了它有一个返回值。用户定义函数是遵循特定规则并可在 Excel 公式中使用的函数的特例。在 UDF 中,是的,您不能做某些改变 Excel 状态的事情(您指定的一些事情 - 尽管您肯定可以创建对象(例如集合))。出于真正的好奇,我很可能是错的,您是否有一个链接/示例,其中在 VBA 中调用的函数与 Sub 的执行方式不同?
  • 这个答案具有误导性,除非专门针对从工作表作为 UDF 调用的函数。否则,在这种情况之外,sub 与 function 没有根本区别。
猜你喜欢
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2013-04-15
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多