提问人:Marc Thibault 提问时间:11/24/2010 最后编辑:vba_user111Marc Thibault 更新时间:5/29/2020 访问量:151218
如何在用户定义的函数上放置工具提示
How to put a tooltip on a user-defined function
问:
在 Excel 2007 中,如何向用户定义的函数添加说明和参数提示?当我开始为内置函数键入函数调用时,Excel 会显示说明和参数列表 - 工具提示。我想对我定义的函数做同样的事情。
不仅用于公式插入向导,而且在公式框中,因此,如果我键入 ,在工具提示处会弹出,就像它所做的那样"=myFun("
"("
"=average("
VBA 帮助中没有帮助,MSDN 上没有帮助,我能找到的任何 Excel 和 VBA 专用论坛上都没有帮助,所以这显然是一个很长的机会。
答:
专业 Excel 开发者 Stephen Bullen 介绍了如何 寄存器 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
要显示“函数参数”对话框,请键入函数名称并按 。或者,单击编辑栏中的“fx”符号:CtrlA
评论
不幸的是,无法为 UDF 参数添加工具提示。
为了扩展 Remou 的回复,您可以在 http://www.jkp-ads.com/Articles/RegisterUDF00.asp 找到更完整但更复杂的函数向导
描述方法
评论
不是工具提示解决方案,而是适当的解决方法:
开始输入 UDF,然后按 + +,将显示您的函数参数。只要这些参数具有有意义的名称,您至少会有一个可行的提示=MyUDF(
CTRLShiftA
例如,这个:
=MyUDF(
+ CTRL + Shift + A
变成这样:
=MyUDF(sPath, sFileName)
评论
我只是创建了该函数的“帮助”版本。在自动完成功能的正下方显示 - 用户可以在相邻的单元格中选择它以获取说明。
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 [email protected] for more information."
END FUNCTION
回车符提高了换行的可读性。一石二鸟,现在该函数有一些文档。
评论
我尝试了 @ScottK 的方法,首先是作为我的函数式 UDF 的附带功能,然后在遇到麻烦时作为独立的_Help后缀版本(见下文)。事后看来,后一种方法无论如何都更好——对于足够细心的用户来说,看到工具提示更明显,而且它不会弄乱功能代码。
我想,如果一个不专心的用户只是在思考时输入函数名称并关闭括号,就会出现帮助,他就会上路。但是将一堆文本转储到我无法格式化的单个单元格中似乎不是一个好主意。相反,当函数输入到没有参数的单元格中时,即
= interpolateLinear()
or
= interpolateLinear_Help()
将打开一个 msgBox,其中包含帮助文本。msgBox 限制为 ~1000 个字符,可能是 1024 个字符。但这已经足够了(勉强 8^/)对于我过度欺骗的插值函数。如果不是,您可以随时打开用户表单并进城。
第一次打开消息框时,它看起来像是成功了。但是有几个问题。首先,用户必须知道输入没有参数的函数(_Help后缀 UDF 为 +1)。
最大的问题是,msgBox 在工作簿的不相关部分工作时会自发地重新打开几次。不用说,这很烦人。有时它会一直持续到我收到循环引用警告。去想想。如果 UDF 可以更改单元格公式,我会这样做以关闭它。
我不知道为什么 Excel 觉得需要一遍又一遍地重新计算公式;独立_Help和完整版本(在帮助模式下)都没有先例或依赖项。任何地方都没有 application.volatile 语句。当然,该函数会向调用单元格返回一个值。也许这会触发重新计算?但这就是 UDF 的作用。我不认为你不能返回一个值。
由于您无法从 UDF 修改工作表公式,因此我尝试将一个特定的字符串 - 一个值 -- 返回给调用单元格(您唯一可以从 UDF 更改其值的字符串),认为我会在下一个周期中使用 application.caller 检查单元格值,发现我的字符串,并且知道不要重新显示帮助消息。当时似乎是个好主意——没有奏效。也许我在睡眠不足的状态下做了一些愚蠢的事情。我仍然喜欢这个主意。当我(如果)解决问题时,我会更新它。我的快速解决方法是在帮助框上添加一行:“仅在紧急情况下寻求帮助。删除有问题的公式以结束痛苦。
同时,我尝试了 Application.MacroOptions 方法。很简单,而且看起来很专业。只有一个问题要解决。我稍后会发布关于这种方法的单独答案。
很多人围绕着答案跳舞。您可以添加 UDF 上下文帮助,但必须导出模块并在文本编辑器中编辑内容,然后将其重新导入 VBA。下面是 Chip Pearson 的示例:添加代码属性
我知道您已经接受了这个问题的答案,但现在有一个解决方案可以让您通过 Excel-DNA 插件或通过在您自己的插件中注册智能感知服务器来获得一个智能感知样式的完成框弹出,就像其他 excel 函数一样。请看这里。
现在,我更喜欢 C# 的方式 - 它要简单得多,因为在 Excel-DNA 中,任何实现的类都会件框架选取,并在您打开/关闭插件时运行。所以你只需要这个:IExcelAddin
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,所以我不使用这些部分。
评论
@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
那就尽情享受吧!:)
此外,您还可以使用此宏将 Descriptions 分配给参数和 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 和此处的原始帖子。 对于 UDF 类别
评论