这个问题已经asked before , 但每次接受的答案只是辞职,使用 Application.MacroOptions ( VBA6 ) ( VBA7 ) 提供功能描述,但此信息实际上并未显示为工具提示,因此它没有解决我的问题。
目标
我们都希望能够通过任何方式(VBA、VSTO 或 COM 加载项)定义自定义函数,并让用户受益于函数及其相关信息的弹出/工具提示描述参数,如每个内置 Excel 函数所显示的那样,无论是内联还是在公式栏中:
对此需求的广泛接受的答案是自定义功能是不可能的,但我想挑战这种信念。
问题
目前,我见过的最好的做法是定义函数(通常使用上面的 MacroOptions 调用),以便在调出函数对话框(公式栏中的 fx 按钮)时,它们的函数和参数说明如下所示:
如您所见,这是一个具有许多参数的复杂函数。如果用户不知道这个“函数参数”对话框以及如何调出它,而是只熟悉 Excel 的标准工具提示,他们将只能看到公式名称而没有其他帮助:
他们没有机会正确提供所需的参数。 (没有阅读文档,当然,没有用户会这样做。)
现在,高级用户可能知道通过键入 Ctrl+Shift+A,他们将获得一个自动完成的列表像这样的函数参数:
但是,当然,我们遇到了与上述相同的问题,即标准 excel 用户只会习惯第一张图片的默认行为,并且可能永远不会了解该功能。
此时应该清楚为什么这还不够,我们想要每个内置函数都有的东西 - 告诉用户如何使用该函数的内嵌工具提示。
挑逗
起初,我可能确信这根本不可能,除非使用 native Excel 应用程序功能。加载项和 VBA 是可扩展功能,此工具提示可能根本无法扩展。但该理论受到 Analysis Toolpak 加载项的挑战。当然,它是在 Microsoft 中构建的,但 ANALYS32.xll 是一个独立的 XLL 插件,就像那些可以在 VB、C、C++ 和 C# 中生成的插件一样。果然,当这个 XLL 被加载到应用程序中时 functions它提供了与 native excel 函数相同的工具提示:
当然,如果此信息以某种方式编码在此 XLL 文件中并传递到 Excel,是否有办法使用我们自己的加载项复制它?我现在正要开始自学一些反编译知识,看看我是否可以对分析工具包中发生的任何事情进行逆向工程。
您可以如何提供帮助
我几乎可以肯定,我已经研究了有关此问题的所有公开信息。如果有人知道一些我不知道的事情可能对此有帮助,请随时插话。我对逆向工程编译的 dll/xll 非常不熟悉,所以如果有人想打开他们的本地副本 Analysis32.xll 和弄清楚它的自定义函数定义是怎么回事,我将非常有义务。否则,我将自己继续深入研究,直到遇到所有死胡同并报告我的发现。
最佳答案
我已将概念验证项目发布到 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 函数的支持现在正在测试中。查看Getting Started GitHub 上的页面以获取说明。
关于c# - 寻求 Excel 自定义函数工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16903587/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c