【问题标题】:ExcelDNA: commands with parameters , return data typesExcelDNA:带参数的命令,返回数据类型
【发布时间】:2011-07-12 09:50:40
【问题描述】:

抱歉,如果您以前看到过类似的东西,我已经尽我所能搜索了论坛。我正在尝试对一个我认为我已经在其他论坛上看到的问题给出明确的答案 - 我只是非常希望我误解了答案。

总之,我想编写 vba 子程序/函数,通过 C# 业务逻辑层和 ExcelDNA 从 SQL 数据库获取参数和检索数据。

C# 层是 .Net 解决方案的一部分,该解决方案将来自多个应用程序的请求编组到多个数据库。 Config 是集中管理的,DataAccess 对象是在运行时在工厂中创建的。

返回类型可能因请求应用程序而异 - 可能会请求字典、数据表等相同的数据。根据用户权限/访问、输入参数等,业务层将在之前对数据执行各种聚合和计算操作将对象返回给请求的应用程序。

不幸的是,一位用户有一个基于 Excel 的应用程序,我现在必须集成它。通过阅读有关 VSTO、COM、自动化插件和 ExcelDNA 的信息,我决定最好将一个项目添加到与 ExcelDNA 接口的解决方案中。但是,在将简单的字符串从 SQL 返回到单元格中的 Excel 函数的许多小步骤之后,我现在需要尝试将 DataTable(此处灵活)返回到 VBA 函数。 VBA 会接受一些参数,例如数据库名称、环境(PROD、UAT、DEV)、ModelRunId、startDate、endDate....

但是根据我的阅读,这是不可能的。有没有人做到这一点?我已经接近于编写一个简单的 WinForms 应用程序并在某些网格上公开“导出到 Excel”功能 - 让 Excel 用户完成这项工作......

不能直接写入 SQL Server 并使用 CopyFromRecordSet 等方法。

提前致谢

【问题讨论】:

  • ExcelDNA 的目标是让创建 .NET UDF 变得高效和简单 - 为什么需要创建 VBA UDF?
  • 如果您的问题是如何让 Excel UDF 将值表返回到多个单元格,请查看创建数组 UDF。
  • 我不想要 VBA 中的 UDF。所有功能都在 C# 层中。它执行数据检索、聚合、计算字段、基于安全规则删除数据等。我只想能够从 VBA 调用这些 C# 函数。该调用必须包含一些参数。返回的表的大小可能会根据列和行而变化,所以我认为这可能会使 vba 中的数组变得困难。也许我可以返回 DOM 文档?
  • 您的计划的哪一部分给您带来了问题?听起来您可以在 Excel-DNA 中创建一个宏来检索和检查 DataTable 并将该数据放入工作表中。如果您需要向用户显示一些 UI 以选择哪些数据,您可以将其创建为功能区选项卡或 Windows 窗体 GUI。
  • 您好,感谢您对此的回复。我读到您不能将参数传递给 ExcelDNA 中的 [ExcelCommand()],我需要这样做,以指定返回的内容。问候,詹姆斯

标签: c# sql excel vba


【解决方案1】:

听起来您想在 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 互操作”选项。构建项目后,您可以进入 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 在同一个应用程序域中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多