代码之家  ›  专栏  ›  技术社区  ›  Marc Thibault

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

  •  65
  • Marc Thibault  · 技术社区  · 14 年前

    在Excel2007中,如何向用户定义的函数添加说明和参数提示?当我开始为内置函数输入函数调用时,Excel会显示一个描述和参数列表——一个工具提示。我想对我定义的函数做同样的操作。

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

    在VBA帮助中没有帮助,在MSDN上也没有,在Excel和VBA专用论坛上也找不到,所以这显然是一个漫长的过程。

    9 回复  |  直到 6 年前
        1
  •  56
  •   Jean-François Corbett    10 年前

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

    要显示“函数参数”对话框,请键入函数名并按 Ctrl键 一个 . 或者,单击公式栏中的“fx”符号:

    enter image description here

        2
  •  90
  •   Jean-François Corbett    10 年前

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

    开始键入自定义项 =MyUDF( 然后按 控制 + 移位 + 一个 并显示您的功能参数。只要这些参数具有有意义的名称,至少有一个可行的提示

    例如,这:

    =MyUDF( + 控制 + 移位 + 一个

    变成这样:

    =MyUDF(sPath, sFileName)

        3
  •  8
  •   Aaron Hall    10 年前

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

    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的可读性。一石二鸟,现在函数有了一些文档。

        4
  •  8
  •   will    8 年前

    我知道你已经接受了这个问题的答案,但是现在有一个解决方案可以让你通过一个excel DNA插件,或者在你自己的插件中注册一个intellisense服务器,像其他excel函数一样弹出一个intellisense样式的完成框。 See here .

    现在,我更喜欢用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;
    }
    

    intellisense服务器使用ExcelDNA注释进行注释,它将获取参数名和描述。

    enter image description here enter image description here

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

        5
  •  2
  •   Charles Williams    14 年前

    不幸的是,没有办法为UDF参数添加工具提示。
    要扩展Remou的回复,您可以在
    http://www.jkp-ads.com/Articles/RegisterUDF00.asp

        6
  •  2
  •   Community CDub    7 年前

    很多人都在回答问题。可以添加UDF上下文帮助,但必须导出模块并在文本编辑器中编辑内容,然后将其重新导入VBA。以下是Chip Pearson的例子: Adding Code Attributes

        7
  •  2
  •   Rafa Barragan    8 年前

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

        8
  •  1
  •   Fisher    8 年前

    @威尔的方法是最好的。只需在细节上加上几行文字,就可以知道以前没有像我这样使用过ExcelDNA的人。

    从下载Excel DNA IntelliSense https://github.com/Excel-DNA/IntelliSense/releases

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

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

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

    那就尽情享受吧!:)

    enter image description here

        9
  •  0
  •   riderBill    9 年前

    我尝试了@ScottK的方法,首先是作为功能性UDF的一个附带功能,然后在遇到问题时作为一个独立的帮助后缀版本(见下文)。事后看来,后一种方法还是更好的——对一个足够专注的用户来说,更明显的是它可以看到一个工具提示,而且它不会扰乱功能代码。

    我想,如果一个不注意的用户只是键入函数名并在思考时关闭括号,就会出现帮助,他就会上路了。但是将一堆文本放入一个我无法格式化的单元格中似乎不是一个好主意。相反,当函数在没有参数的单元格中输入时,即。

       = interpolateLinear() 
    or
       = interpolateLinear_Help()
    

    将打开一个带有帮助文本的msgBox。一个msgBox限制为1000个字符,可能是1024个。但这对于我的过度复杂的插值函数来说已经足够了(仅仅8^/)。如果不是的话,你可以打开一个用户表单然后进城。

    消息框第一次打开时,看起来像是成功了。但有几个问题。当然,首先,用户必须知道输入的函数没有参数,(+1表示帮助后缀UDF)。

    这个 大的 问题是,msgBox在工作簿的不相关部分工作时会自动地连续重新打开几次。不用说,这是 非常 烦人的。有时它会一直持续到我收到一个循环引用警告。想想看。如果自定义项可以更改单元格公式,我会这样做来关闭它。

    我不知道为什么Excel觉得需要反复重新计算公式;无论是独立的帮助,还是完整版本(在帮助模式下)都没有先例或依赖项。没有 应用程序.volatile 任何地方的声明。当然,函数会返回一个值给调用单元格。也许这会触发重新计算?但UDF就是这么做的。我不认为你能 返回值。

    因为你不能修改工作表 公式 从UDF中,我试图返回一个特定的字符串-- 价值 --到调用单元格(唯一可以从UDF更改值的单元格),我将使用 应用程序.caller 在下一个循环中,找出我的字符串,并知道不要重新显示帮助消息。当时看来是个好主意——没用。也许我在睡眠不足的状态下做了些蠢事。我还是喜欢这个主意。如果我解决了这个问题,我会更新的。我的快速解决方法是在“帮助”框中添加一行:“ 只有在紧急情况下才寻求帮助。删除冒犯的公式来结束痛苦。

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

    推荐文章