Imprimir página | Cerrar ventana

Localizar Excel y leer datos

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84712
Fecha de impresión: 26/Marzo/2026 a las 17:41


Tema: Localizar Excel y leer datos
Publicado por: xavi
Asunto: Localizar Excel y leer datos
Fecha de publicación: 19/Septiembre/2019 a las 17:20
Buenas tardes,

Miro de poneros en situación.

Desde una aplicación Access debe poder localizarse 2 ficheros Excel que, teóricamente, están abiertos en la misma máquina. Si no estuvieran abiertos ya mandaríamos el correspondiente mensaje de error.

Una vez si si están abiertos, necesito recuperar el valor de una serie de celdas (las tengo mapeadas). 

Hàndicap: el nombre del fichero podría no ser siempre igual. Sería parecido pero con posibilidad de pequeños cambios. Más que nada que el propietario del fichero "versiona" en el nombre del fichero (lo que no critico ya que yo también lo he hecho)

He encontrado algunos códigos para localizar el handle de la primera ventana que contenga un determinado texto:
Option Compare Database
Option Explicit

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" (ByVal Hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "User32" Alias "GetWindowTextLengthA" (ByVal Hwnd As Long) As Long

Private Const GW_HWNDNEXT = 2

Private Type udtHandle
    Hwnd        As Long
    WindowCaption   As String
End Type
Dim uHandle As udtHandle






Public Function TestFind(strQueBuscamos As String)

    Dim lhWndP As Long
    If GetHandleFromPartialCaption(lhWndP, strQueBuscamos) = True Then
        MsgBox uHandle.Hwnd & " - " & uHandle.WindowCaption
    End If

End Function

Private Function GetHandleFromPartialCaption(ByRef lWnd As Long, ByVal sCaption As String) As Boolean

    Dim lhWndP As Long
    Dim sStr As String
    GetHandleFromPartialCaption = False
    lhWndP = FindWindow(vbNullString, vbNullString) 'PARENT WINDOW
    Do While lhWndP <> 0
        sStr = String(GetWindowTextLength(lhWndP) + 1, Chr$(0))
        GetWindowText lhWndP, sStr, Len(sStr)
        sStr = Left$(sStr, Len(sStr) - 1)
        If InStr(1, sStr, sCaption) > 0 Then
            GetHandleFromPartialCaption = True
            lWnd = lhWndP
            Exit Do
        End If
        lhWndP = GetWindow(lhWndP, GW_HWNDNEXT)
    Loop
    uHandle.Hwnd = lWnd
    uHandle.WindowCaption = sStr
End Function

Con eso puedo encontrar el handle de la ventana que busco. ¿Y después que?

Si algo no se entiende no dudéis en preguntar.

Gracias de antemano


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web



Respuestas:
Publicado por: Erick Gamer
Fecha de publicación: 19/Septiembre/2019 a las 19:03
Pues hice algo parecido en .NET con una aplicación externa JAVA.
Busco la ventana del JAVA y la activo, una vez activa y como no tengo el nombre de los controles del JAVA uso las coordenadas de ellos para mandar parametros y pulsaciones de teclas (SendKeys) uso TAB para cambiar entre pantalla de mi Aplicación a JAVA.

A lo que voy es si ya encontro la ventana de Excel entonces activarla y luego extraer la informacion que necesita, enviando parametros o SendKeys.

Para vba encontre esto realmente no se si te sirva de algo, espero y si Xavi.

https://myengineeringworld.net/2011/11/handle-other-applications-through-excel.html" rel="nofollow - https://myengineeringworld.net/2011/11/handle-other-applications-through-excel.html
https://stackoverflow.com/questions/41511615/how-to-get-windows-application-process-mainwindowtitle-and-window-status-propert" rel="nofollow - https://stackoverflow.com/questions/41511615/how-to-get-windows-application-process-mainwindowtitle-and-window-status-propert

Erick Gamer


-------------
Aprendiz de todos, maestro de nadie.


