ID | Asunto | Fecha | Nick | |
57774 | Pasar una coleccion desde C# a VBA | 29/10/14 12:06 | slzrrz | | |
Buenas: Llevo días peleándome con esto y no soy capaz de dar con una solución. Estoy desarrollando una dll en C# que será llamada desde un xla. En este xla, llamo a una función de la dll que me tiene que devolver una colección. En la dll, tengo declarada la colección de la forma using VBCollection = Microsoft.VisualBasic.Collection; pero cuando hago la llamada desde el xla, me da un error 13, no coinciden los tipos. Estoy utilizando Visual Studio 2013. ¿Alguna idea? Gracias, José Carlos |
|
ID | Asunto | Fecha | Nick | |
57777 | Re: Pasar una coleccion desde C# a VBA (Resp: 57774) | 29/10/14 16:40 | Pipe[hgjfkdls] | | |
slz, No entiendo para nada lo que intentas hacer, más bien, si lo entiendo pero no le veo el sentido. Con "XLA" supongo que es un complemento de Excel, los complementos de Excel se programan en VBA (no VB.NET) y lo que intentas hacer es importar una clase "Collection" que ya existe en este lenguaje. es algo extraño. De todas maneras, si lo que necesitas es poner otro nombre a tu clase "Collection" pues te conviene crear una clase hija. public class VBCollection:Microsoft.VisualBasic.Collection
{} Y ya. Saludos, Pipe [hgjfkdls]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57778 | Re: Pasar una coleccion desde C# a VBA (Resp: 57774) | 29/10/14 16:52 | slzrrz | | |
Buenas:
Gracias por responder. A ver si ahora consigo explicarme mejor (y desde el principio).
Efectivamente, el XLA es un complemento de Excel y está programado en VBA. Lo tengo funcionando correctamente para Office de 32 bits, llamando a varias dll's desarrolladas en VB6.
Ahora, para que el mismo XLA funcione en Office de 64 bits, no puedo utilizar esas dll's de 32. Como tengo que desarrollar dll's de 64 bits, me he puesto a hacerlo en C# (por otros motivos).
Para no tener que cambiar demasiado el código de la XLA, estoy reprogramando las dll's de VB6 en C#. Y en la dll tengo una función que me tiene que devolver una colección al XLA.
Si utilizo las colecciones propias de C#, no funciona, y si utilizo Microsoft.VisualBasic.Collection me da el error 13 que comentaba antes.
Saludos
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57779 | Re: Pasar una coleccion desde C# a VBA (Resp: 57778) | 29/10/14 21:12 | Pipe[hgjfkdls] | | |
slz, Estuve haciendo pruebas y me da el mismo error, primero que todo no puedes compilar una Dll tipo COM si intentas retornar en los métodos elementos que no son compatibles con la interoperabilidad. Para lograr compilar la Dll tuve que retornar un tipo object y es por eso que aparece el error nº13 (no coinciden los tipos). Como sabes el cast o la transformación de objetos en VBA es muy difícil, solo existen métodos del lenguaje para tipos básicos, todos los demás tendrás que programarlos. Te recomiendo lo siguiente: 1.- trata de retornar tipos genéricos: int, string, double, etc... 2.- también puedes retornar arrays o matrices simples int[], string[], double[], etc... 3.- si quieres retornan clases o tipos no genéricos deben ser tipos que admitan interoperabilidad. estos los puesdes declarar en tu dll sin problema. Ahora, en tu caso puntual recomiendo que tu método retorne una matriz de dos dimensiones: string[,] value=new string[(numero_elementos - 1),1];'para el key y el valor Para ser más preciso: [InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
[ComVisible(true)]
public interface IInterop
{
[ComVisible(true)]
string[,] GetCollection();
}
[Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Interop:IInterop
{
public string[,] GetCollection()
{
string[,] retval=new string[,]{{"key1","Mensaje
1"},{"key2","Mensaje 2"}};
return retval;
}
} Y lo implementamos en VBA Dim tabla() as string
tabla = Complemento.Interop.GetCollection() Saludos, Pipe [hgjfkdls] [Editado: Pipe[hgjfkdls], 29/10/2014 21:12:32]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57780 | Re: Pasar una coleccion desde C# a VBA (Resp: 57778) | 30/10/14 07:20 | slzrrz | | |
Buenas:
Muchas gracias por la respuesta. Esta noche había pensado lo mismo: "Si no lo consigo con la colección, voy a devolver una matriz de dos dimensiones."
Muchas gracias otra vez.
Saludos.
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |