• 👏 Bienvenido a nuestra comunidad Excel

    ¿Todavía no estás registrado? 😲

    Registrate gratis aquí y podrás:

    💪 Hacer preguntas a los expertos
    ⬇️ Descargar ejemplos y plantillas
    🏅 
    Acceder a contenidos premium

Metodo Post web

_Tato_

Active member
Hola,

Estoy intentando descargar tablas de páginas webs a excel, he conseguido descargar páginas con el método get, pero ahora lo estoy intentando con post y no soy capaz y no sé que estoy haciendo mal.

La página concreta con la que estoy practicando es la siguiente:

https://registers.esma.europa.eu/publication/searchRegister?core=esma_registers_firds

Estoy atascado en la parte de XMLPage.send porque no sé si estoy poniendo bien los parámetros para acceder a la web y poder descargar la información.

¿Alguien me puede ayudar? Si necesitaseis más explicación o aclaración, por favor, avisadme.

Gracias por adelantado por vuestro tiempo!!!

Un saludo,
 

eavjperu

Active member
Usas una variable y le asignas distintos valores, aunque ese no es el gran dilema. Sugiero enviar por aquí un ejemplo de la cadena tal como la necesitas, es decir, tal como crees debe ser, no uses variables, viéndola será más fácil entenderte pues, tal cual en la macro, creo que hay varias cosas que has confundido.

Abraham Valencia
https://abrahamexcel.blogspot.com/
Lima, Perú
 

_Tato_

Active member
Usas una variable y le asignas distintos valores, aunque ese no es el gran dilema. Sugiero enviar por aquí un ejemplo de la cadena tal como la necesitas, es decir, tal como crees debe ser, no uses variables, viéndola será más fácil entenderte pues, tal cual en la macro, creo que hay varias cosas que has confundido.

Abraham Valencia
https://abrahamexcel.blogspot.com/
Lima, Perú
Hola Abraham,

Disculpame si me explico mal, pero es que conozco muy poco de este "mundo" y la verdad que no lo estoy entediendo bien, el tema del código veo que está repetida la URL porque se me olvidó comentar una y también puse la variable valor, para utilizarla en el futuro, pero al no salir, por evitar focos de error, puse ese valor a mano.

Necesito extraer datos como si hiciera la busqueda manual de la forma que adjunto la imagen, pero no logro saber cuál es el código en el XMLPage.send, que intuyo que está mal (y puede que algo más).

Por favor, si necesitas saber algo más, dímelo. Agradezco por adelantado tu tiempo para ayudarme.

Un saludo,

1592199128348.png
 

eavjperu

Active member
Dado tu caso, creo que te conviene más usar el objeto Internet Explorer. Prueba así:

Código:
Sub tablaenWeb()

Dim ie As Object
Dim htmTable As HTMLTable
Dim doc As HTMLDocument
Dim nFilas As Integer, nColumnas As Integer, x As Integer, y As Integer

Set ie = CreateObject("InternetExplorer.Application")

ie.navigate "https://registers.esma.europa.eu/publication/searchRegister?core=esma_registers_firds"
Do: DoEvents: Loop Until ie.readyState = 4

ie.Visible = True
ie.document.getElementsByName("isin")(0).Value = "ES0113900J37"
ie.document.getElementById("searchSolrButton").Click

Application.Wait (Now + TimeValue("00:00:01"))

ie.document.getElementById("tablePageSize").selectedIndex = 3
ie.document.getElementById("searchSolrButton").Click

Application.Wait (Now + TimeValue("00:00:01"))

Set doc = ie.document
Set htmTable = doc.getElementsByTagName("Table")(0)
Let nFilas = htmTable.Rows.Length
Let nColumnas = htmTable.Rows(0).Cells.Length

For x = 1 To nFilas
     For y = 1 To nColumnas
         Cells(x, y).Value = htmTable.Rows(x - 1).Cells(y - 1).innerText
     Next y
Next x

Set ie = Nothing: Set doc = Nothing: Set htmTable = Nothing

End Sub


Obvio ahí estoy usando solo un valor, pero se entenderá cuando veas el resultado.

Abraham Valencia
https://abrahamexcel.blogspot.com/
Lima, Perú
 

_Tato_

Active member
Dado tu caso, creo que te conviene más usar el objeto Internet Explorer. Prueba así:

Código:
Sub tablaenWeb()

