Páginas

miércoles, 30 de agosto de 2017

VBA Excel: Macro para combinar varios libros de excel en uno solo

Algunas personas me han preguntado como combinar varios libros con el mismo formato en uno solo y en una sola hoja, pero por default Excel no tiene una herramienta para realizarlo, y las soluciones que estan en internet son tan complicadas que hasta requieren que el usuario inserte codigo de VBA.

Les propongo una solucion mas sencilla:



1.Descargar el archivo con el programa en este link.

2.Abrirlo y habilitar las macros:




3.Indicar el numero de fila en donde se encuentran los titulos de columna

4.Seleccionar la carpeta donde se encuentran los archivos a combinar


5. Procesar. La macro creara un archivo combinado en la misma carpeta seleccionada al inicio.


6. Compartir esta publicacion jajaja.

Para los interesados en ver el codigo, no lo he protegido asi que con ALT-F11 pueden chequearlo y sugerir/realizar cambios.


viernes, 11 de agosto de 2017

Get Request con VBA Excel: Extrayendo definiciones desde la pagina web de la RAE

Hay algunas formas de extraer información desde una página web, la mas sencilla es por medio de un GET Request, que consiste en enviar una dirección modificada con los parámetros de la búsqueda.


Que pasa cuando hacemos click en el botón buscar de la pagina de búsquedas de la rae:









En el background el explorador envía una cadena de texto al servidor de la pagina, algo así como:






La parte hasta el signo de interrogación es la base para enviar todas las consultas a la pagina:





"w=" y "m=" son los campos del formulario que contienen los valores a consultar, de donde salen?



"w" es el atributo "name" del campo donde llenamos la palabra a buscar






"m" es el valor de la opción "exacta" en la lista desplegable.




Entonces en esta parte de la cadena de texto (o dirección web) que vamos a enviar el servidor, estamos especificando la palabra buscada y el tipo de definición:


http://dle.rae.es/srv/search?w=macro&m=30



Si quisieras buscar otras palabras, solo hay que actualizar el contenido de "w",  hagan la prueba pegándolas en la barra de direcciones y vean la pagina que se les devuelve:


http://dle.rae.es/srv/search?w=productividad&m=30
http://dle.rae.es/srv/search?w=programar&m=30
http://dle.rae.es/srv/search?w=programa&m=30


De ahí en adelante es cuestión de leer la pagina y extraer los datos como ya se ha hecho en estos posts:




El Codigo esta dividido en una subrutina que abre el explorador y pasa las palabras a una función que extrae su definición:


Sub buscar_definicion()
    Dim ie As InternetExplorer
    Set ie = New InternetExplorer
    ie.Visible = False
    ie.Navigate "
http://dle.rae.es/"
   
   
    While ie.readyState <> READYSTATE_COMPLETE
        'Debug.Print ("Esperando carga de pagina")
    Wend
   
    Dim celda_palabra As Range
    Dim palabra As String
    For Each celda_palabra In Range("A2", "A11")
        palabra = celda_palabra.Value
        Debug.Print (palabra)
        celda_palabra.Offset(0, 1).Value = buscar_palabra(ie, palabra)
    Next
End Sub


Function buscar_palabra(ie As InternetExplorer, palabra As String)
    Dim pagina As HTMLDocument
    ie.Navigate "
http://dle.rae.es/srv/search?w=" & palabra & "&m=30"
   
    While ie.readyState <> 4
        Debug.Print ("Descargando pagina")
    Wend
   
    Set pagina = ie.document
   
    'chequea que exista un elemento <p> para comprobar que la pagina haya cargado
   
    Dim elemento_parrafo As HTMLParaElement
   
    While elemento_parrafo Is Nothing
        Set pagina = ie.document
        Set elemento_parrafo = pagina.getElementsByTagName("p")(0)
    Wend
       
   
    'chequea si el elemento p es definicion o no
    Dim parrafo As HTMLParaElement
   
    Set parrafo = pagina.getElementsByClassName("j")(0)
   
    If parrafo Is Nothing Then
        buscar_palabra = "Definicion no encontrada"
        Exit Function
    End If
   
    Dim parcial As Variant
    Dim texto_final As String
    texto_final = ""
    For Each parcial In parrafo.Children
        texto_final = texto_final & parcial.innerHTML & " "
    Next
      
    Debug.Print (texto_final)
    buscar_palabra = texto_final
   
   
End Function