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.

11 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
    2. Buenos días Ismael, antes de nada felicitarte por la información. Si no es mucho pedir, te querría hacer una consulta, se podría invertir la tarea.?, me explico, estoy intentando validar todos los campos de una web, pero no consigo cumplimentar los distintos combobox que la Web tiene en su formulario.
      Como podría hacerlo..?
      Gracias

      Eliminar
    3. Hola JuanMa
      quizá este otro post te ayude...
      https://excelforo.blogspot.com/2014/10/vba-rellenando-un-formulario-web-html.html

      si bien ten presente que en ocasiones las web se 'capan' para evitar accesos no deseados de robots...

      Saludos cordiales

      Eliminar
    4. Hola a todos:

      En esta fila (Set elemCollection = IE.Document.getElementById("10"))
      me da el siguiente error: "Error en el método 'Document' de objeto 'IWebBrowser2'".
      La tabla de la página web que estoy importando, al inspeccionar elemento sale solamente esto: table cellmargin="10"

      No encuentro el ID de la tabla, sólo lo que les menciono.
      Saludos.

      Eliminar
    5. Hola
      al indicar
      Set elemCollection = IE.Document.getElementById("10")
      estás buscando un elemento en el código de la web identificado con el Id = 10 de una Table
      Tendrás que buscarlo.. a veces se identifica con otros parámetros de html y en lugar de
      Set elemCollection = IE.Document.getElementById("10")
      hay que buscar por name, etc... (hay varias formas)

      En cualquier caso de alguna forma debe estar identificada...

      Saludos

      Eliminar
    6. Amigo, entonces cómo puedo identificar la tabla? Este es el link, los datos están en el recuadro "SUMARIO":

      http://www.diariooficial.interior.gob.cl/edicionelectronica/empresas_cooperativas.php?date=20-03-2019&edition=42309

      Ese es el link, al inspeccionar elemento, no encuentro donde está...

      Eliminar
    7. Hola
      yo probaría con
      .getElementsByClassName('wrapsection')

      aunque ten presente que en ocasiones no es posible...

      Saludos

      Eliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. alguna idea si la tabla no tiene id?

    ResponderEliminar

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