Dim ie As Object
Dim htmTable As HTMLTable
Dim doc As HTMLDocument
Dim nFilas As Integer, nColumnas As Integer, x As Integer, y As Integer

Set ie = CreateObject("InternetExplorer.Application")

ie.navigate "https://registers.esma.europa.eu/publication/searchRegister?core=esma_registers_firds"
Do: DoEvents: Loop Until ie.readyState = 4

ie.Visible = True
ie.document.getElementsByName("isin")(0).Value = "ES0113900J37"
ie.document.getElementById("searchSolrButton").Click

Application.Wait (Now + TimeValue("00:00:01"))

ie.document.getElementById("tablePageSize").selectedIndex = 3
ie.document.getElementById("searchSolrButton").Click

Application.Wait (Now + TimeValue("00:00:01"))

Set doc = ie.document
Set htmTable = doc.getElementsByTagName("Table")(0)
Let nFilas = htmTable.Rows.Length
Let nColumnas = htmTable.Rows(0).Cells.Length

For x = 1 To nFilas
     For y = 1 To nColumnas
         Cells(x, y).Value = htmTable.Rows(x - 1).Cells(y - 1).innerText
     Next y
Next x

Set ie = Nothing: Set doc = Nothing: Set htmTable = Nothing

End Sub


Obvio ahí estoy usando solo un valor, pero se entenderá cuando veas el resultado.

Abraham Valencia
https://abrahamexcel.blogspot.com/
Lima, Perú
Está perfecto, voy a leerlo detenidamente para tratar de entenderlo. Mil gracias!!!
 

_Tato_

Active member
Retomo este tema @eavjperu por si me pudieras/pudierais ayudar.

Estoy intentando sacar la tabla de la web https://www.morningstar.es/es/scree...e={}&page=1&sortField=legalName&sortOrder=asc y tengo varios problemas:

1.- En el código que adjunto (parte de él por no extenderlo sin que influya), a veces me salen los resultados de la tabla y a a veces me da error en el tiempo de ejecución sin cambiar la URL, ¿puede ser por qué al entrar la página haya un momento en el que carga la web? ¿Cómo se podría solucionar?

Sub Datos()

Dim ie As Object
Dim htmTable As HTMLTable
Dim htmTables As HTMLElementCollection
Dim doc As HTMLDocument
Dim nFilas As Integer, nColumnas As Integer, x As Integer, y As Integer


Set ie = CreateObject("InternetExplorer.Application")

ie.navigate "https://www.morningstar.es/es/screener/fund.aspx#?filtersSelectedValue={"term":"" & ISIN & "%22%7D&page=1&sortField=legalName&sortOrder=asc"
Do: DoEvents: Loop Until ie.readyState = 4

ie.Visible = False
Application.Wait (Now + TimeValue("00:00:30"))


Set doc = ie.document
Set htmTable = doc.getElementsByTagName("table")(0)
nFilas = htmTable.Rows.Length
nColumnas = htmTable.Rows(0).Cells.Length
'nFilas = 2
'nColumnas = 9

Sheets("Cartera").Select

z = 1 + Sheets("Cartera").Range("B" & Rows.Count).End(xlUp).Row
For x = 2 To nFilas
For y = 1 To nColumnas
If z > 1 And y = 3 Then
'vl = htmTable.Rows(x - 1).Cells(y - 1).innerText
Cells(z, y).Value = Replace(htmTable.Rows(x - 1).Cells(y - 1).innerText, " EUR", "")
Else
Cells(z, y).Value = htmTable.Rows(x - 1).Cells(y - 1).innerText
End If
Next y
Next x

Set ie = Nothing: Set doc = Nothing: Set htmTable = Nothing

End Sub

2.- Cuando intento sacar la tabla con todos los fondos, no soy capaz de poner la tabla correcta. Yo he intentando con:

Set doc = ie.document
Set htmTable = doc.getElementsByTagName("table")(0)
nFilas = htmTable.Rows.Length
nColumnas = htmTable.Rows(0).Cells.Length
'nFilas = 2
'nColumnas = 9

¿Me podrías indicar cómo puedo averiguar la tabla de la que es? Intenté buscando por ClassName pero me salía vacío

Gracias por tu tiempo Abraham!!!

Un saludo,
 

_Tato_

Active member
Retomo este tema @eavjperu por si me pudieras/pudierais ayudar.

Estoy intentando sacar la tabla de la web https://www.morningstar.es/es/screener/fund.aspx#?filtersSelectedValue={}&page=1&sortField=legalName&sortOrder=asc y tengo varios problemas:

1.- En el código que adjunto (parte de él por no extenderlo sin que influya), a veces me salen los resultados de la tabla y a a veces me da error en el tiempo de ejecución sin cambiar la URL, ¿puede ser por qué al entrar la página haya un momento en el que carga la web? ¿Cómo se podría solucionar?

Sub Datos()

Dim ie As Object
Dim htmTable As HTMLTable
Dim htmTables As HTMLElementCollection
Dim doc As HTMLDocument
Dim nFilas As Integer, nColumnas As Integer, x As Integer, y As Integer


Set ie = CreateObject("InternetExplorer.Application")

ie.navigate "https://www.morningstar.es/es/screener/fund.aspx#?filtersSelectedValue={"term":"" & ISIN & "%22%7D&page=1&sortField=legalName&sortOrder=asc"
Do: DoEvents: Loop Until ie.readyState = 4

ie.Visible = False
Application.Wait (Now + TimeValue("00:00:30"))


Set doc = ie.document
Set htmTable = doc.getElementsByTagName("table")(0)
nFilas = htmTable.Rows.Length
nColumnas = htmTable.Rows(0).Cells.Length
'nFilas = 2
'nColumnas = 9

Sheets("Cartera").Select

z = 1 + Sheets("Cartera").Range("B" & Rows.Count).End(xlUp).Row
For x = 2 To nFilas
For y = 1 To nColumnas
If z > 1 And y = 3 Then
'vl = htmTable.Rows(x - 1).Cells(y - 1).innerText
Cells(z, y).Value = Replace(htmTable.Rows(x - 1).Cells(y - 1).innerText, " EUR", "")
Else
Cells(z, y).Value = htmTable.Rows(x - 1).Cells(y - 1).innerText
End If
Next y
Next x

Set ie = Nothing: Set doc = Nothing: Set htmTable = Nothing

End Sub

2.- Cuando intento sacar la tabla con todos los fondos, no soy capaz de poner la tabla correcta. Yo he intentando con:

Set doc = ie.document
Set htmTable = doc.getElementsByTagName("table")(0)
nFilas = htmTable.Rows.Length
nColumnas = htmTable.Rows(0).Cells.Length
'nFilas = 2
'nColumnas = 9

¿Me podrías indicar cómo puedo averiguar la tabla de la que es? Intenté buscando por ClassName pero me salía vacío

Gracias por tu tiempo Abraham!!!

Un saludo,
@eavjperu, disculpa que te vuelva a molestar, pero no sé si me puedes guiar con el problema que tengo, estoy estancado, llevo unos días intentando pero no consigo avanzar, ¿me puedes recomendar donde podría investigar más (miré tu blog, pero no encuentro forma, puede que por mi desconocimiento en la materia) para intentar dar con la solución?

Gracias de antemano y perdona si molesto con la insistencia.

Un saludo,
 

eavjperu

Active member
Hola, el ideal es abrir nuevos post para nuevos temas. Pásame un enlace exacto de la web de la que quieres extraer datos y explícame como los obtienes cuando entras a la web. Ojo, cuando entras, no cómo lo quieres hacer con VBA. Ah, repito, el enlace exacto, no con variable como tu macro.

Abraham Valencia
https://abrahamexcel.blogspot.com/
Lima, Perú
 

_Tato_

Active member
Hola, el ideal es abrir nuevos post para nuevos temas. Pásame un enlace exacto de la web de la que quieres extraer datos y explícame como los obtienes cuando entras a la web. Ojo, cuando entras, no cómo lo quieres hacer con VBA. Ah, repito, el enlace exacto, no con variable como tu macro.

Abraham Valencia
https://abrahamexcel.blogspot.com/
Lima, Perú
La dirección de la web es:https://www.morningstar.es/es/scree...e={}&page=1&sortField=legalName&sortOrder=asc

Y hago busquedas por ISIN o nombre:

1596043437744.png

También me gustaría sacarme todos los datos de la tabla, según se entra en el enlace, carga todos los resultados, cuando rellenas la imagen que he puesto anteriormente es cuando filtra al elegido.

Espero haberme explicado bien.

Muchas gracias por tu ayuda!!!

Un saludo,
 

_Tato_