Publicado por: pitxiku
Fecha de publicación: 19/Septiembre/2019 a las 19:22
Otra posibilidad es usar GetObject para instanciar la aplicación Excel que este abierta. Y a partir de ahí, trabajas igual que con una instancia abierta con CreateObject:

- https://docs.microsoft.com/es-es/office/vba/language/reference/user-interface-help/getobject-function


Publicado por: guarracuco
Fecha de publicación: 19/Septiembre/2019 a las 19:38
Y si tienes código en esos archivos que exporten la información a un archivo txt?


Publicado por: happy
Fecha de publicación: 19/Septiembre/2019 a las 23:26
Hola Xavi, ahora no estoy seguro de si la opción que te comenta pitxiku del GetObject te podría servir. Creo que necesitarías saber la ruta absoluta del libro excel para poder referenciarlo (si no recuerdo mal ...) y creo que con las rutinas para encontrar el handle no lo consigues, ni lo podrás conseguir.

Pero he encontrado un código por ahí que creo que te podría servir. Ponlo en un módulo estandar:

' función para obtener un objeto COM desde un handle
Private Declare Function AccessibleObjectFromWindow Lib "OLEACC.DLL" _
                        (ByVal Hwnd As Long, _
                        ByVal dwId As Long, _
                        riid As GUID, _
                        ppvObject As Any) As Long
                   
' función extendida del API FindWindow
Private Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" _
                        (ByVal hWnd1 As Long, _
                        ByVal hWnd2 As Long, _
                        ByVal lpsz1 As String, _
                        ByVal lpsz2 As String) As Long
                        
' función para crear un GUID desde una "cadena" GUID
Private Declare Function IIDFromString Lib "ole32" _
                         (ByVal lpsz As Long, _
                         ByRef lpiid As GUID) As Long
                        
Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type

Private Const S_OK As Long = &H0
' GUID del objeto COM para Excel
Private Const IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"
Private Const OBJID_NATIVEOM As Long = &HFFFFFFF0

Function GetXLapp(hWinXL As Long, xlApp As Object) As Boolean
Dim hWinDesk As Long, hWin7 As Long
Dim obj As Object
Dim iid As GUID
    
    ' obtenemos un GUID en variable iid según la cadena IID_IDispatch
    Call IIDFromString(StrPtr(IID_IDispatch), iid)
    ' obtenemos la ventana XLDESK de la ventana principal de Excel
    hWinDesk = FindWindowEx(hWinXL, 0&, "XLDESK", vbNullString)
    ' obtenemos la ventana contenedora del Workbook
    hWin7 = FindWindowEx(hWinDesk, 0&, "EXCEL7", vbNullString)
    ' obtenemos el objeto COM del Workbook en la variable obj
    If AccessibleObjectFromWindow(hWin7, OBJID_NATIVEOM, iid, obj) = S_OK Then
        ' devolvemos el objeto Application del Workbook
        Set xlApp = obj.Application
        GetXLapp = True
    End If
    
End Function

Para utilizar esta función deberás llamarla de la siguiente manera (tomando la variable Hwnd que ponías en el código que exponías antes):

        If GetXLapp(uHandle.Hwnd, xlApp) = True Then
            ' si llegamos aquí es que xlApp contiene un objeto
            ' Excel.Application del Excel que te interesa
        End If

Espero que te sirva 

(Edito para poner algunos comentarios que expliquen qué hace ese código)


-------------
Saludos,

Juan M. Afan de Ribera


Publicado por: prga
Fecha de publicación: 20/Septiembre/2019 a las 00:15
Hola.
Sí he entendido bien, con este código, aparentemente más sencillo, se puede "llegar" a los excel abiertos:

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Long) As Long

Public Sub Detectaexcel()
Dim hWnd As Long
Dim miexcel As Excel.Application
Dim milibro As Excel.Workbook
    hWnd = FindWindow("XLMAIN", 0)
    
    If hWnd = 0 Then    ' 0 quiere decir que Excel no se está ejecutando .
        
        MsgBox ("NO ESTÁ EXCEL ABIERTO")
        
        Exit Sub
    Else
    
     Set miexcel = GetObject(, "excel.application")
     For Each milibro In miexcel.Workbooks
      MsgBox (milibro.FullName)
     Next
     'miexcel.Quit
     Set miexcel = Nothing

    End If
