如果您之前见过这样的事情,我会道歉,我尽可能地搜索论坛。我试图得到一个明确的答案,我认为我已经在另一个论坛上看到了这个问题 - 我非常希望我误解了答案。
总之,我想编写带有参数的vba subs / functions,并通过C#业务逻辑层和ExcelDNA从SQL数据库中检索数据。
C#层是.Net解决方案的一部分,该解决方案将来自多个应用程序的请求编组到多个数据库中。 Config是集中管理的,DataAccess对象是在工厂运行时创建的。
返回类型可能因请求应用程序而异 - 可能会要求相同的数据作为Dictionary,DataTable等。根据用户权限/访问权限,输入参数等,业务层将对数据执行各种聚合和计算操作将对象返回到请求的应用程序。
不幸的是,一个用户有一个基于Excel的应用程序,我现在必须集成。从阅读VSTO,COM,自动化插件和ExcelDNA,我决定最好将项目添加到与ExcelDNA接口的解决方案中。但是经过很多步骤将简单的字符串从SQL返回到单元格中的Excel函数之后,我现在需要尝试将DataTable(这里是灵活的)返回给VBA函数。 VBA会接受一些参数,例如数据库名称,环境(PROD,UAT,DEV),ModelRunId,startDate,endDate ....
但从我所读到的,这是不可能的。有没有人实现过这个?我接近编写一个简单的WinForms应用程序并在某些网格上公开“导出到Excel”功能 - 让Excel用户完成腿部工作....
直接写入SQL Server并使用CopyFromRecordSet等方法不是一种选择。
提前致谢
答案 0 :(得分:2)
听起来您想在C#/ .NET中创建一个COM服务器并将其公开给Excel VBA。
例如,在C#中创建一个类,使其可见COM并为其提供GUID和ProgId,如下所示:
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("AAA82C86-91CF-496C-A8BA-70742DC58475")]
[ProgId("MyVbaFunctions")]
public class MyVbaFunctions
{
public string GetSomeData(string arg1)
{
return "Return your data";
}
}
然后,您需要在Visual Studio的“构建”首选项中勾选“注册COM Interop”选项。构建项目后,可以进入Excel VBA编辑器,单击工具 - >参考菜单,在已注册的类型库列表中找到您的程序集并勾选它。
然后,您应该能够编写使用C#类的VBA宏。在VBA中有类似的东西:
Sub MyMacro()
Dim MyFuncs As New MyLibrary.MyVbaFunctions
Debug.Print MyFuncs.GetSomeData("hello")
End Sub
显然,您可以扩展您的库以包含几个类和方法,所有这些都由C#支持。
在将程序集部署到用户时,需要使用“regasm.exe / codebase MyLibrary.dll”注册它(使用“/ u”取消注册)。
由于您已经在使用Excel-DNA,因此您应该查看主干源代码,该代码支持[ExcelComClass]属性,该属性允许Excel-DNA托管您的COM服务器而不是默认(mscoree.dll) 。这意味着您的函数将在与UDF相同的应用程序域中运行。