Active member
Hola, el ideal es abrir nuevos post para nuevos temas. Pásame un enlace exacto de la web de la que quieres extraer datos y explícame como los obtienes cuando entras a la web. Ojo, cuando entras, no cómo lo quieres hacer con VBA. Ah, repito, el enlace exacto, no con variable como tu macro.

Abraham Valencia
https://abrahamexcel.blogspot.com/
Lima, Perú
Tomo nota para sucesivas consultas abrir un post nuevo.
 

eavjperu

Active member
Hola, era cuestión de paciencia explicitada con un "wait" jejeje. Ojo, sería más rápido hacerlo con Post y/o Get, pero requiere tiempo y revisar varias cosas de esa web y eso, al menos en mi caso, va más allá del tiempo que doy para ayudar en el foro, pero igual recomiendo leer sobre dicho temas.

Para tu caso vale así con el objeto Internet Explorer:

Código:
Sub tablaenWeb()

Dim ie As Object
Dim htmTable As HTMLTable
Dim doc As HTMLDocument
Dim nFilas As Integer, nColumnas As Integer, x As Integer, y As Integer

Set ie = CreateObject("InternetExplorer.Application")

ie.navigate "https://www.morningstar.es/es/screener/fund.aspx#?filtersSelectedValue={"term":"ES0156304000"}&page=1&sortField=legalName&sortOrder=asc"
Do: DoEvents: Loop Until ie.readyState = 4

ie.Visible = True

Application.Wait (Now + TimeValue("00:00:10"))

Set doc = ie.document
Set htmTable = doc.getElementsByTagName("Table")(0)
Let nFilas = htmTable.Rows.Length
Let nColumnas = htmTable.Rows(0).Cells.Length

For x = 1 To nFilas + 1
     For y = 1 To nColumnas
         Cells(x, y).Value = htmTable.Rows(x - 1).Cells(y - 1).innerText
     Next y
Next x

Set ie = Nothing: Set doc = Nothing: Set htmTable = Nothing

End Sub


Mira bien en dónde puse el código y has como creo habías intentado, o sea, reemplazarlo por una variable.

Saludos

Código:
"https://www.morningstar.es/es/screener/fund.aspx#?filtersSelectedValue=%7B%22term%22:%22ES0156304000%22%7D&page=1&sortField=legalName&sortOrder=asc"
Abraham Valencia
https://abrahamexcel.blogspot.com/
Lima, Perú
 
Última edición:

_Tato_

Active member
Hola, era cuestión de paciencia explicitada con un "wait" jejeje. Ojo, sería más rápido hacerlo con Post y/o Get, pero requiere tiempo y revisar varias cosas de esa web y eso, al menos en mi caso, va más allá del tiempo que doy para ayudar en el foro, pero igual recomiendo leer sobre dicho temas.

Para tu caso vale así con el objeto Internet Explorer:

Código:
Sub tablaenWeb()

Dim ie As Object
Dim htmTable As HTMLTable
Dim doc As HTMLDocument
Dim nFilas As Integer, nColumnas As Integer, x As Integer, y As Integer

Set ie = CreateObject("InternetExplorer.Application")

ie.navigate "https://www.morningstar.es/es/screener/fund.aspx#?filtersSelectedValue={"term":"ES0156304000"}&page=1&sortField=legalName&sortOrder=asc"
Do: DoEvents: Loop Until ie.readyState = 4

ie.Visible = True

Application.Wait (Now + TimeValue("00:00:10"))

Set doc = ie.document
Set htmTable = doc.getElementsByTagName("Table")(0)
Let nFilas = htmTable.Rows.Length
Let nColumnas = htmTable.Rows(0).Cells.Length

For x = 1 To nFilas + 1
     For y = 1 To nColumnas
         Cells(x, y).Value = htmTable.Rows(x - 1).Cells(y - 1).innerText
     Next y
Next x

Set ie = Nothing: Set doc = Nothing: Set htmTable = Nothing

End Sub


Mira bien en dónde puse el código y has como creo habías intentado, o sea, reemplazarlo por una variable.

Saludos

Código:
"https://www.morningstar.es/es/screener/fund.aspx#?filtersSelectedValue=%7B%22term%22:%22ES0156304000%22%7D&page=1&sortField=legalName&sortOrder=asc"
Abraham Valencia
https://abrahamexcel.blogspot.com/
Lima, Perú
Muchas gracias por tu respuesta y tu tiempo!!! Leeré como me recomiendas sobre el método Post y Get!!! Y sobre todo, tendré más paciencia jajaja

Un saludo,
 
Arriba