Как использовать класс .NET в VBA? Синтаксическая помощь! - PullRequest
6 голосов
/ 01 апреля 2010

хорошо, у меня есть пара классов .NET, которые я хочу использовать в VBA. Поэтому я должен зарегистрировать их через COM и все такое. Я думаю, что у меня есть регистрация COM (наконец), но теперь мне нужна помощь с синтаксисом того, как создавать объекты. Вот некоторый псевдокод, показывающий, что я пытаюсь сделать.

РЕДАКТИРОВАТЬ: Изменены прикрепленные объекты, чтобы возвращать ArrayList вместо списка

Классы .NET выглядят так ...

public class ResourceManagment
{
    public ResourceManagment()
    {
        // Default Constructor
    }

    public static List<RandomObject> AttachedObjects()
    {
        ArrayList list = new ArrayList();
        return list;
    }
}

public class RandomObject
{
    // 
    public RandomObject(int someParam)
    {

    }

}

ОК, вот что я хотел бы сделать в VBA (продемонстрировано в C #), но я не знаю, как ...

public class VBAClass
{
    public void main()
    {
        ArrayList myList = ResourceManagment.AttachedObjects();
        foreach(RandomObject x in myList)
        {
            // Do something with RandomObject x like list them in a Combobox
        }
    }
}

Следует отметить, что RandomObject не имеет общедоступного конструктора по умолчанию. Поэтому я не могу создать экземпляр этого как Dim x As New RandomObject. MSDN говорит, что вы не можете создать экземпляр объекта, у которого нет конструктора по умолчанию через COM, но вы все равно можете использовать тип объекта, если он возвращается другим методом ... Types must have a public default constructor to be instantiated through COM. Managed, public types are visible to COM. However, without a public default constructor (a constructor without arguments), COM clients cannot create an instance of the type. COM clients can still use the type if the type is instantiated in another way and the instance is returned to the COM client. You may include overloaded constructors that accept varying arguments for these types. However, constructors that accept arguments may only be called from managed (.NET) code.

Добавлено: Вот моя попытка в VB:

Dim count As Integer
count = 0
Dim myObj As New ResourceManagment
For Each RandomObject In myObj.AttachedObjects
    count = count + 1
Next RandomObject

Ответы [ 2 ]

1 голос
/ 04 апреля 2010

Ваша проблема в том, что метод AttachedObjects() является статическим. COM не может делать статические методы. В COM единственная «статическая» операция, которую вы можете сделать, это «создать экземпляр класса».

Поэтому, чтобы вызвать метод AttachedObjects из VBA, просто сделайте его нестатичным (то есть удалите ключевое слово static в его определении). Помимо этого, метод может остаться точно таким же, как сейчас. И ваш код VBA тоже выглядит нормально - должен работать, как только вы измените метод.

И на всякий случай, если это не сработает, вот следующий вопрос: какую ошибку вы получаете точно и в какой момент?

1 голос
/ 01 апреля 2010

, чтобы обойти это, вам нужно создать RandomObjectFactory в вашем .net-коде и создать экземпляр RandomObject для использования в VBA

так как то так:

public class RandomObjectFactory
{
     public static Create(int someParam)
     {
          return new RandomObject(someParam);
     } 
}

вы можете расширить этот класс, чтобы иметь больше перегрузок методов create для создания различных перегрузок RandomObjects

UPDATE:

исходя из правильного понимания вопроса этот вопрос и этот , вероятно, будет полезен

...