搜寻Excel自订功能工具提示


100

这个问题以前曾被 ,但是每次接受的答案都只是一个辞职,使用Application.MacroOptionsVBA6)(VBA7)提供功能描述,但是该信息实际上并没有作为工具提示出现,因此不能解决我的问题。

目标

我们所有人都希望能够通过任何方式(VBA,VSTO或COM加载项)定义自定义功能,并为用户提供功能及其参数的弹出式/工具提示说明的好处,例如对于每个内置Excel函数,无论是嵌入式还是在编辑栏中都会出现:

在此处输入图片说明

在此处输入图片说明

对此需求的广泛接受的答案是自定义功能是不可能的,但是我想挑战这一信念。

问题

当前,我所见过的最好的人是定义函数(通常使用上面的MacroOptions调用),以便在打开函数对话框(在公式栏中的fx按钮)时,它们的功能和参数说明如下所示:

在此处输入图片说明

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

在此处输入图片说明

他们没有机会正确地提供所需的参数。(不阅读文档,当然,没有用户会这样做。)

现在,高级用户可能知道通过键入Ctrl+ Shift+ A,他们将被授予自动完成的功能参数列表,如下所示:

在此处输入图片说明

但是,当然,我们有与上述相同的问题,那就是标准excel用户将只习惯于第一张图片的默认行为,并且可能永远不会学习该功能。

到这一点应该很清楚为什么还不够,我们希望每个内置函数都有什么-内联工具提示,告诉用户如何使用该函数。

戏弄

起初,我可能已经确信,除了本机Excel应用程序功能之外,这根本是不可能的。加载项和VBA是可扩展性功能,此工具提示可能根本无法扩展。但是该理论受到Analysis Toolpak加载项的存在的挑战。当然,它是Microsoft内置的,但是ANALYS32.xll是一个独立的XLL加载项,就像可以在VB,C,C ++和C#中生成的加载项一样。当然,当将此XLL加载到应用程序中时,它提供的功能具有与本机excel函数相同的工具提示:

在此处输入图片说明

当然,如果此信息以某种方式编码在此XLL文件中并传递给Excel,是否可以通过我们自己的加载项复制它?我现在要开始对反编译进行一些自我介绍,并看看我是否可以对分析工具库中发生的一切进行逆向工程。

您将如何提供帮助

我几乎可以肯定,我已经研究了所有有关此问题的公开信息。如果有人知道我不知道的事情可能会有所帮助,请随意输入。我对反向工程编译的dll / xlls非常不熟悉,因此,如果有人想弹出打开他们的Analysis32.xll和弄清楚它的自定义函数定义是怎么回事,我不得不承担。否则,我会一直自己研究这个问题,直到碰到所有死胡同,并汇报发现的问题。


4
使用任何可用技术,都无法在当前Excel版本中为UDF参数创建或显示工具提示。来源由MVP:answers.microsoft.com/en-us/office/forum/office_2007-customize/...
silkfire

.NET Reflector无法打开ANALYS32.xll,认为它不是.NET程序集。这让我感到惊讶。看起来我将不得不尝试将其反编译为汇编语言?
Alain

5
听起来很有趣,但是我过去(办公室97)曾使用winapi进行过工具提示。这样您就可以做到。如果那很有趣,我可以挖掘信息并尝试从中获取答案。
Archlight 2013年

1
我也会得到您的帮助,这将需要一些时间来进行深入研究。但是它应该在这里起来供其他人使用。Winapi / vba /的低级和恶意组合,我认为我将其作为vb.dll进行了升级,但没有任何机会将其提升到.net
Archlight 2013年

1
显然,Excel开发团队正在为此功能投票:excel.uservoice.com/forums/…–
Alain

Answers:


40

我已经将概念验证项目作为Excel-DNA IntelliSense项目发布到了GitHub ,并实现了该项目。

使用UI自动化类监视适当的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;
}

我们都获得了功能描述

功能说明

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

参数帮助

