之前已经问 过这个问题,但每次接受的答案只是使用Application.MacroOptions(VBA6)(VBA7)提供功能描述的辞职,但这些信息实际上并不是工具提示,所以它不能解决我的问题.
目标
我们都希望能够通过任何方式(VBA,VSTO或COM加载项)定义自定义函数,并为用户提供函数及其参数的弹出/工具提示描述的好处,如对于每个内置Excel函数,无论是内联还是在公式栏中都会出现:


对这种需求的广泛接受的答案是,定制功能是不可能的,但我希望挑战这种信念.
问题
目前,我见过的最好的人是定义函数(通常使用上面的MacroOptions调用),这样当调出函数对话框(公式栏中的fx按钮)时,它们的函数和参数说明如下所示:

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

他们没有机会正确提供所需的参数.(没有阅读文档,当然,没有用户做过.)
现在,高级用户可能知道通过键入Ctrl+ Shift+ A,他们将被授予一个自动完成的函数参数列表,如下所示:

但是,当然,我们遇到与上述相同的问题,即标准的Excel用户将只用于第一张图像的默认行为,并且可能永远不会学习该功能.
在这一点上应该清楚为什么这还不够,我们想要每个内置函数都有 - 内联工具提示告诉用户如何使用该函数.
挑逗
起初,我可能已经确信除了本机Excel应用程序功能之外,这是不可能的.加载项和VBA是可扩展性功能,此工具提示可能根本不可扩展.但是这个理论受到了Analysis Toolpak插件存在的挑战.当然,它是在微软内置的,但ANALYS32.xll是一个独立的XLL加载项,就像那些可以用VB,C,C++和C#生成的加载项一样.果然,当这个XLL加载到应用程序中时,它提供的功能具有与原生excel函数相同的工具提示:

当然,如果此信息以某种方式编码在此XLL文件中并传递给Excel,有一种方法可以使用我们自己的加载项复制它吗?我现在正处于这样的地步,我将开始自我教授一些反编译,看看我是否可以对分析工具库中发生的任何事情进行逆向工程.
你可以如何帮助
我几乎可以肯定,我已经研究了有关这个问题的所有公开信息.如果有人知道我不知道的东西可能会对此有所帮助,请随意插入.我对逆向工程编译的dll/xll非常不熟悉,所以如果有人感觉像是弹出他们的本地副本的Analysis32.xll和弄清楚它的定制功能定义是怎么回事,我非常感激.否则,我会继续深入研究这个问题,直到我遇到所有死胡同并报告我找到的东西.
如果我=vlookup(在公式栏中键入(或任何其他本机Excel函数),然后单击公式左侧的小Fx按钮,我将获得包含所有可用参数的"函数参数"提示.在该提示中,在函数参数下面,当您从每个参数的输入框移动光标时,函数和每个参数的一个或两个句子描述.
当我输入我的UDF名称并单击Fx时,我得到了所有参数的输入框,但就是这样.有没有办法可以添加本机Excel函数具有的那些相同的有用类型的描述?
Excel文件包括部署在表(VBA列表对象)中的VBA编码的用户定义函数(UDF).现在,出于逃避我的原因,如果UDF模块包含在任何子函数或函数范围之外声明的Range变量,则在打开文件时会收到非常明显的警告:"自动错误 - 灾难性故障".
"灾难性"似乎是夸大其词,因为在警告被驳回后,文件似乎正常工作.但我仍然想了解问题所在.我已设法用MVC示例复制该问题,如下所示.我在Windows 10上运行Excel 2016(已更新).
有两个表(即VBA listobjects):表1列出了"项目"和表2中列出了"项目特征"(通过选择数据和点击生成两个表Table的上Insert标签).表2 ITEM_NAME()在字段Item_Name中调用了一个UDF ,它返回项目名称作为项目ID的函数,请参见屏幕截图:
该函数ITEM_NAME()本质上是常规工作表函数INDEX和MATCH的包装器,如下面的代码所示:
Option Explicit
Dim mrngItemNumber As Range
Dim mrngItemName As Range
Public Function ITEM_NAME(varItemNumber As Variant) As String
' Returns Item Name as a function of Item Number.
Set mrngItemNumber = Sheets(1).Range("A4:A6")
Set mrngItemName = Sheets(1).Range("B4:B6")
ITEM_NAME = Application.WorksheetFunction.Index(mrngItemName, _
Application.WorksheetFunction.Match(varItemNumber, mrngItemNumber))
End Function
Run Code Online (Sandbox Code Playgroud)
因此,重复一下,使用此设置,我会在打开文件时收到Automation错误.但是,当我执行以下任何操作时,错误消失:
将声明移动到函数的范围内.这个解决方案没有吸引力,因为它需要更多的代码行,每个UDF对应一行,并且有许多代码.
将变量类型从Range更改为其他内容,例如Integer(因此该函数显然不起作用).
将表2转换为普通范围(即删除表).这也是一个不方便的解决方案,因为我真的想在我的代码中将Table功能用于其他目的.
ITEM_NAME() …
我正在编写一个简单的函数,例如:
Function myFunction() As Variant
'Some rules
End Function
Run Code Online (Sandbox Code Playgroud)
对于上面的函数,是否可以像API调用那样分配Alias?
显然这不是正确的语法,但你明白了:
Function myFunction() Alias myFunc As Variant
'Some rules
End Function
Run Code Online (Sandbox Code Playgroud)
这将允许我使用任一名称:
Sub Test()
Debug.Print myFunction
Debug.Print myFunc
End Sub
Run Code Online (Sandbox Code Playgroud) 在使用VBA编写要在Excel中使用的自定义函数时,如何编写文档注释以便在自动填充公式期间自动显示excel?
例如,当我们开始键入VLookUp时,它会显示Vlookup作为工具提示的内容,显示输入变量名称,如果我们从功能区中按Insert Function,则会显示一个对话框,其中包含对功能的清晰说明...我们怎么能在VBA中编写自定义函数时实现这一点?
excel ×5
excel-vba ×4
vba ×4
.net-4.0 ×1
alias ×1
c# ×1
decompiling ×1
excel-2016 ×1
function ×1