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

How to put a tooltip on a user-defined function

提问人:Marc Thibault 提问时间:11/24/2010 最后编辑:vba_user111Marc Thibault 更新时间:5/29/2020 访问量:151218

问:

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

不仅用于公式插入向导,而且在公式框中,因此,如果我键入 ,在工具提示处会弹出,就像它所做的那样"=myFun(""(""=average("

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

Excel VBA

评论

0赞 Dr. belisarius 11/24/2010
不是工具提示......但是什么......xcell05.free.fr/english/index.html呵呵!
0赞 Marc Thibault 12/2/2010
谢谢 b。它看起来有点可怕,但如果它有效,那就是一个解决方案。
0赞 Govert 11/28/2016
现在,具有 Excel-DNA IntelliSense 扩展的 VBA 和其他类型的加载项(.NET、Python 等)支持此功能:excel-dna.net/2016/11/24/...
0赞 ye-olde-dev 4/5/2017
我通常会向我的用户提供指令,让他们键入 =myfunction(“help”) 来获取语法帮助,然后只需放置一个 if 语句即可返回智能感知。好奇地想知道 Govert 的方法是否也有效。

答:

67赞 Fionnuala 11/24/2010 #1

专业 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

enter image description here

评论

0赞 Wilhelm 11/8/2011
该方法中的新参数允许对函数参数进行描述。
0赞 Black 11/10/2016
我还是不明白,你能把它说得更简单一点吗?IFERROR 是显示描述的原始函数,还是注册 UDF 所需的帮助函数?!
1赞 Felício 5/25/2018
几年后,IFERROR 是原始函数。(联合国)RegisterUFD 是 (取消) 应用帮助文本的帮助程序。
1赞 Apsis0215 10/1/2022
2022 年仍然有效!微软有多个“Category:=14”来强制 then 函数的类型注册:: 整数类别 1 金融 2 日期和时间 3 数学和三角函数 4 统计 5 查找和参考 6 数据库 7 文本 8 逻辑 9 信息 10 命令 11 自定义 12 宏控制 13 DDE/外部 14 用户定义 15 第一个自定义类别 ...32 第十八个定制类别 learn.microsoft.com/en-us/office/vba/api/...
2赞 Charles Williams 11/24/2010 #2

不幸的是,无法为 UDF 参数添加工具提示。
为了扩展 Remou 的回复,您可以在 http://www.jkp-ads.com/Articles/RegisterUDF00.asp 找到更完整但更复杂的函数向导
描述方法

评论

0赞 Wilhelm 11/8/2011
由于 Office 2010 参数可以通过此答案进行注释。
0赞 Charles Williams 11/8/2011
@Wilhelm,这是正确的,但即使在 XL 2010 中仍然不提供工具提示
116赞 AutomationMan 1/23/2013 #3

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

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

例如,这个:

=MyUDF( + CTRL + Shift + A

变成这样:

=MyUDF(sPath, sFileName)

评论

4赞 hypers 10/24/2017
尽管人们怀疑它有助于 OP,但这是线程中投票最多的输入(包括我的投票)。这证明 SO 不是为了帮助特定的 OP,而是为了帮助整个社区。谢谢。
0赞 Joël 4/9/2021
内置功能 <3 -- 当您的公司对软件扩展下载/安装应用严格的策略时,这非常有帮助。此外,这迫使开发人员提供有用的参数 names -> +1
8赞 Scott K 11/6/2014 #4

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

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

回车符提高了换行的可读性。一石二鸟,现在该函数有一些文档。

评论

2赞 Marcus Mangelsdorf 11/12/2015
我喜欢这种方法,因为它避免了如果你想为你的 UDF 提供真正的类似 Excel 的工具提示,你必须做的所有疯狂的事情。
0赞 riderBill 12/8/2015
这似乎是个好主意。如果用户注意,他们将看到带有 _Help 后缀的备用 UDF。我自己试过了。不过,它并不愉快。它会经历重新计算周期,有时直到我收到循环引用警告。不知道这是怎么回事。没有先例,只是将一个空字符串返回给单元格。在有人问之前,我的 UDF 中没有 application.volatile(true 或 false)。
1赞 riderBill 12/8/2015 #5

我尝试了 @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 方法。很简单,而且看起来很专业。只有一个问题要解决。我稍后会发布关于这种方法的单独答案。

1赞 RexBarker 4/15/2016 #6

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

18赞 will 10/12/2016 #7

我知道您已经接受了这个问题的答案,但现在有一个解决方案可以让您通过 Excel-DNA 插件或通过在您自己的插件中注册智能感知服务器来获得一个智能感知样式的完成框弹出,就像其他 excel 函数一样。请看这里

现在,我更喜欢 C# 的方式 - 它要简单得多,因为在 Excel-DNA 中,任何实现的类都会件框架选取,并在您打开/关闭插件时运行。所以你只需要这个:IExcelAddinAutoOpen()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 注释进行批注,智能感知服务器将获取参数名称和说明。

enter image description here enter image description here

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

评论

3赞 Govert 11/28/2016
这里有一篇关于如何将 Excel-DNA IntelliSense 扩展与 VBA 一起使用的文章:fastexcel.wordpress.com/2016/10/07/...
6赞 Fisher 12/15/2016 #8

@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

9赞 Rafa Barragan 7/7/2017 #9

此外,您还可以使用此宏将 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 类别

评论

0赞 chingNotCHing 1/8/2020
我把它放在 Workbook_Open() 中,它必须是 Public。在 Excel 2013 中工作。非常好!