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

在Excel 2007中,如何将描述和参数提示添加到用户定义的函数中? 当我开始为内置函数input函数调用时,Excel会显示一个描述和参数列表 – 一个工具提示。 我想为我定义的function做同样的事情。

不只是公式插入向导,而是在公式框中,所以如果我键入“= myFun(”,在“(”工具提示popup,就像“= average(”

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

Stephen Bullen的专业Excel开发介绍了如何注册UDF,这允许描述出现在函数参数对话框中:

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”符号:

在这里输入图像描述

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

开始inputUDF =MyUDF(然后按CTRL + SHIFT + A ,你的函数参数将被显示。只要这些参数具有有意义的名称,至less有一个可行的提示

例如,这个:

=MyUDF( + CTRL + Shift + A

变成这样:

=MyUDF(sPath, sFileName)

我只是创build一个“帮助”版本的function。 在自动完成function下方显示 – 用户可以在相邻的单元格中select它来获取说明。

 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返回提高可读性。 一石二鸟,现在这个函数有一些文档。

我知道你已经接受了这个答案,但是现在有了一个解决scheme,可以让你像其他Excel函数一样通过Excel-DNA添加或者在你的内部注册一个intellisense服务器来popup一个intellisense样式完成框自己添加。 看到这里 。

现在,我更喜欢C#的方式 – 这是更简单的,因为在Excel-DNA内部,任何实现IExcelAddin类都被addin框架拾取,并且在打开/closuresadd时运行AutoOpen()AutoClose()所以你只需要这个:

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

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

 [ExcelFunction(Description = "A useful test function that adds two numbers, and returns the sum.")] public static double AddThem( [ExcelArgument(Name = "Augend", Description = "is the first number, to which will be added")] double v1, [ExcelArgument(Name = "Addend", Description = "is the second number that will be added")] double v2) { return v1 + v2; } 

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

在这里输入图像描述 在这里输入图像描述

还有一些使用VBA的例子,但是我不太注意到我的VBA,所以我不使用这些部分。

不幸的是,没有办法为UDF参数添加工具提示。
为了扩展Remou的回复,你可以find一个更完整但更复杂的方法来描述function向导
http://www.jkp-ads.com/Articles/RegisterUDF00.asp

围绕着答案跳舞很多。 您可以添加UDF上下文帮助,但必须导出模块并在文本编辑器中编辑内容,然后将其重新导入到VBA。 以下是来自Chip Pearson的示例: 添加代码属性

@会的方法是最好的。 只需添加几行关于人们以前没有使用ExcelDNA的细节就像我一样。

https://github.com/Excel-DNA/IntelliSense/releases下载Excel-DNA智能感知;

有两个版本,一个是64,检查你的Excel版本。 对于我的情况,我正在使用64版本。

打开Excel /开发/加载项/浏览并selectExcelDna.IntelliSense64.xll。

插入新的表格,将名称更改为“ IntelliSense ”,添加函数描述,如https://github.com/Excel-DNA/IntelliSense/wiki/Getting-Started

然后享受! 🙂

在这里输入图像描述

我试过@ ScottK的方法,首先作为我的functionUDF的一个侧面function,然后作为一个独立的_Help后缀版本,当我遇到麻烦(见下文)。 事后看来,后一种方法无论如何都是更好的 – 对于一个足够注意看到工具提示的用户来说更加明显,而且不会让function代码杂乱无章。

我想,如果一个不注意的用户只是键入了函数名,并且在他想完了的时候closures了括号,那么帮助就会出现,并且他会在路上。 但是将一堆文本转储到一个我无法格式化的单元格中似乎并不是一个好主意。 相反,当函数被input到没有参数的单元格中时

  = interpolateLinear() or = interpolateLinear_Help() 

msgBox随帮助文本打开。 一个msgBox被限制在1000个字符以内,也许是1024个。但是对于我过度的插入函数来说,这已经足够了(仅仅是8 ^ /)。 如果不是,你可以随时打开一个用户表,然后去镇上。

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

最大的问题是,msgBox连续几次重新打开,在工作簿的不相关部分工作时自发地重新打开。 不用说,这是非常烦人的。 有时会一直持续到我收到循环引用警告。 去搞清楚。 如果一个UDF可以改变单元格公式,我会这样做来closures它。

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

由于你不能从UDF修改工作表公式 ,所以我试着把一个特定的string – 一个值 –返回给调用单元格(唯一一个你可以从UDF中改变它的值),我想要检查在下一个循环中使用application.caller的单元格值,find我的string,并知道不要重新显示帮助消息。 当时看起来像一个好主意 – 没有工作。 也许我在睡眠不足的状态下做了一些愚蠢的事情。 我仍然喜欢这个主意。 当(如果)我解决问题时,我会更新这个。 我的快速解决方法是在帮助框中添加一行:“ 只在紧急情况下寻求帮助,删除违规公式以结束痛苦。

与此同时,我尝试了Application.MacroOptions方法。 很容易,而且看起来很专业。 只要解决一个问题。 稍后我会在这个方法上发表一个单独的答案。

您也可以使用这个macros将描述分配给参数和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 

学分肯德尔和原来的职位在这里 。 对于UDF类别