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

时间:2010-11-24 00:24:08

标签: excel vba excel-vba

在Excel 2007中,如何向用户定义的函数添加描述和参数提示?当我开始为内置函数键入函数调用时,Excel会显示描述和参数列表 - 工具提示。我想对我定义的函数做同样的事情。

不仅仅是公式插入向导,而是在公式框中,所以如果我键"=myFun(",则在"("弹出工具提示,就像它对"=average("

在VBA帮助中没有任何帮助,在MSDN上没有任何帮助,在我能找到的任何Excel和VBA专用论坛上都没有帮助,所以这显然是一个很长的镜头。

9 个答案:

答案 0 :(得分:86)

不是工具提示解决方案,而是一个充分的解决方法:

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

例如,这个:

=MyUDF( + CTRL + Shift + A

变成这样:

=MyUDF(sPath, sFileName)

答案 1 :(得分:53)

  

专业Excel开发   斯蒂芬布伦描述了如何   注册UDF,允许a   描述出现在函数中   参数对话框:

Function IFERROR(ByRef ToEvaluate As Variant, ByRef Default As Variant) As Variant
    If IsError(ToEvaluate) Then
        IFERROR = Default
    Else
        IFERROR = ToEvaluate
    End If
End Function

Sub RegisterUDF()
    Dim s As String
    s = "Provides a shortcut replacement for the common worksheet construct" & vbLf _
    & "IF(ISERROR(<expression>, <default>, <expression>)"

    Application.MacroOptions macro:="IFERROR", Description:=s, Category:=9
End Sub

Sub UnregisterUDF()
    Application.MacroOptions Macro:="IFERROR", Description:=Empty, Category:=Empty
End Sub

来自:http://www.ozgrid.com/forum/showthread.php?t=78123&page=1

要显示“功能参数”对话框,请键入功能名称,然后按 Ctrl A 。或者,单击公式栏中的“fx”符号:

enter image description here

答案 2 :(得分:8)

我只是创建一个&#34; help&#34;该功能的版本。在自动完成功能的正下方显示 - 用户可以在相邻的单元格中选择它以获取说明。

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的可读性。一石二鸟,现在功能有一些文件。

答案 3 :(得分:8)

我知道你已经接受了这方面的答案,但是现在有一个解决方案可以让你通过Excel-DNA加入弹出类似于其他excel功能的智能感知风格完成框,或者在你自己的添加中注册一个智能感知服务器。See here

现在,我更喜欢C#的方式 - 它更简单,因为在Excel-DNA中,任何实现IExcelAddin的类都被addin框架拾取并且{{1}当你打开/关闭添加时,会运行AutoOpen()。所以你只需要这个:

AutoClose()

然后(这只是从github页面中获取),您只需要在函数上使用ExcelDNA注释:

namespace MyNameSpace {
    public class Intellisense : IExcelAddIn {
        public void AutoClose() {
        }
        public void AutoOpen() {
            IntelliSenseServer.Register();
        }
    }
}

使用ExcelDNA注释进行注释,智能感知服务器将获取参数名称和描述。

enter image description here enter image description here

有一些例子可以将它与VBA一起使用,但我不太喜欢我的VBA,所以我不会使用这些部分。

答案 4 :(得分:2)

遗憾的是,无法为UDF参数添加工具提示 为了扩展Remou的回复,你可以找到一个更全面但更复杂的方法来描述功能向导 http://www.jkp-ads.com/Articles/RegisterUDF00.asp

答案 5 :(得分:2)

A lot of dancing around the answer. You can add the UDF context help, but you have to export the Module and edit the contents in a text editor, then re-import it to VBA. Here's the example from Chip Pearson: Adding Code Attributes

答案 6 :(得分:2)

此外,您可以使用此宏为参数和UDF分配描述:

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

Kendall和原始帖子here。 对于UDF Categories

答案 7 :(得分:1)

@ will的方法是最好的。只是添加一些关于细节的细节,以便像我这样的人不使用ExcelDNA。

https://github.com/Excel-DNA/IntelliSense/releases

下载Excel-DNA IntelliSense

有两个版本,一个是64版,请检查您的Excel版本。就我而言,我使用的是64版本。

打开Excel / Developer / Add-Ins / Browse并选择ExcelDna.IntelliSense64.xll。

插入新工作表,将名称更改为“ IntelliSense ”,添加功能说明,如https://github.com/Excel-DNA/IntelliSense/wiki/Getting-Started

然后享受! :)

enter image description here

答案 8 :(得分:0)

我尝试了@ ScottK的方法,首先作为我的功能UDF的一个侧面功能,然后当我遇到麻烦时作为独立的_Help后缀版本(见下文)。事后看来,后一种方法无论如何都更好 - 对于注意到工具提示的用户来说更明显,并且它不会使功能代码混乱。

我想,如果一个不专心的用户只是输入了函数名称,并在他认为结束时关闭了括号,那么就会出现帮助,他会在路上。但是将一堆文本转储到我无法格式化的单个单元格中似乎不是一个好主意。相反,当在没有参数的单元格中输入函数时,即

   = interpolateLinear() 
or
   = interpolateLinear_Help()

使用帮助文本打开msgBox。 msgBox限制为~1000个字符,也许是1024个。但是这对于我过度插入的插值函数来说已经足够(仅仅8 ^ /)。如果不是,您可以随时打开用户表单并前往城镇。

第一次打开消息框,看起来就像成功一样。但是有一些问题。首先,用户必须知道输入没有参数的函数(_Help后缀UDF为+1)。

问题是,msgBox在工作簿的不相关部分工作时会连续多次重新打开。不用说,它非常很烦人。有时它会持续到我收到循环参考警告。去搞清楚。如果UDF可以改变单元格公式,我会这样做来关闭它。

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

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

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