martes, 27 de diciembre de 2016

VBA: Importar Table HTML desde Web a Excel

Tiempo atrás publiqué una forma de interactuar con formularios de páginas Web (ver).
Relacionado con este post y sobre todo con el del día anterior, donde necesitamos recuperar datos en una Table (de HTML) de una Web y llevarlos a nuestra hoja de Excel, expongo el siguiente artículo.


Es importante identificar en el código fuente de la Web el nombre o Id de la 'Table'.
Si accedemos a la Web en cuestión del ejemplo:
http://es.investing.com/indices/spain-35-components
y desde la Table presionamos botón derecho y Inspeccionar elemento, veremos el Id buscado:



En nuestro ejemplo la Table se identifica con el Id:"cr1", y así nos referiremos en el código de nuestra macro.

A continuación añadimos rótulos a nuestro encabezado en la hoja 'IBEX35', e incorporamos en la ventana de código de nuestro módulo incluimos el siguiente procedimiento:

Sub ImportarTableHTML_a_Excel()
'Tener REFERENCIA ACTIVA Microsoft Internet Controls !!!

Dim IE As Object
Dim fila As Integer, col As Integer
Dim elemCollection As Object, curHTMLRow As Object

Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate ("http://es.investing.com/indices/spain-35-components")
 
'nos aseguramos que la web se ha descargado completamente
While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    DoEvents
Wend

'Limpiamos el rango destino de nuestra hoja de calculo
ThisWorkbook.Sheets("IBEX35").Activate
Range("A2:I36").ClearContents

'identificamos la Table, mediante su Id, para cargarla
Set elemCollection = IE.Document.getElementById("cr1")

' Rows(0) sería el título de la tabla, por eso lo saltamos
'(Ya tenemos nuestros rótulos)
'ahora recorremos todas las filas y columnas de la Table en HTML
For fila = 1 To elemCollection.Rows.Length - 1
    Set curHTMLRow = elemCollection.Rows(fila)
    For col = 0 To curHTMLRow.Cells.Length - 1
        'llevamos los datos a nuestra hoja de cálculo
        Set celda = Sheets("IBEX35").Cells(fila + 1, col + 1)
        celda.Value = "'" & curHTMLRow.Cells(col).InnerText
        'tratamos los valores numéricos como número...
        If IsNumeric(celda) Then celda.Value = Replace(celda.Value, ",", ".")
    Next col
Next fila

'Cerramos Internet Explorer
IE.Quit
'y limpiamos memoria
Set IE = Nothing
Set curHTMLRow = Nothing
Set celda = Nothing
End Sub



Al lanzar la macro el resultado es:

VBA: Importar Table HTML desde Web a Excel



Debemos tener mucha precaución, ya que la carga se realiza, según la Web, intercambiando los separadores decimales!!!.
En el código de más arriba se le da un tratamiento para que los números sean almacenados como números, empleando nuestro sistema de separadores.

2 comentarios:

  1. Como siempre!, un excelente lugar para conseguir recursos para excel!, yo utilicé esta información para extraer el precio de varios productos en la misma pagina con URL de productos variables, útil para comparar con mi Ecommerce sin la necesidad de ir producto por producto extrayendo los precios.

    Siempre uso la info de esta blog pero nunca había escrito nada... quiero agradecerle a Ismael por toda la excelente información que nos ha aportado!

    ResponderEliminar
    Respuestas
    1. ;-)
      Muchas gracias a tí por tu comentario y por seguirme!!
      Un saludo!

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.