【问题标题】:The quest for the Excel custom function tooltipExcel 自定义函数工具提示的求索
【发布时间】:2013-05-30 00:11:42
【问题描述】:

这个问题一直是askedbefore,但是每次接受的答案都是简单的辞职使用Application.MacroOptions(VBA6)(VBA7)提供功能描述,但是这个信息实际上并没有出现作为工具提示,所以它不能解决我的问题。

目标

我们都希望能够通过任何方式(VBA、VSTO 或 COM 插件)定义自定义函数,并为用户提供函数及其功能的弹出/工具提示描述的好处参数,显示在每个内置 Excel 函数中,无论是内联还是在公式栏中:

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

问题

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

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

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

现在,高级用户可能知道,通过键入 Ctrl+Shift+A,他们将获得一个自动完成的列表函数参数如下:

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

现在应该很清楚为什么这还不够,我们想要每个内置函数都有什么 - 告诉用户如何使用该函数的内嵌工具提示。

戏弄

起初,我可能认为这根本不可能,除非使用本机 Excel 应用程序功能。加载项和 VBA 是可扩展性功能,并且此工具提示可能根本不可扩展。但该理论受到分析工具库插件的挑战。当然,它是在 Microsoft 中构建的,但 ANALYS32.xll 是一个独立的 XLL 插件,就像可以在 VB、C、C++ 和 C# 中生成的插件一样。果然,当这个 XLL 被加载到应用程序中时,它提供的 functions 具有与本机 excel 函数相同的工具提示:

当然,如果此信息以某种方式在此 XLL 文件中编码并传递到 Excel,是否可以使用我们自己的加载项复制它?我现在要开始自学一些关于反编译的知识,看看我是否可以对分析工具包中发生的任何事情进行逆向工程。

如何提供帮助

我几乎可以肯定,我已经研究了有关此问题的所有公开信息。如果有人知道一些我不知道的东西可能对此有所帮助,请随时插话。我对逆向工程编译的 dll / xlls 非常不熟悉,所以如果有人想打开他们的 Analysis32.xll 本地副本和弄清楚它的自定义函数定义发生了什么,我将非常感激。否则,我将自己继续深入研究,直到找到所有死胡同并报告我的发现。

【问题讨论】:

  • 无法使用任何可用技术在当前 Excel 版本中创建或显示 UDF 参数的工具提示。 MVP 来源:answers.microsoft.com/en-us/office/forum/office_2007-customize/…
  • .NET Reflector 无法打开 ANALYS32.xll,断定它不是 .NET 程序集。这让我很惊讶。看起来我将不得不尝试将其反编译为汇编语言?
  • 听起来很有趣,但我过去 (office 97) 使用 winapi 制作了工具提示。这样你就可以做到。如果这很有趣,我可以挖掘信息并尝试从中得出答案。
  • 我也会得到它,这需要一些时间来挖掘它。但它应该放在这里供其他人使用。它是 winapi/vba/ 的低级和邪恶组合,我想我把它做成 vb.dll 但它不可能将它提升到 .net
  • 显然 Excel 开发团队正在为这个功能投票:excel.uservoice.com/forums/…

标签: c# excel .net-4.0 office-interop decompiling


【解决方案1】:

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

使用 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 UDF IntelliSense 对 Excel-DNA 加载项和 VBA 函数的支持。有关说明,请参阅 GitHub 上的 Getting Started 页面。

【讨论】:

  • 遗憾的是,参数帮助使用的 UI 自动化 TextRange 支持似乎确实需要 Excel 2013 或 Windows 8 或两者。我很想听听任何有 Windows UI 自动化经验的人...
  • 在编译到旧机器之前,您是否尝试过引用旧的 Excel 程序集?
  • 对 Excel 对象模型的引用并没有真正参与其中。但是肯定有不同的 UI 自动化版本可能会影响事情......
  • 到目前为止,这是领先于任何东西的街道,所以你得到我对赏金的投票。我打算看看我是否可以在不久的将来为这个解决方案做出贡献,所以请留意我的拉取请求!
  • @Alain Govert 干得好! & Alain 我很想看到你掌握这个。
【解决方案2】:

怎么样

  1. 在单元格的按键事件中捕获输入文本。 like this
  2. 检查文本是否与自定义函数匹配。
  3. 如果匹配,则显示标签或形状之类的内容以伪装成工具提示。 like this

这可以接受吗?

它有点丑,但更容易。

【讨论】:

  • 这是我考虑过的一个有趣的起点,但在遇到更高级的公式编辑形式时遇到了麻烦(例如单击中间某处并删除/添加字符,或突出显示和覆盖公式的一部分,或者在其他公式的中间使用自定义公式。)这些需要的不仅仅是检查按键,我们需要在编辑中查看公式栏或单元格的当前内容.这也可以通过一些导入的 dll 库来完成并处理黑客行为。当然值得探索。
【解决方案3】:

什么是 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

遗憾的是,Analysis Toolpak 插件也没有工具提示。

我的解决方案是错误的,但是原始发布者发布的信息有误。用 BINOMDIST 显示图片,如果他的link 清楚地表明这不是 ANALYS32.xll 的功能。

这意味着我试图解决一个不可能的问题。 因为没有 XLL 可以满足发帖人的要求。 如果您找到显示 XLL 工具提示的 Excel 版本,请告诉我。

关于发帖人提出的问题,试图模仿 XLL 的行为,我确信我的回答与 ANALYS32.xll 所做的相关是最正确的。

【讨论】:

  • 遗憾的是,使用 xlfRegister 注册 UDF不会 导致 Excel 将该信息显示为工作表内智能感知工具提示。在那里注册的描述等仅显示在“函数参数”对话框中,当您按下 fx 按钮时会弹出该对话框。但这不是原始海报所要求的。
  • @Govert 2016 年还是这样吗?
  • @beppe9000 是的。您可以使用 Excel-DNA IntelliSense 扩展获取 UDF(在 XLL 或 VBA 中定义)的表内 IntelliSense 工具提示:github.com/Excel-DNA/IntelliSense
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
相关资源
最近更新 更多