看起来不错,但一切仍然很不稳定,只能在我的机器上使用,有时会使Excel崩溃。不过,这可能是一个开始。


2014年5月9日更新:

我在弄清楚如何使参数帮助在较早的Excel和Windows版本下工作方面取得了一些进展。但是,它仍然需要大量工作才能使所有内容可靠。任何想要帮助的人请直接与我联系。


2016年6月18日更新:

现在正在测试对Excel-DNA加载项和VBA功能的Excel UDF IntelliSense支持。有关说明,请参见GitHub上的“ 入门”页面。


可悲的是,似乎自变量help使用的UI Automation TextRange支持似乎需要Excel 2013或Windows 8或两者。我很想听听任何具有Windows UI自动化经验的人...
Govert

在编译到旧计算机之前,您是否尝试过引用旧的Excel程序集?
DanielMöller2013年

1
对Excel对象模型的引用实际上并没有涉及。但是肯定会有不同的UI自动化版本可能会影响事物……
Govert

1
到目前为止,这是比任何地方都领先的街道,所以您得到我的赏金投票。我打算看看我是否可以在不久的将来为该解决方案做出贡献,所以请随时注意我的请求!
阿兰(Alain)

@Alain Govert好工作!&Alain,我很高兴见到您精通这一点。
CodeCamper

1

怎么样

  1. 捕获单元格按键事件中的输入文本。像这样
  2. 检查文本是否与自定义功能匹配。
  3. 如果匹配,则显示诸如标签或形状之类的内容作为工具提示。像这样

这可以接受吗?

这有点难看,但更容易。


我认为这是一个有趣的起点,但是在遇到更高级的公式编辑形式时(例如,单击中间的某个位置并删除/添加字符,或者突出显示和覆盖公式的一部分,或者使用(这需要在其他一些公式的中间添加一个自定义公式。)这些操作不仅仅需要检查按键,我们还需要查看中间编辑中公式栏或单元格的当前内容。这也可以通过一些导入的dll库来完成,并处理受到黑客攻击的问题。当然值得探索。
2013年

-1

什么是XLL?

XLL是一个DLL,可导出Excel或Excel加载项管理器调用的多个过程。http://msdn.microsoft.com/zh-CN/library/office/bb687861.aspx

您如何开发XLL?

具有Visual C ++(或任何可编译DLL并调用SDK过程的东西)的Excel XLL SDK

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

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

我如何获得工具提示?

  1. 将您的功能实现为过程并将其导出
  2. 实施和导出过程xlAutoOpen(void)-http: //msdn.microsoft.com/zh-cn/library/office/bb687860.aspx
  3. xlAutoOpen只需要调用xlfRegister- http://msdn.microsoft.com/zh-cn/library/office/bb687900.aspx
  4. 有关工具提示,请特别注意: pxArgumentText, pxFunctionHelp, pxArgumentHelp1

可悲的是,Analysis Toolpak加载项也没有工具提示。

我的解决方案是错误的,但是原始海报张贴了错误的信息。与BINOMDIST显示图片,如果他的链接)清楚地表明这不是ANALYS32.xll的功能。

这意味着我正在尝试解决一个不可能的问题。因为没有XLL可以完成发布者要求的操作。如果您发现显示XLL工具提示的Excel版本,请通知我。

关于发布者的要求,试图模仿XLL行为,我确信我的回答相对于ANALYS32.xll所做的是最正确的。


3
遗憾的是,使用xlfRegister注册UDF 不会导致Excel将这些信息显示为表内智能感知工具提示。仅在“功能参数”对话框中显示在那里注册的描述等,当按fx按钮时会弹出该对话框。但这不是原始海报所要问的。
Govert

@Govert在2016年现在还是这样吗?
beppe9000

@ beppe9000是的。您可以使用Excel-DNA IntelliSense扩展获取针对UDF(在XLL或VBA中定义)的表内IntelliSense工具提示:github.com/Excel-DNA/IntelliSense
Govert,
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.