2010-04-01 6 views
6

ok Ich habe einige .NET-Klassen, die ich in VBA verwenden möchte. Also muss ich sie über COM registrieren und das alles. Ich denke, ich habe die COM-Registrierung (endlich) herausgefunden, aber jetzt brauche ich Hilfe bei der Syntax, wie man die Objekte erstellt. Hier ist ein Pseudocode, der zeigt, was ich versuche zu tun.Wie verwende ich eine .NET-Klasse in VBA? Syntax Hilfe!

EDIT: Changed angebaute Objekte eine Arraylist statt einer Liste

Die .NET-Klassen wie folgt aussehen zurückzukehren ...

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, also das ist, was ich möchte in VBA tun (in C# gezeigt), aber ich weiß nicht, wie ...

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

eine Sache zu beachten ist, dass RandomObject keine öffentliche Defau hat Es ist Konstrukteur. Also kann ich keine Instanz wie Dim x As New RandomObject erstellen. MSDN sagt, dass Sie nicht ein Objekt zugreifen können, nicht über einen Standardkonstruktor über COM hat, aber Sie können immer noch den Objekttyp verwenden, wenn sie durch eine andere Methode zurückgegeben wird ... 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.

Hinzugefügt: Hier ist mein Versuch in VB:

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

Antwort

1

Ihr Problem ist, dass die AttachedObjects() Methode statisch ist. COM kann statische Methoden nicht ausführen. In COM ist die einzige "statische" Operation, die Sie tun können, "eine Klasse instanziieren".

Daher, um die AttachedObjects-Methode von VBA aufzurufen, machen Sie es einfach nicht statisch (d. H. Entfernen Sie das Schlüsselwort static in seiner Definition). Ansonsten kann die Methode genau so bleiben, wie sie jetzt ist. Und Ihr VBA-Code scheint auch OK - sollte funktionieren, sobald Sie die Methode ändern.

Und nur für den Fall, dass es nicht funktioniert, hier ist die nächste Frage: Welchen Fehler bekommen Sie genau, und an welchem ​​Punkt?

1

um diese Sie eine RandomObjectFactory in Ihrem .NET-Code erstellen müssen zu erhalten und haben dies die RandomObject Instanz erstellen in VBA verwenden

so etwas wie dies:

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

Sie diese Klasse erweitern können, um mehr Überlastungen von create-Methoden müssen unterschiedliche Überlastungen von RandomObjects

UPDATE erstellen:

basierend auf dem richtigen Verständnis der Frage this question und this one wird wahrscheinlich nützlich sein

+0

Nun, ich versuche nicht wirklich eine Instanz von RandomObject von VBA zu "erstellen". Ich versuche nur mit einer Liste von RandomObjects zu arbeiten, die in der ResourceManagement-Klasse (Managed .NET) erstellt wird. – PICyourBrain

+0

Oh Entschuldigung, ich habe die Frage dann falsch gelesen. Sie möchten die VBA-Syntax für eine Schleife kennen? Ihr erstes Problem wird sein, dass Sie eine generische Liste auf der com-Seite zurückgegeben haben, aber com keine generics unterstützt (Sie sollten eine Compiler-Warnung erhalten haben, die genau das ist, was Sie versuchten zu tun) Zugriff auf die ResourceManagement-Klasse in der VBA? –

+0

Ja. Im VBA-Projekt habe ich einen Verweis auf die .NET-Assembly hinzugefügt.In VBA kann ich dann "Dim myObj als neues ResourceManagement" ausführen, aber dann rufe ich die AttachedObjects-Methode auf. – PICyourBrain