Передача объектов из C # в VBA с помощью COM Interop - PullRequest
3 голосов
/ 17 февраля 2011

Можно ли передать пользовательский объект (например, MyClass []) из C # в VBA с помощью COM?

Если нет, то какое решение лучше всего подходит для этого?

1 Ответ

6 голосов
/ 30 марта 2011

Я предполагаю, что вы говорите об 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).

Надеюсь, это поможет.

...