Los foros del Guille

Si no encuentras respuesta, puedes buscar en el sitio del Guille

Google
 

elGuille.hosting: OFERTA Multi Dominio por 40.95 Eur al mes

Selecciona el foro y pulsa en mostrar:     Mostrar 
De tu interés (algunos de los avisos publicados)

14/ene/2006
En la página de inicio se muestra la bandera de tu país, o al menos debería mostrarse si es que tu dirección IP está en mi base de datos. Si no te muestra la bandera, seguramente se mostrará un link para que me digas que IP estás usando y de que país eres... si es así, te agradecería que me lo dijeras.
También puedes poner la imagen de la bandera de tu país en tus mensajes, aquí te explico como.

  Foro: .NET.C# Cantidad:  Desde:   Hasta:    Aplicar   Responder 
Respuestas a: 57774 - Pasar una coleccion desde C# a VBA
IDAsuntoFechaNick 
57774 Pasar una coleccion desde C# a VBA29/10/14 12:06slzrrz   
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
IDAsuntoFechaNick 
57777 Re: Pasar una coleccion desde C# a VBA (Resp: 57774)29/10/14 16:40Pipe[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.
IDAsuntoFechaNick 
57778 Re: Pasar una coleccion desde C# a VBA (Resp: 57774)29/10/14 16:52slzrrz   
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.
IDAsuntoFechaNick 
57779 Re: Pasar una coleccion desde C# a VBA (Resp: 57778)29/10/14 21:12Pipe[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.
IDAsuntoFechaNick 
57780 Re: Pasar una coleccion desde C# a VBA (Resp: 57778)30/10/14 07:20slzrrz   
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.

 
(c) Guillermo 'guille' Som, 2005-2017  - foros.elGuille v1.0.5.3 (23/Mar/2009 14:50 GMT +1)  - (ASP.NET 2.0 v2.0.50727.8762)
 
Usuarios activos: 69 - App. iniciada: 23/09/2017 5:26:12 GMT - La hora GMT del servidor es: 23/09/2017 12:48:37 GMT