2010-04-01 15 views
6

ok Tengo un par de clases .NET que quiero usar en VBA. Entonces debo registrarlos a través de COM y todo eso. Creo que tengo el registro COM resuelto (finalmente), pero ahora necesito ayuda con la sintaxis de cómo crear los objetos. Aquí hay un pseudo código que muestra lo que intento hacer.¿Cómo uso una clase .NET en VBA? Sintaxis ayuda!

EDIT: Se ha cambiado adjuntos objetos que devuelven un ArrayList en lugar de una lista

Las clases .NET ven así ...

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

    } 

} 

bien, así que esto es lo que me gustaría hacer en VBA (demostré en C#), pero no sé cómo ...

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

una cosa a destacar es que RandomObject no tiene un defau pública lt constructor. Por lo tanto, no puedo crear una instancia como Dim x As New RandomObject. MSDN dice que no se puede crear un objeto que no tiene un constructor por defecto a través de COM pero todavía se puede utilizar el tipo de objeto si se devuelve por otro método ... 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.

Agregado: Aquí está mi intento en VB:

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

Respuesta

1

Su problema es que el método AttachedObjects() es estático. COM no puede hacer métodos estáticos. En COM, la única operación "estática" que puede hacer es "instanciar una clase".

Por lo tanto, para llamar al método AttachedObjects desde VBA, simplemente hágalo no estático (es decir, elimine la palabra clave static en su definición). Aparte de eso, el método puede permanecer exactamente como está ahora. Y su código VBA también parece estar bien, debería funcionar una vez que modifique el método.

Y por si acaso no funciona, aquí está la siguiente pregunta: ¿qué error obtienes exactamente, y en qué momento?

1

de evitar esto es necesario crear un RandomObjectFactory en su código .NET y tener esta crear la instancia RandomObject utilizar en VBA

así que algo como esto:

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

puede extender esta clase para tener más sobrecargas de métodos create para crear diferentes sobrecargas de RandomObjects

ACTUALIZACIÓN:

basado en la correcta comprensión de la cuestión this question y this one probablemente lo hará ser útil

+0

Bueno, realmente no estoy tratando de "crear" una instancia de RandomObject de VBA. Solo estoy tratando de trabajar con una lista de RandomObjects que se crea dentro de la clase ResourceManagement (managed .NET). – PICyourBrain

+0

oh disculpas, leí mal la pregunta entonces. ¿quieres saber la sintaxis de vba para un ciclo? su primer problema será que ha devuelto una lista genérica al lado de la empresa, pero com no es compatible con los genéricos (debería haber recibido una advertencia del compilador comenzando por que esto era lo que intentaba hacer). ¿Puede usted? acceder a la clase ResourceManagement en el VBA? –

+0

Sí. En el proyecto de VBA agregué una referencia al ensamblado de .NET.Luego en VBA puedo hacer esto "Dim myObj como nuevo ResourceManagment", pero ¿cómo puedo llamar al método AttachedObjects? – PICyourBrain