【问题标题】:Using C# library function in Excel VBA在 Excel VBA 中使用 C# 库函数
【发布时间】:2017-08-01 13:45:29
【问题描述】:

我的 C# 库 (.net 4.5.2) 代码如下所示:

namespace HelloWorld
{
    public class Hello
    {
        public string HelloUser(string name)
        {
            return "Hello, " + name;
        }
    }
}

我已使用以下代码使程序集 COM 在 AssemblyInfo.cs 文件中可见:

[assembly: ComVisible(true)]

我通过 Tools ->References 在 VBA 代码中添加了对 dll 的引用,当尝试在 excel vba 中使用它时,我收到运行时错误:429(ActiveX 组件无法创建对象)。我的代码/调用有什么问题:

Excel VBA (2013)

Option Explicit

Sub tester()

Dim message As String
Dim User As String

User = "Ronnie"
Dim obj As New HelloWorld.Hello
message = obj.HelloUser(User)

End Sub

更新 通过 Toos ->References 添加引用并使用 F2 检查状态后

更新 #3 更新了 VBA 代码,仍然没有成功。这次的错误是:

Run-time error: 429 (ActiveX component can't create object)

【问题讨论】:

  • 从您的 VBA 项目中引用类型库 (.tlb),像使用 VBA 中的任何其他类型库一样使用它。不过,不确定static 对 COM 的友好程度如何,您可能想用适当的属性装饰 Hello 类。
  • @Mat'sMug 我为我的 dll 简化了代码,使其成为非静态的。我怀疑我没有在 VBA 中正确声明该函数。这是在类(Hello)和命名空间(HelloWorld)中声明函数的正确方法吗?
  • 你没有Declare 它,你去Tools > References... 然后浏览找到你添加为引用的类型库。然后按 F2 进入 VBE 的对象浏览器,查看是否加载了 HelloWorld 库,以及它是否包含带有 HelloUser 函数的 Hello 类。如果没有,你就有问题了。如果是这样,那么您在 VBA 中使用它就像任何其他引用的类型库一样。
  • @Mat'sMug 我使用建议的方法添加了它,现在我看到了 dll 和类,但在类下面什么都没有(你好)。

标签: c# vba excel


【解决方案1】:

您的类没有向 COM 公开接口。您需要使用[Guid("some guid")] 属性来装饰您的类,如果您希望能够将其与后期绑定一起使用,则需要给它一个[ProgId("Some.Id")],以及一个正式描述成员如何暴露的[ComDefaultInterface(typeof(IHelloWorld))]

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IHelloWorld
{ 
    string HelloUser(string name);
}

[ComVisible(true)]
[ComDefaultInterface(typeof(IHelloWorld))]
public class HelloWorld : IHelloWorld
{
    public string HelloUser(string name)
    {
        return $"Hello, {name}.";
    }
}

【讨论】:

  • 我认为这将是一个普通的图书馆项目,而不是任何特殊的办公室模板,对吧?我需要使用剪贴板,c# 似乎是一种无需摆弄系统 API 的简单方法。是否还建议选择任何特定的 .net 框架来减少潜在的兼容性问题?
  • @t3chb0t 理论上最新的 .net 内核具有完整的 COM 互操作支持(对吗?),但我还没有测试过。但是,是的,它只是一个标准库项目;您需要注意将要引用库的主机应用程序的位数;可能需要单独的 x86 和 x64 构建。
  • 奥奇!我刚刚尝试过,事实证明这需要将lib注册为管理员。他们永远不会允许我这样做嘿嘿,回到系统 api :-]
  • 新想法...也许我可以创建一个插件并从 VBA 调用它。正在研究...
  • @t3chb0t 如果您在系统级别注册 COM 内容,您只需要管理员权限; Rubberduck 的安装程序允许通过注册到 HKCU 来进行每个用户的 no-privs 安装(如果我记得的话……需要手动创建所有密钥)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多