寻找Excel自定义函数工具提示的方法

107
这个问题已经被提出 之前, 但每次被接受的答案都只是简单地辞职,使用Application.MacroOptions (VBA6) (VBA7) 提供函数描述,但是这些信息实际上不会出现在工具提示中,因此不能解决我的问题。 目标 我们所有人都希望能够通过任何方式(VBA、VSTO 或 COM 加载项)定义自定义函数,并为用户提供函数及其参数的弹出/工具提示描述,就像内置的 Excel 函数一样,可以在行内或公式栏中显示:

enter image description here

enter image description here

这个需求的普遍答案是自定义函数不可能实现,但我希望挑战这种看法。
问题:
目前,我见过的最好的方法是定义函数(通常使用上面的MacroOptions调用),这样在打开函数对话框时(公式栏中的fx按钮),它们的函数和参数描述显示如下:

enter image description here

正如您所看到的,这是一个具有许多参数的复杂函数。如果用户不了解“函数参数”对话框以及如何调出它,并且只熟悉Excel的标准工具提示,则他们只能看到公式名称而没有其他帮助:

enter image description here

他们无法正确提供所需的参数(当然,没有用户会去阅读文档)。现在,高级用户可能知道通过键入Ctrl + Shift + A,可以获得自动完成的函数参数列表,如下所示:

enter image description here

当然,我们面临的问题与上述相同,即标准的Excel用户只会使用第一张图片中的默认行为,并且可能永远不会学习该功能。
到这个地步应该很清楚了,这还不够,我们想要每个内置函数都有的 - 内联工具提示,告诉用户如何使用该函数。
起初,我可能会相信除了原生Excel应用程序函数外,这根本不可能实现。插件和VBA是可扩展性特性,而此工具提示可能无法扩展。但是,分析工具包插件的存在挑战了这一理论。当然,它是由Microsoft构建的,但是ANALYS32.xll是一个独立的XLL插件,就像可以在VB、C、C++和C#中生成的插件一样。果然,当这个XLL加载到应用程序中时,它提供的functions具有与本机Excel函数相同的工具提示:

enter image description here

如果这些信息以某种方式编码在XLL文件中并传递给Excel,那么我们自己的Add-ins也可以复制它们吗?我现在已经到了开始自学一些反编译的地步,看看能否反向工程分析工具包中正在进行的操作。
如何帮助:
我几乎可以确定我已经研究了所有公开可用的有关此问题的信息。如果有人知道我不知道的可能有助于解决此问题的内容,请随时发表意见。我对反向工程编译的dll / xll非常陌生,因此如果有人感觉像打开他们本地的Analysis32.xll并找出其自定义函数定义的内容,我将不胜感激。否则,我将继续自己挖掘,直到遇到所有死路并回报我的发现。

4
目前在Excel的任何版本中,都无法使用可用技术创建或显示自定义函数(UDF)参数的工具提示。 - silkfire
5
听起来很有趣,但我以前(使用 office 97)已经用 winapi 制作过工具提示。通过这种方式,你也可以做到。如果你感兴趣,我可以找出相关信息并尝试为此提供答案。 - Archlight
1
我会给你拿到它,但需要一些时间来挖掘。但是应该可以在这里供其他人使用。它是winapi/vba的低端邪恶组合,我认为我将其制作为vb.dll,但将其提升到.net也不成问题。 - Archlight
在我尝试接受挑战之前,只有一个问题。这个程序应该在哪个版本的Excel上运行?是98、2k+、2k2+、2k7+还是其他版本?虽然我不确定这是否会有很大的区别,但了解目标系统肯定更好。 - winner_joiner
1
显然,Excel开发团队正在此处收集有关此功能的投票:https://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/10198185-intellisense-for-user-defined-functions - Alain
显示剩余8条评论
3个回答

44

我已经在GitHub上发布了一个概念验证项目,名为Excel-DNA IntelliSense项目,用于实现这个功能。

使用UI Automation类来监控适当的Excel用户界面事件,当需要时显示一个窗体。

该代码被包装成一个Excel-DNA插件,并在我的Excel 2013 / Windows 8机器上运行良好。我已经在另一个配置上进行了测试(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;
}