End Sub

Espero que ayude a resolver la duda.
Un saludo a todos


Publicado por: happy
Fecha de publicación: 20/Septiembre/2019 a las 09:43
Hola,

no se si esto pasa en todas las versiones diferentes de Excel o no, pero al menos con la versión 2013, que es la que tengo yo instalada, puedes tener más de una instancia de Excel abierta. Es decir, el código que ha expuesto prga es válido, pero sólo referenciará la primera instancia de Excel que tenga el sistema en ese momento y por tanto sólo accederá a los workbooks abiertos que cuelguen de esa instancia. 

Por ejemplo, y ya digo, al menos con esta versión 2013 que tengo yo, si voy al explorador de archivos y abro un libro excel, y después otro y después otro, esos 3 libros excel colgarán de la misma instancia de la aplicación. En ese caso el código con GetObject funcionará bien. Pero si al mismo tiempo abro simplemente el programa excel y desde ahí abro otro libro, se creará una segunda instancia de la aplicación. En ese momento, el GetObject ya no servirá, porque cuando lo ejecute volverá a localizar la primera instancia que haya abierto. No tengo manera, que yo sepa, de decirle que abra la segunda instancia de Excel, que es a lo mejor, la que contiene el excel que me interesa manipular. Ahí ya necesitaría indicarle en el primer parámetro la ruta absoluta del excel al que quiero acceder.

Smile


-------------
Saludos,

Juan M. Afan de Ribera


Publicado por: Mihura
Fecha de publicación: 20/Septiembre/2019 a las 10:05
Desde la ignorancia de un novillo que está aprendiendo .... Big smile

¿ No hay alguna manera de recorrer todos los programas que están abiertos en windows e ir analizando uno por uno su nombre / tipo / .. ?       me suena haberlo visto por algún sitio.


Yo uso 2010 y también puedes tener distintas instancias de Excel, es más yo los abro así porque me es más cómodo.








-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: pitxiku
Fecha de publicación: 20/Septiembre/2019 a las 11:06
Puedes usar EnumWindows para recuperar los hWnd de las ventanas abiertas, y a partir de ahí comprobar cuál es de Excel:

- https://renenyffenegger.ch/notes/development/languages/VBA/Win-API/examples/EnumWindows

(Creo que en AllApi había otro ejemplo, pero ya no está online )

En el ejemplo usan 2 apis para sacar el título de la ventana y su clase. Lo que no sé es si con eso se puede tomar la instancia de Excel y comprobar qué documentos tiene cargados.


Publicado por: happy
Fecha de publicación: 20/Septiembre/2019 a las 11:32
En realidad lo que conseguirá Xavi con EnumWindows es lo mismo que obtiene con el código que expone en su primer mensaje, sólo que con un bucle y utilizando GetWindow (a lo mejor EnumWindows es una encapsulación de ese otro método en bucle o algo similar).

El problema que tiene Xavi es, una vez localizado el handle de la ventana Excel que contiene el libro de trabajo que le interesa (del cual comenta que puede incluso variar el nombre), cómo obtener una instancia del objeto COM o de automatización para esa instancia de Excel y así poder manejar con automatización el workbook, los worksheets que contenga, celdas, rangos, etc. El código que he expuesto obtiene el objeto COM de la instancia Excel indicada utilizando únicamente el handle (identificador de ventana) de la ventana principal (XLMAIN) de esa instancia Excel.

Muchas de estas cosas las han resuelto con la plataforma .NET en donde, por lo que he visto, en vez de utilizar directamente APIs de Windows, han encapsulado estos métodos o pequeños procesos (igual al que estamos tratando aquí) en clases y objetos, de modo que el programador no tenga que lidiar con todos estos problemas. Que yo sepa, la mayoría de estas funciones típicas del API de Windows están escritas en C de los primeros tiempos. PUede que algunas las hayan actualizado un poco para adecuarlas, primero a 32 y luego a 64 bits, pero básicamente hacen lo mismo y tienen las mismas dificultades para el programador de VB (me refiero sobre todo al paso de argumentos a esas funciones y a los tipos de variables a utilizar para ello, así como - importante! - la manera de pasar ByVal o ByRef esas variables o valores a las funciones del API) Wink


-------------
Saludos,

Juan M. Afan de Ribera


Publicado por: xavi
Fecha de publicación: 20/Septiembre/2019 a las 14:14
Buenas. Por alusiones, jejejeje

El primer código de pitxiku con el nombre completo (ahí el "problema") funciona OK.

Probaré el codigo de Happy a ver si me permite acotar más. 

De todas formas también le puedo decir al cliente (el que ya sabeis...) que, o me pone la ruta completa y el mismo nombre siempre o el sistema no funciona. Bastaría con evaluar el WindowCaption de mi primer código para ver que coincida con el esperado.

Os mantengo informados.

Muchas gracias a todos por las aportaciones



-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: pitxiku
Fecha de publicación: 20/Septiembre/2019 a las 16:55
Por partes:

- Mihura preguntó por un código para recorrer las ventanas, por eso hablé del EnumWindows. Otra cosa es que para este caso no sirva de mucho.

- Con el código de prga se obtiene la instancia de Excel abierta. Una vez tenemos la instancia, podemos recorrer los libros abiertos y comprobar si algo (nombre de hoja, de libro, valor en una celda,... ) coincide con un estándar dado por el cliente para que sea ese el libro a tratar.

- Lo que no consigo es abrir 2 instancias de Excel. Me explico: abro una con una hoja en blanco, abro un libro directamente, vuelvo a abrir otro Excel desde el menú con otra hoja en blanco ... Y lo que ocurre es que la primera instancia de Excel, pillada con el GetObject, incrementa el número de libros abiertos en su colección WorkBooks.


Publicado por: Emilio
Fecha de publicación: 20/Septiembre/2019 a las 17:22
Buenas, 

Pitxiku, para abrir dos instancias de Excel has de abrir Excel desde "su icono" en W10 puedes pulsar con el botón derecho del ratón sobre el botón de la instancia abierta y seleccionar Microsoft Excel.
Si abres un libro Excel directamente siempre (que la haya) se abrirá en la instancia abierta.


-------------
Saludos a todos desde Huelva

http://www.mvp-access.es/emilio/" rel="nofollow - http://www.mvp-access.es/emilio/


Publicado por: Mihura
Fecha de publicación: 20/Septiembre/2019 a las 17:39
https://support.microsoft.com/es-es/help/2551928" rel="nofollow - Abrir Excel en ventanas distintas

-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: prga
Fecha de publicación: 20/Septiembre/2019 a las 18:52
A partir de no se que versión de oficce, sólo se pueden abrir 2 o más instancias de excel o word por código (createobject).
Utilizando directamente el excel, al menos yo, no he podido conseguir dos instancias diferentes del excel 2019, incluso si se abre con shell o followhyperlink. Eso sí, se crean 2 ventanas diferentes, pero una sola instancia


Publicado por: Emilio
Fecha de publicación: 20/Septiembre/2019 a las 19:16
Hola de nuevo, Pedro, acabo de hacer una prueba muy simple y o mucho me equivoco o desmiente eso que acabas de indicar.
Sub Prueba()
Dim xls(5) As Variant, i As Long
For i = 0 To 5
   Set xls(i) = CreateObject("Excel.Application")
   xls(i).Visible = True
   xls(i).Workbooks.Add
Next i
End Sub


-------------
Saludos a todos desde Huelva

http://www.mvp-access.es/emilio/" rel="nofollow - http://www.mvp-access.es/emilio/


Publicado por: prga
Fecha de publicación: 20/Septiembre/2019 a las 19:27
He escrito:
sólo se pueden abrir 2 o más instancias de excel o word por código (createobject).
Lo que no he conseguido es hacerlo es sin create object


Publicado por: Emilio
Fecha de publicación: 20/Septiembre/2019 a las 23:00
Vaya, entonces Pedro, te he leído mal. De cualquier modo acabo de abrir 5 instancias seguidas de Excel 2019 desde el botón de la barra de tareas.

-------------
Saludos a todos desde Huelva

http://www.mvp-access.es/emilio/" rel="nofollow - http://www.mvp-access.es/emilio/


Publicado por: prga
Fecha de publicación: 20/Septiembre/2019 a las 23:18
Pero yo diría que son 5 ventanas diferentes pero en una sola instancia de excel.
Si se ejecuta el código que puse, el getobject puede recorrer las 5 ventanas o eso creo


Publicado por: Emilio
Fecha de publicación: 21/Septiembre/2019 a las 07:17
Como sabéis Excel no permite abrir dos libros con el mismo nombre en una misma instancia, mientras que si lo permite en distintas instancias, el modo de abrir mas de una instancia es el que yo decía: botón derecho sobre el botón de la barra de tareas.

-------------
Saludos a todos desde Huelva

http://www.mvp-access.es/emilio/" rel="nofollow - http://www.mvp-access.es/emilio/


Publicado por: happy
Fecha de publicación: 21/Septiembre/2019 a las 10:00
Pero amoave Smile ¿Por qué no haceis la prueba completa en la versión 2019 y así salimos de dudas? Es decir, abrir por separado excel y desde ahí 1 libro excel. Repetir esto (importante volver a abrir por separado excel) varias veces y abrir desde ahí otro libro excel, y luego ejecutar el código:

set obj=getobject(,"excel.application")
for each w in obj.workbooks
    debug.print w.fullname
next

(declarando las variables y todo eso) 

Yo por mi parte insisto. En la versión 2010 y en la 2013 a las que sí tengo acceso, excel abre distintas instancias según la forma en que se abren los libros excel y el código arriba expuesto sólo es capaz de mostrar los libros que estén contenidos en la instancia de excel que se haya abierto en primer lugar

Anda, porfis, haced la prueba y sacadnos de dudas ... Wink


-------------
Saludos,

Juan M. Afan de Ribera


Publicado por: prga
Fecha de publicación: 21/Septiembre/2019 a las 10:16
Window 10 y excel2019
En inicio clik sobre icono excel y en recientes abro un libro, minimizo. Otra vez en inicio click sobre el icono excel y en recientes abro otro libro.
Ejecuto el código y getobject saca los dos libros.


Edito y añado: Con win10 y excel 2016 el comportamiento es el mismo


Publicado por: happy
Fecha de publicación: 21/Septiembre/2019 a las 10:33
No no no no Wink

Si yo hago eso, entonces en las versiones que antes comentaba también me pone los libros dentro de la misma instancia. El método para que hagas las pruebas es el siguiente:

- abrir el programa excel a secas (nada de abrir un libro desde un acceso directo en recientes o algo así, sólo el programa Excel, nada más)
- desde el excel abierto ir al menú Archivo, Abrir (o como aparezca en la versión 2019) y navegar seleccionando algún libro excel que tengas

repetir estas 2 acciones varias veces ... probar el código de antes ... ¿qué pasa? Ermm


-------------
Saludos,

Juan M. Afan de Ribera


Publicado por: prga
Fecha de publicación: 21/Septiembre/2019 a las 10:48
Lo he hecho así con el 2019 y con el 2016, vamos, abro excel, abrir, examinar, busco un libro y abro.
Repito lo mismo y abro otro libro.
 El getobject detecta los 2
Edito y añado: Abro excel y creo un libro nuevo ( ventana con libro1), minimizo. Abro otra vez excel y creo un libro nuevo, crea otra ventana como libro2.
Ejecuto el codigo pero pidiendo en .Name, saca los nombres de libro 1 y libro 2.
Asi es que ????


Publicado por: happy
Fecha de publicación: 21/Septiembre/2019 a las 11:01
Pues según esa prueba, si no hay algo más, parece que el funcionamiento entre versiones es diferente. Creo que Xavi tiene también la 2016 (no así el cliente al que se refiere, que tiene la 2013). A lo mejor podría confirmarlo él.

