使用COM Interop将对象从C#传递到VBA

是否有可能使用COM将自定义对象(如MyClass [])从C#传递给VBA?

如果没有,这是最好的解决scheme,让这个工作?

我假设你正在谈论Excel VBA到C#…

这里是一个最小的C#类,它在项目中默认名称为ClassLibrary1:

using System; using System.Runtime.InteropServices; namespace Tester { [ClassInterface(ClassInterfaceType.AutoDual)] public class TestClass { public double D { get; set; } // simple property to get, set a double public string S { get; set; } // simple property to get, set a string } } 

这里是VBA来尝试这个类:

 Private Sub foo() Dim X As New ClassLibrary1.TestClass XS = "Hello" Debug.Print XS ' prints "hello" XD = 12 Debug.Print XD ' prints a 12 End Sub 

以下是您需要做的额外事情:

 (1) in C# Project...Properties...Build ==> check "Register for COM interop (2) in C# Project...Properties...Application...Assembly Information ==> check "Make assembly COM-visible" (3) in VBA ... Tools ... References, browse to the C# bin output directory and select the "*.tlb" file 

注意:这个scheme可能会失败,这取决于你添加到类中的什么 – 我不认为VBA会“看到”静态类或类,而不是默认的构造函数。 您也不能将VB集合映射到.NET集合,但是您将能够来回传递基本types(double,long)和基本types的数组。 另外 – 使用“自动模块”选项是获取方法的廉价方法…易于入门,但效率较低,并公开所有方法。 更好的实践(但更多的工作)将是build立自己的接口。 如果扩展此TestClass的成员以包含您定义的其他类的实例,并且如果您同样通过AutoDual或手动编码接口公开这些类方法,那么这些类和它们的(非重载)方法也将同样可见在VBA(与智能感知)。

希望这可以帮助。