【问题标题】:Create object library for Excel vba为 Excel vba 创建对象库
【发布时间】:2014-11-05 20:34:07
【问题描述】:

我有一个用 C# 编写的 GUI。它是控制寄存器映射的交互式按钮和文本网格。我想为该 GUI 创建一个 API 以在 Excel vba 中使用。我一直找不到任何示例或文档来说明如何创建这样的东西,但我以前使用过其他公司的对象库。

在尝试创建它时,我遇到了一些问题,即它只能在我的计算机上运行。此外,如果我移动到计算机上的另一个文件夹,它也会中断。

Excel vba 代码:

Sub Test()
    Dim impclass As New ZZVISIBLE_FROM_EXCEL_CLASS
    MsgBox impclass.DotNetMethod_SQR(5)
End Sub

C#库类代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ZZVISIBLE_FROM_EXCEL_LIBRARY
{
    public class ZZVISIBLE_FROM_EXCEL_CLASS
    {
        public Double DotNetMethod_SQR(Double input)
        {
            return input * input;
        }
    }
}

此基础示例使用 C# 库类对数字求平方,并使用 Excel VBA 选择数字 5。这是我以后想做的事情的基本框架,例如:

grid.writecell(22,1001)

grid.getcell(22)

grid.resetall()

grid.loadfile("C:\griddata\config_default")

一些用于制作这些对象库的参考资料,甚至它们的名称将是最有帮助的!谷歌搜索“C# 中的自定义 excel vba 引用”到目前为止没有任何用处,所以我决定在这里发帖寻求帮助。

另外,我在项目中已经足够早了,“你做错了,做这个”类型的答案也很受欢迎!

【问题讨论】:

  • 你不能在 C# 中使用 Microsoft.Interop.Excel 做同样的事情吗?你试过谷歌上使用 Interop 的例子吗?
  • 这是一个很棒的评论!不幸的是,我这样做的原因是为了保持与用 Excel VBA 编写的代码的兼容性。

标签: c# vba excel


【解决方案1】:

你有几个选择:

1) 创建一个程序集并使用 regasm 使其 COM 可见

参见 CodeProject 上的文章

http://www.codeproject.com/Articles/555660/Extend-your-VBA-code-with-Csharp-VB-NET-or-Cpluspl

2) 要使 C# 程序集对 Excel 可见,您必须使其 COM 可见并将 ReferenceAssemblyFromVbaProject 设置为 true。

有关详细信息,请参阅以下 MSDN 文章:

http://msdn.microsoft.com/en-us/library/bb608604.aspx

谢谢,凯文

【讨论】:

  • 很好的建议,但它并没有解决部署问题。只有我的电脑运行它。我应该如何将其部署为其他人可以使用的工具?
  • @SwimBikeRun 答案就在那里——使用regasm 在其他机器上注册.dll.tlb。在部署之前,请确保您针对的是正确的平台。
  • 正如 vba4all 所说,您可以使用 regasm,您也可以编写一个 .NET 安装程序 stackoverflow.com/questions/2378730/… 无论哪种方式,您都需要管理员权限。
  • 问题是目标机器需要这个regasm工具,这意味着他们必须安装visual studio...
  • 感谢 .NET 安装程序链接
【解决方案2】:

首先,您需要知道您正在使用的 dotnet 版本,以便您使用: C:\Windows\Microsoft.NET\Framework\v2.0.50727\regasm.exe 或 c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe

其次,您需要知道要将 dll 注册为 32 位还是 64 位,因此对 32 位使用相同的先前路径,或者在 64 位的情况下仅使用 Framework64 而不是 Framework

完成后,您可以像这样在您的 vba 脚本中轻松添加对该程序集的引用:

添加后,您可以实例化 dll 中存在的任何类的任何实例

【讨论】:

    【解决方案3】:

    您可以将库包装在 Excel-DNA 插件中。 (Excel-DNA 是我开发的用于将 .NET 与 Excel 集成的免费库)。这可能会缓解 COM 的注册问题(允许您在不需要管理员权限的情况下部署 COM 对象模式)。

    如果您想将某些功能公开为用户定义的函数,您可以从 Excel 的工作表中调用这些功能,添加功能区或类似的东西,这也会有所帮助。

    对于使用 Excel-DNA 向 VBA 公开对象模型,我建议以 Mikael Katajamäki 的这些帖子为起点:

    对于一般的 Excel-DNA 支持,我建议您使用 Excel-DNA Google group

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2013-03-13
      • 2011-10-18
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多