对Excel自定义函数工具提示的追求
这个问题之前已经被问 过了 ,但是每次被接受的答案都只是使用Application.MacroOptions
( VBA6 )( VBA7 )来提供函数描述的辞职,但是这个信息实际上并没有作为工具提示出现,所以它不能解决我的问题。
目标
我们所希望的是能够以任何方式(VBA,VSTO或COM插件)定义自定义函数,并为用户提供对函数及其参数的popup/工具提示描述的好处,如对于每个内置的Excel函数,都可以内联或在编辑栏中显示:
被广泛接受的这个需求的答案是,它不可能定制function,但是我想挑战这个信念。
问题
目前,我见过的最好的方法是定义函数(通常使用上面的MacroOptions调用),以便在调用函数对话框(公式栏中的fxbutton)时,它们的函数和参数描述如下所示:
正如你所看到的,这是一个复杂的函数,有许多参数。 如果用户不知道这个“函数参数”对话框,以及如何使用它,而只是熟悉Excel的标准工具提示,他们将只能看到公式名称,并没有额外的帮助:
他们没有机会正确提供所需的参数。 (没有阅读文档,这当然是没有用户的。)
现在,高级用户可能知道,通过inputCtrl + Shift + A ,他们将被授予一个自动完成的函数参数列表,如下所示:
但是,当然,我们也遇到了同样的问题,那就是标准的excel用户只会使用第一张图片的默认行为,而且可能从来没有学过这个function。
这一点应该清楚,为什么这是不够的,我们希望每个内置的函数都有 – 内联的工具提示告诉用户如何使用函数。
戏弄
起初,我可能已经确信,除了原生的Excel应用程序function,这是不可能的。 加载项和VBA是可扩展性function,并且此工具提示可能根本无法扩展。 但是,这个理论受到分析工具包加载项存在的挑战。 当然,它是build立在微软的,但ANALYS32.xll是一个独立的XLL插件,就像那些可以在VB,C,C ++和C#中生成的插件一样。 果然,当XLL被加载到应用程序中时,它提供的函数具有与本机Excel函数相同的工具提示:
当然,如果这个信息以某种方式编码在XLL文件中,并传递给Excel,有一种方法可以用我们自己的插件复制它? 现在我正要开始自我反思,看看我是否可以对分析工具箱中正在进行的任何工作进行逆向工程。
你如何帮助
我几乎可以肯定,我已经研究了所有关于这个问题的公开信息。 如果有人知道我不知道这可能对此有帮助,请随时发一声。我对逆向工程编译的dll / xlls非常不熟悉,所以如果有人想popup打开Analysis32.xll的本地副本,弄清楚自定义函数定义是怎么回事,我会非常感激。 否则,我会继续深入研究这个问题,直到我把所有的问题都解决了,然后回报我find的东西。
我已经向GitHub发布了一个概念validation项目,作为Excel-DNA IntelliSense项目的实施。
使用UI自动化类来监视适当的Excel用户界面事件,适当时会显示一个表单。
代码被封装成一个Excel-DNA加载项,并在我的Excel 2013 / Windows 8机器上运行。 我已经testing了另外一个configuration(Windows Server 2008上的64位Excel 2010),并且遇到了严重的问题。
对于像这样的Excel-DNA属性定义的C#函数:
[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; }
我们得到了两个函数的描述
当selectfunction时,我们得到参数的帮助
这看起来不错,但它仍然非常片状,只能在我的机器上工作,有时会使Excel崩溃。 虽然这可能是一个开始
2014年5月9日更新:
我已经取得了一些进展,弄清楚如何使参数帮助在较旧的Excel和Windows版本下工作。 但是,要使一切可靠,仍然需要相当多的工作。 任何人想要帮助,请直接与我联系。
2016年6月18日更新:
Excel-DNA加载项和VBAfunction的Excel UDF IntelliSense支持现在正在testing中。 有关说明,请参阅GitHub上的入门页面。
怎么样
- 在单元的按键事件上捕捉input文字。 喜欢这个
- 检查文本是否与自定义函数匹配。
- 如果匹配,然后显示标签或形状的东西假装是一个工具提示。 喜欢这个
这可以接受吗?
这有点丑,但更容易。
什么是XLL?
XLL是导出由Excel或Excel加载项pipe理器调用的多个过程的DLL。 http://msdn.microsoft.com/en-us/library/office/bb687861.aspx
你如何开发XLL?
Excel XLL SDK与Visual C ++(或任何可以编译DLL并调用SDK过程的东西)
在哪里可以find创build简单XLL的快速指南?
我如何获得工具提示?
- 实现你的function作为一个过程,并将其导出
- 实现和导出过程xlAutoOpen(void) – http://msdn.microsoft.com/zh-cn/library/office/bb687860.aspx
- xlAutoOpen只需要调用xlfRegister – http://msdn.microsoft.com/en-us/library/office/bb687900.aspx
- 对于工具提示,请特别注意:
pxArgumentText, pxFunctionHelp, pxArgumentHelp1
可悲的是,分析工具包加载项也没有工具提示。
我的解决scheme是错误的,但由于原始海报张贴错误的信息。 用BINOMDIST显示图片,如果他的链接清楚地显示这不是ANALYS32.xll的function。
这意味着我试图解决一个不可能的问题。 因为没有XLL可以做海报所要求的。 如果您发现显示XLL的工具提示的Excel版本,请让我知道。
关于海报问题,试图模仿XLL的行为,我相信我的答案是什么ANALYS32.xll做的最正确的关系。