A lo mejor lo han solucionado con las nuevas versiones, pero en las antiguas, pongamos que trabajas con dos pantallas ..., si tienes 2 libros abiertos y quieres comparar uno con otro (visualmente). ¿Qué haces? Pones un libro en una pantalla y otro libro en la otra pantalla y comparas o copias valores de un lado a otro, o cosas así. Peeeero ... si los dos libros pertenecen a la misma instancia, a la que mueves un libro a una pantalla, el otro le sigue obediente y no hay manera de separarlos en 2, porque están contenidos en el mismo MDI contenedor y se mueven al unísono y también les afectan muchas cosas comunes. Esto a veces puede estar bien, pero otras veces fastidia mucho. Según lo que quieras conseguir, claro. Entonces es cuando te aseguras de abrir "por separado" esos dos libros para poder conseguir así algo de "autonomía".

No se si esto lo han solucionado y aunque dos libros pertenezcan a la misma instancia de Excel, tengan esa "autonomía" uno de otro (a lo mejor pertenecen al mismo "padre", pero NO al mismo MDI (que no se si eso es posible ...)

En fin ...


-------------
Saludos,

Juan M. Afan de Ribera


Publicado por: prga
Fecha de publicación: 21/Septiembre/2019 a las 12:49
Para aclarar un poco la cuestión y como dije en otro post, a partir de alguna versión/actualización de office el comportamiento cambió y no era posible tener dos instancias diferentes del mismo documento word (al menos no supe/se hacerlo), una de escritura/lectura y la segunda de solo lectura en otra pantalla( para consultar diferentes partes del documento como había hecho otra veces). No profundicé más, ya que utilice la opción Vista-nueva ventana(desconocía esa opción) que hace dos clones del documento y permite trabajar en las dos pantallas indistintamente reflejándose los cambios de una en la otra(parece ser un sólo documento con 2 vistas).
Por otra parte, con el 2016 y 2019, puedo tener 2 libros o documentos word diferentes en la misma instancia y colocar uno en la pantalla 1 y el otro en la pantalla 2 y copiar, pegar etc etc desde uno al otro sin aparentes problemas.
Espero que este comentario ayude a alguien.
Saludos 



Publicado por: happy
Fecha de publicación: 21/Septiembre/2019 a las 13:46
A lo mejor lo que comentas podría estar en la configuración de Word o Excel y tocando alguna cosa podría volver a cómo estaba. Aunque leyendo lo que explicas puede que en lo referente a la/s instancia/s hayan arreglado cosas y lo están haciendo de forma diferente. Sinceramente, no lo sé. Como he dicho no tengo esas dos versiones y no conozco los cambios en cuanto a las versiones anteriores Confused

En todo caso, todo esto que estamos discutiendo en este hilo me parece super-interesante de saber. Supongo que como mucha otra gente, yo personalmente, aunque trabajo principalmente con Access y VBA, utilizo mucho la salida de datos hacia Excel (informes estadísticos de todo tipo) y también hacia Word (plantillas de documentos convertibles después en PDF)

Por ejemplo, entre las rutinas que expuso Xavi en su primer post y la que encontré por ahí y que transformé un poco para que sirviera para este hilo, se puede montar un método para hacer lo mismo con instancias de otras aplicaciones que permitan automatización (Word, Access, Acrobat). Sólo hay que modificar los nombres de las ventanas de cada aplicación (en Word creo que se basan en la ventana OpusApp y en Access es OMain) y también el GUID registrado por cada una de ellas. Según el objeto Reference de Access, para estos programas del Office esos guid son:

Access        {4AFFC9A0-5F99-101B-AF4E-00AA003F0F07}
Excel         {00020813-0000-0000-C000-000000000046}
Word          {00020905-0000-0000-C000-000000000046}

En fin creo que es interesante el tema Geek




-------------
Saludos,

Juan M. Afan de Ribera



Imprimir página | Cerrar ventana