我们获得了函数描述。

Function Description

当选择函数时,我们会得到参数帮助。

Argument Help

看起来不错,但还存在很多问题,只能在我的电脑上运行,并且有时会导致 Excel 崩溃。不过这可能是一个开始...


2014年5月9日更新:

我已经取得了一些进展,正在努力让旧版本的Excel和Windows下的参数帮助功能正常工作。但是,仍需要大量的工作来确保可靠性。任何想要帮忙的人都可以直接联系我。


更新于2016年6月18日:

现在正在测试Excel UDF IntelliSense支持Excel-DNA插件和VBA函数。请参阅GitHub上的入门页面以获取说明。


1
与 Excel 对象模型的引用并不真正涉及其中。但是肯定有不同的 UI 自动化版本可能会影响事情... - Govert
1
这比目前任何东西都要先进,所以你得到了我的赞成票。我打算在不久的将来看看是否能为这个解决方案做出贡献,所以请留意我的拉取请求! - Alain
1
@M-- 你可以在这里看一下:https://github.com/Excel-DNA/IntelliSense/wiki/Usage-Instructions#intellisense-descriptions-worksheet-in-an-open-workbook - undefined
好的,太棒了 - 谢谢你确认你能够让它工作。 - undefined
@M 很高兴你搞定了。你用VSTO部分做什么? - undefined
显示剩余9条评论

2

你觉得怎么样?

  1. 在单元格的按键事件中捕获输入文本。像这样
  2. 检查文本是否与自定义函数匹配。
  3. 如果匹配,则显示类似标签或形状的东西来模拟工具提示。 像这样

这个方案可行吗?

虽然有点丑,但更容易实现。


这是一个我考虑过的有趣起点,但当遇到更高级的公式编辑形式时(例如在中间某处单击并删除/添加字符,或突出显示并覆盖公式的一部分,或在其他公式中间使用自定义公式),就会遇到复杂情况。这需要不仅检查按键,还需要在编辑过程中查看公式栏或单元格的当前内容。这也可以通过导入一些dll库并进行处理来完成。值得探索。 - Alain

-1

XLL是什么?

XLL是一种DLL,它导出了几个由Excel或Excel插件管理器调用的过程。 http://msdn.microsoft.com/en-us/library/office/bb687861.aspx

如何开发XLL?

使用Visual C++的Excel XLL SDK(或任何可以编译DLL并调用SDK过程的工具)

我在哪里可以找到创建简单XLL的快速指南?

http://support.microsoft.com/kb/178474

如何获取工具提示?

  1. 将您的函数实现为过程并导出它
  2. 实现并导出过程xlAutoOpen(void) - http://msdn.microsoft.com/en-us/library/office/bb687860.aspx
  3. xlAutoOpen只需要调用xlfRegister - http://msdn.microsoft.com/en-us/library/office/bb687900.aspx
  4. 对于工具提示,需要特别注意:pxArgumentText、pxFunctionHelp、pxArgumentHelp1

不幸的是,分析工具包插件也没有工具提示。

我的解决方案是错误的,但原始帖子发布的信息也是错误的。如果他的链接清楚地显示这不是ANALYS32.xll的函数,则显示BINOMDIST的图片。

这意味着我试图解决一个不可能的问题。 因为没有XLL可以做到海报请求的事情。 如果您找到了一个显示XLL工具提示的Excel版本,请告诉我。

关于海报所要求的模拟XLL行为,我确定我的答案是最正确的,与ANALYS32.xll的功能相关。


3
遗憾的是,使用xlfRegister注册UDF并不会导致Excel将该信息显示为工作表内的智能提示。在那里注册的描述等只会在“函数参数”对话框中显示,当您按下fx按钮时弹出。但这不是原帖作者所询问的内容。 - Govert
@Govert,现在2016年还是这样吗? - beppe9000
@beppe9000 是的。您可以使用Excel-DNA IntelliSense扩展程序获取UDF(在XLL或VBA中定义)的工作表内智能提示:https://github.com/Excel-DNA/IntelliSense - Govert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接