Excel-DNA有一个选项可以将.NET类直接公开给COM,所以你可以直接使用它们作为常规的COM类从VBA。
要做到这一点您的类必须是标记有ComVisible特性(或整个装配必须标记有ComVisible特性),并且必须在文件。DNA标记ExternalLibrary为ComServer =“真”,是这样的:
<DnaLibrary RuntimeVersion='v4.0' />
<ExternalLibrary Path='MyAddIn.dll' ComServer='true' />
</DnaLibrary>
然后,你必须注册一些选择:要么 叫“Regsvr32.exe的MyAddInDna.xll” 或在您的外接的的AutoOpen,调用ExcelDna.Integration.ComServer.RegisterServer()
这两个设置注册表条目,以便.xll文件成为您的类的COM服务器。然后,您可以使用CreateObject(“MyNameSpace.MyClass”)从VBA延迟访问它们。
您需要另一个步骤来设置类型库(在VBA中为您提供智能感知)。为此,您可以使用tlbexp.exe生成类型库。 regsvr32/ComServer.RegisterServer调用将查找类型库并进行注册。
您也可以将.dll打包到.xll文件中(向ExternalLibrary标记添加pack ='true'属性),并且类型库也将打包(如果存在),并从.xll中的资源注册文件时您调用Regsvr32.exe
因此,最终结果可能是一个单一的文件.xll加载项,这是一个Excel加载项与UDFs,功能区,RTD服务器,也可以访问的COM服务器VBA。
更多的信息在这里的讨论:http://exceldna.codeplex.com/discussions/252721和这里:http://groups.google.com/group/exceldna/browse_frm/thread/4c5a71efbe96d885。
太棒了!我觉得有一个更好的方法来做到这一点,而不是我想要的。而@Govert,这是你写的一个伟大的软件。保持伟大的工作! – mwolfe02 2012-01-29 02:55:51
可以使用相同的函数作为Excel中的UDF和通过COM的VBA,还是我需要在.NET中编写包装函数? – mwolfe02 2012-01-30 15:46:01
作为UDF导出的函数必须是'static',而COM可见方法必须是实例方法。因此,为了使用与工作表函数相同的功能并从COM对象中调用,您需要一些包装。您可能需要处理一些参数和返回值重新映射 - 在Excel UDF调用和VBA/COM调用中,错误值,缺少参数和范围的编组方式会有所不同。 – Govert 2012-01-30 16:20:40