Excel 如何在用户定义的函数上放置工具提示

Excel 如何在用户定义的函数上放置工具提示,excel,vba,Excel,Vba,在Excel2007中,如何向用户定义的函数添加说明和参数提示?当我开始为内置函数键入函数调用时,Excel会显示一个描述和参数列表——一个工具提示。我想对我定义的函数也这样做 不仅对于公式插入向导,而且在公式框中,因此如果我在“=myFun()的”(“)处键入”=average( 在VBA帮助中没有帮助,在MSDN上没有帮助,在我能找到的任何Excel和VBA专用论坛上也没有帮助,所以这显然是一个长期的尝试 专业Excel开发 Stephen Bullen描述了如何 注册UDF,它允许 要显示

在Excel2007中,如何向用户定义的函数添加说明和参数提示?当我开始为内置函数键入函数调用时,Excel会显示一个描述和参数列表——一个工具提示。我想对我定义的函数也这样做

不仅对于公式插入向导,而且在公式框中,因此如果我在
“=myFun(
)的
”(“
)处键入
”=average(

在VBA帮助中没有帮助,在MSDN上没有帮助,在我能找到的任何Excel和VBA专用论坛上也没有帮助,所以这显然是一个长期的尝试

专业Excel开发 Stephen Bullen描述了如何 注册UDF,它允许 要显示在函数中的说明 “参数”对话框:

函数IFERROR(ByRef-ToEvaluate为Variant,ByRef-Default为Variant)为Variant
如果IsError(ToEvaluate)那么
IFERROR=默认值
其他的
IFERROR=ToEvaluate
如果结束
端函数
副注册主任DF()
像线一样变暗
s=“为通用工作表构造提供快捷方式替换”&vbLf_
&“如果(ISERROR(),)”
Application.MacroOptions宏:=“IFERROR”,描述:=s,类别:=9
端接头
子未注册UDF()
Application.MacroOptions宏:=“IFERROR”,说明:=空,类别:=空
端接头
发件人:

要显示“函数参数”对话框,请键入函数名称并按CtrlA。或者,单击公式栏中的“fx”符号:


不幸的是,无法为UDF参数添加工具提示。
要扩展Remou的回复,您可以在
找到一种更全面但更复杂的函数向导描述方法

不是工具提示解决方案,而是适当的解决方法:

开始键入UDF
=MyUDF(
然后按CTRL+Shift+A,将显示您的函数参数。只要这些参数具有有意义的名称,您至少有一个可行的提示

例如,这:

=MyUDF(
+CTRL+Shift+A

变成这样:

=MyUDF(sPath,sFileName)

我只是创建了一个“帮助”版本的函数。在autocomplete中显示在函数的正下方-用户可以在相邻的单元格中选择它以获取说明

Public Function Foo(param1 as range, param2 as string) As String

    Foo = "Hello world"

End Function

Public Function Foo_Help() as String

Foo_Help = "The Foo function was designed to return the Foo value for a specified range a cells given a specified constant." & CHR(10) & "Parameters:" & CHR(10)
& "  param1 as Range   :   Specifies the range of cells the Foo function should operate on." & CHR(10)
&"  param2 as String  :   Specifies the constant the function should use to calculate Foo"
&" contact the Foo master at master@foo.com for more information."

END FUNCTION

使用wordwrap on可提高可读性。一石二鸟,现在该函数有了一些文档。

我尝试了@ScottK的方法,首先是作为我的功能性UDF的一个附加功能,然后是在遇到问题时作为一个独立的帮助后缀版本(见下文).事后看来,后一种方法无论如何都更好——对于足够专注的用户来说,它更容易看到工具提示,而且不会使功能代码变得混乱

我想如果一个粗心的用户只是在仔细考虑的时候键入函数名并合上括号,就会出现帮助,他就会马上过来。但是将一堆文本转储到一个我无法格式化的单元格中似乎不是一个好主意。相反,当函数输入到一个没有参数的单元格中时,例如

   = interpolateLinear() 
or
   = interpolateLinear_Help()
一个msgBox打开时会显示帮助文本。msgBox限制在1000个字符以内,可能是1024个字符。但对于我过于复杂的插值函数来说,这就足够了(仅8^/)。如果不是这样,您可以随时打开一个用户表单并进城

第一次打开消息框时,看起来很成功。但是有几个问题。当然,首先,用户必须知道在没有参数的情况下输入函数(+1表示_Help后缀UDF)

最大的问题是,msgBox在工作簿中不相关的部分工作时,会自动多次重新打开。不用说,这很烦人。有时它会一直持续到我收到循环引用警告。想想看。如果UDF可以更改单元格公式,我会这样做来关闭它

我不知道为什么Excel觉得需要反复计算公式;既不是独立的帮助,也不是完整版本(在帮助模式下)有先例或依赖项。任何地方都没有application.volatile语句。当然,函数会向调用单元格返回一个值。这可能会触发recalc?但UDF就是这么做的。我不认为你不能返回一个值

由于无法从UDF修改工作表公式,因此我尝试将特定字符串(值)返回给调用单元格(唯一可以从UDF更改值的单元格),我想我会在下一个周期中使用application.caller检查单元格值,发现我的字符串,并知道不要重新显示帮助消息。当时似乎是个好主意,但没有起作用。也许我在睡眠不足的状态下做了一些愚蠢的事。我仍然喜欢这个主意。我会在(如果)时更新它我解决了这个问题。我的快速解决方法是在“帮助”框中添加一行:“仅在紧急情况下寻求帮助。删除令人不快的公式以结束痛苦。”


与此同时,我尝试了Application.MacroOptions方法。非常简单,而且看起来很专业。只有一个问题需要解决。我稍后会发布一个关于该方法的单独答案。

围绕答案进行了大量讨论。您可以添加UDF上下文帮助,但您必须导出模块并在文本编辑器中编辑内容,然后重新编辑将其导入VBA。以下是Chip Pearson的示例:

我知道您已经接受了这个问题的答案,但现在有一个解决方案可以让您通过excel DNA加载项或在自己的加载项中注册intellisense服务器,像其他excel函数一样弹出intellisense样式的完成框

现在,我更喜欢C#方式——它要简单得多,因为在Excel DNA中,任何实现
IExcelAddin
的类都会被加载项框架拾取,并在打开/关闭加载项时运行
AutoOpen()
AutoClose()

名称空间MyNameSpace{
公共类智能感知:IExcelAddIn{
   = interpolateLinear() 
or
   = interpolateLinear_Help()
Private Sub RegisterMyFunction()
Application.MacroOptions _
    Macro:="SampleFunction", _      '' Your UDF name
    Description:="calculates a result based on provided inputs", _
    Category:="My UDF Category", _  '' Or use numbers, a list in the link below
    ArgumentDescriptions:=Array( _  '' One by each argument
        "is the first argument.  tell the user what it does", _
        "is the second argument.  tell the user what it does")
End Sub