Я предполагаю, что вы говорите об 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
X.S = "Hello"
Debug.Print X.S ' prints "hello"
X.D = 12
Debug.Print X.D ' 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
Примечание: эта схема может не работать в зависимости от того, чтовы добавляете в класс - я не думаю, что VBA будет "видеть" статические классы или классы w, отличные от конструкторов по умолчаниюВы также не можете сопоставить коллекции VB с коллекциями .NET, но вы сможете передавать базовые типы (double, long) и массивы базовых типов назад и вперед.Кроме того, используемая опция «Autodual» - это дешевый способ раскрытия методов ... легкий в начале, но менее эффективный и раскрывающий все общедоступные методы.Лучшей практикой (но больше работы) будет настройка собственных интерфейсов.Если вы расширяете члены этого TestClass, чтобы включить экземпляры других классов, которые вы определили, и если вы также предоставите эти методы класса через AutoDual или через интерфейсы с ручным кодированием, то эти классы и их (не перегруженные) методы также будут видныв VBA (с Intellisense).
Надеюсь, это поможет.