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


78

在Excel 2007中,如何向用户定义的函数添加描述和参数提示?当我开始为内置函数键入函数调用时,Excel会显示说明和参数列表-工具提示。我想对定义的功能执行相同的操作。

不只是用于公式插入向导,还包括在公式框中,因此,如果我键入"=myFun(",则会"("在工具提示处弹出,就像对于"=average("

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


不是工具提示...而是什么... xcell05.free.fr/english/index.html HTH!
belisarius博士10年

谢谢b。看起来有些吓人,但是如果可行,这是一个解决方案。
马克·蒂博

现在,VBA和具有Excel-DNA IntelliSense扩展名的其他类型的加载项(.NET,Python等)均支持此功能:excel-dna.net/2016/11/24/…–
Govert

我通常会向用户提供指令,以键入= myfunction(“ help”)以获得语法帮助,并仅放置一条if语句以返回智能感知。好奇地看看Govert的方法是否也可行。
Clouse24年

Answers:


59

Stephen Bullen的Professional Excel Development介绍了如何注册UDF,该描述允许在Function Arguments对话框中显示说明:

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

要显示“函数参数”对话框,请输入函数名称,然后按CtrlA。或者,单击编辑栏中的“ fx”符号:

在此处输入图片说明


方法中的新参数允许描述功能参数。
威廉

我还是不明白,您能使它更简单吗?IFERROR是显示说明的原始功能,还是注册UDF所需的辅助功能?
黑色

1
几年后,IFERROR是原始功能。(un)RegisterUFD是将(未)应用帮助文本的助手。
费利西奥

96

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

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

例如,这:

=MyUDF(+ CTRL+ Shift+A

变成这样:

=MyUDF(sPath, sFileName)


4
尽管有人怀疑它对OP有所帮助,但这是该主题中最受支持的输入(包括我的投票)。这证明了SO并不是在帮助特定的OP,而是在总体上帮助社区。谢谢。
hypers

12

我知道您已经接受了有关此问题的答案,但是现在有了一个解决方案,通过Excel-DNA插入或通过在您的内部注册一个智能感知服务器,您可以像其他Excel功能一样弹出一个智能感知样式完成框。自己添加。请参见此处

现在,我更喜欢采用C#的方式-更加简单,因为在Excel-DNA内部,任何实现的类IExcelAddin都由addin框架拾取,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,因此我不使用那些部分。


1
这里有关于如何在VBA中使用Excel-DNA IntelliSense扩展的文章:fastexcel.wordpress.com/2016/10/07/…–
Govert

8

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

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

回车时自动换行可提高可读性。2鸟一石,现在该功能已有部分文档。


2
我喜欢这种方法,因为它避免了您想要UDF真正的类似于Excel的工具提示时要做的所有疯狂的事情。
Marcus Mangelsdorf 2015年

这似乎是个好主意。如果用户注意,他们将看到带有_Help后缀的备用UDF。我自己尝试过。不过,玩得不好。它会经历重新计算周期,有时直到收到循环参考警告为止。不知道那是什么。没有先例,只向单元格返回一个空字符串。在有人问之前,我的UDF中没有application.volatile(正确或错误)。
riderBill 2015年

6

您也可以使用此宏为参数和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类别


我已经将它放在Workbook_Open()中,它需要是Public。在Excel 2013中可以在这里工作。太好了!
chingNotCHing

5

@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

那就享受吧!:)

在此处输入图片说明



1

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


0

我尝试了@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方法。非常简单,而且看起来很专业。解决一个问题。稍后,我将针对该方法发布单独的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.