2010-04-01 9 views
6

ok Mam kilka klas .NET, które chcę użyć w VBA. Muszę zarejestrować je przez COM i tak dalej. Myślę, że mam zarejestrowaną rejestrację COM (wreszcie), ale teraz potrzebuję pomocy ze składnią jak tworzyć obiekty. Oto pseudo kod pokazujący, co próbuję zrobić.Jak korzystać z klasy .NET w VBA? Pomoc dotycząca składni!

Edycja: Zmieniono Załączone Przedmioty wrócić ArrayList zamiast listy

Klasy .NET wyglądać tak ...

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) 
    { 

    } 

} 

OK, więc to jest to, co chciałbym zrobić w VBA (co wykazano w C#), ale nie wiem jak ...

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 
     } 
    } 
} 

Jedną rzeczą jest, aby pamiętać, że RandomObject nie posiada publicznego defau lt konstruktor. Nie mogę więc utworzyć takiej instancji, takiej jak Dim x As New RandomObject. MSDN mówi, że nie można utworzyć wystąpienia obiektu, który nie ma domyślnego konstruktora poprzez COM, ale nadal można użyć typu obiektu, jeśli jest ona zwracana inną metodą ... 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.

Dodano: Oto moja próba w VB:

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

Odpowiedz

1

Twój problem polega na tym, że metoda AttachedObjects() jest statyczna. COM nie może wykonywać metod statycznych. W COM, jedyną "statyczną" operacją, którą możesz wykonać, jest "utworzenie instancji klasy".

Dlatego, aby wywołać metodę AttachedObjects z VBA, należy po prostu uczynić ją niestatyczną (tj. Usunąć słowo kluczowe static w swojej definicji). Poza tym metoda może pozostać taka, jaka jest teraz. A twój kod VBA również wydaje się OK - powinien działać po modyfikacji metody.

I na wszelki wypadek, że to nie działa, oto następne pytanie: jaki błąd otrzymujesz dokładnie i kiedy?

1

obejść tego trzeba stworzyć RandomObjectFactory w kodzie .NET i mieć to utworzyć instancję RandomObject korzystać w VBA

więc coś to:

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

można rozszerzyć tę klasę, aby mieć więcej przeciążeń Create metod tworzenia różnych przeciążeniem RandomObjects

UPDATE:

oparciu o właściwe zrozumienie kwestii this question i this one będzie prawdopodobnie być użytecznym

+0

Cóż, tak naprawdę nie próbuję "stworzyć" instancji RandomObject z VBA. Po prostu próbuję pracować z listą obiektów RandomObjects, które są tworzone w klasie ResourceManagement (zarządzane .NET). – PICyourBrain

+0

o przepraszam, błędnie przeczytałem pytanie. chcesz znać składnię vba dla pętli? twoim pierwszym problemem będzie to, że zwróciłeś ogólną listę do strony com, ale com nie obsługuje generycznych (powinieneś mieć ostrzeżenie kompilatora, zaczynając od tego, co próbujesz zrobić). Czy jesteś w stanie uzyskać dostęp do klasy ResourceManagement w VBA? –

+0

Tak. W projekcie VBA dodałem odwołanie do zestawu .NET.Następnie w VBA mogę zrobić to "Dim myObj jako nowy menedżer zasobów", ale w jaki sposób wywołać metodę AttachedObjects. – PICyourBrain

Powiązane problemy