Hola a todos:
Hace unos días me enviaban una consulta sobre cómo podían enviar a través de Excel datos para introducir valores en un formulario web. Aunque la respuesta ya la adelanté en esta web me ha parecido interesante publicarla en una entrada.
Para poder realizar el trabajo debemos usar VBA y para ello es necesario que tengamos en cuenta algunos aspectos de la página web en cuestión y los elementos que vamos a necesitar para poder realizar la consulta.
Como ejemplo voy a utilizar mi web, de manera que mediante código sea capaz de ingresar en su cuadro de búsqueda un valor, por ejemplo: «API» y que realice la búsqueda. Es decir, que sea capaz de enviar datos a una web, la mía, y a un cuadro de texto (parecido a un formulario) y generar la búsqueda.
Para ello, vamos a utilizar la siguiente macro:
Sub CARGAR_DATOS_WEB()
Dim IE As Object
Application.ScreenUpdating = False
'Creamos objeto internet explorer
Set IE = CreateObject("InternetExplorer.Application")
'abrimos web
IE.navigate "https://excelsignum.com/"
'esperamos a que se carguen todos los elementos
Do Until IE.ReadyState = 4
DoEvents
Loop
'si necesitamos más tiempo lo podemos configurar aquí
Application.Wait (Now + TimeValue("0:00:01"))
'localizamos el ID que hace referencia al cuadro de búsqueda
'esto lo hacemos buscando en el código HTML de la página web
'e igualamos el valor de la celda para realizar la búsqueda
IE.document.getElementById("s").Value = "API" '
'también buscamos ID correspondiente al botón para buscar el valor
IE.document.getElementById("searchsubmit").Click
'hacemos visible la web.
IE.Visible = True
Set IE = Nothing
Application.ScreenUpdating = True
End Sub
Como podéis observar, es de gran importancia que seamos capaces de identificar los ID´s de cada uno de los elementos, es decir, del buscador y del botón para realizar la búsqueda.
Esto lo podemos hacer de varias formas, o bien rastreamos el código HTML de toda la web o bien nos posicionamos encima del buscador y pulsamos botón derecho:
y se abrirá la ventana de inspección con el ID o Name que necesitamos:
Como podéis ver Para el buscador el ID es «s» y para el botón de búsqueda el procedimiento será idéntico.
Una vez que tenemos los ID´s ya podemos introducirlos en la macro y ejecutarla, el resultado que esperamos es ver una búsqueda de la palabra «API» en Excel Signum, es decir, esto:
Obviamente si hablamos de un formulario web, tendremos que identificar el elemento adecuado, si se trata de un ID o un Nombre y realizar tantas referencias como sean necesarias.
Esta vez no pondré archivo de descarga, el motivo es que no es necesario, tan solo hay que copiar la macro en un módulo, adaptarla y ejecutarla.
Espero que os sea de utilidad 🙂
Estimado y si en lugar de dar click es dar tab como sería?
Hoja José:
El click de la macro no se refiere e ninguna tecla en concreto, sino a un método de programación. Si deseas ejecutar la macro con una tecla en concreto, puedes leer este post https://excelsignum.com/2016/03/12/ordenar-un-rango-mediante-seleccion/
Donde utilizo por ejemplo, la tecla escape para ejecutar la macro.
Saludos.
Hola. sin form web no tiene id y si tiene name. como seria el codigo?
Hola Leo:
Con name sería así:
Sub CARGAR_DATOS_WEB()
Dim IE As Object
Dim document As Object
Application.ScreenUpdating = False
'Creamos objeto internet explorer
Set IE = CreateObject("InternetExplorer.Application")
'abrimos web
IE.navigate "https://excelsignum.com/"
'esperamos a que se carguen todos los elementos
Do Until IE.ReadyState = 4
DoEvents
Loop
'si necesitamos más tiempo lo podemos configurar aquí
Application.Wait (Now + TimeValue("0:00:01"))
'localizamos el name que hace referencia al cuadro de búsqueda
'esto lo hacemos buscando en el código HTML de la página web
'e igualamos el valor de la celda para realizar la búsqueda
Set document = IE.document
With document
.getElementsByName("s")(0).Value = "API"
End With
'también buscamos "name" correspondiente al botón para buscar el valor
With document
.getElementsByName("submit")(0).Click
End With
'hacemos visible la web.
IE.Visible = True
Set IE = Nothing
Application.ScreenUpdating = True
End Sub
estoy intentando con una macro rellenar unos campos de un formulario web esta pagina web http://www.cortefilme.com.br/mapa.html tiene una parte en HTML y otra en flash los datos que tengo que rellenar son de la parte en flash, por lo que había pensado es ir aun campo HTML y después con sendkey y TAB acceder a los campos en flash , cuando lo hago manualmente me funciona bien, pero cuando lo hago a través de la macro en lugar de ir al primer campo flash se va a la barra de direcciones de internet explorer.
Os adjunto el código por si hay alguien que me puede ayudar(soy novato en vba)
Muchas gracias
Sub lamina152()
‘
‘ lamina152 Macro
‘
Dim IE As Object
Dim CeldaActual As Range
Set CeldaActual = ActiveCell
Set IE = CreateObject(«InternetExplorer.application»)
URL = «http://cortefilme.com.br/mapa.html»
IE.Navigate URL
IE.Visible = True
Do
DoEvents
Loop Until IE.readystate = 4
‘Application.Wait (Now() + TimeValue(«00:00:06»))
IE.document.getelementbyid(«aemail»).Select
Call SendKeys(«1», True)
‘Application.Wait (Now() + TimeValue(«00:00:01»))
Call SendKeys(«{TAB}», True)
Call SendKeys(«{TAB}», True)
Call SendKeys(«222», True)
End Sub
Hola Luis:
En la parte flash no voy a entrar, porque no he programado vba con flash. Sobre lo otro, la forma de pasar información desde Excel a un formulario es como te indico en el post. Por ejemplo, para tu consulta, por ID se pueden completar todos los campos de cuadros de texto (nombre, email, etc, etc). NO hace falta usar combinación de teclas (que siempre dan problemas en VBA).
Utiliza el .click para pulsar el botón de envío (indicando previamente su id).
IE.document.getElementById("nome").Value = "alejandro" '
IE.document.getElementById("email").Value = "mi@correo.com"
IE.document.getElementById("anome").Value = "miamigo"
IE.document.getElementById("aemail").Value = "su@correo.com"
'también buscamos ID correspondiente al botón para buscar el valor
IE.document.getElementById("bt_enviar").Click
Saludos.
Hola Segu.
Tengo una consulta que hacerte acerca de la funcion .getElementByID que comentas en este hilo.
Resulta que en un excel mediante una macro en vba (windows 7, excel 2013 de 32 bits y IE11), hago una llamada a internet explorer y me rellena un campo. Hasta ahí todo perfecto, me funcionaba genial.
Resulta que ahora he cambiado a Windows 10 y excel 365 64 bits y IE11 y me devuelve error en esta función (error en tiempo de ejecucion, error de automatización). Lo tengo tal que así:
ie.Document.getelementbyid(«campo»).Value = Range(«cd30»).Value
Lo que me extraña es que en el equipo antiguo me iba bien y ahora no. He intentado dar con el error y no se si es por la version de IE o por los 64bits.
¿Alguna idea de por donde puede venir el fallo?
Muchas gracias por la ayuda
David
Hola David:
Yo acabo de ejecutar la macro en Windows 10 con Excel a 64 Bits y funciona ok. ¿Puedes probar otra vez?, es posible que sea un error puntual al pasar los datos al navegador. Saludos.
Buenas tarde estimado, y si en la pagina en cuestión se quiere adjuntar un archivo, por ejemplo.
IE.document.getElementById(«buttonAdd»).Click
En la pagina se abre la ventana para adjuntar un archivo, pero no se bien que proceda, me imagino hay que poner la ruta del archivo en excel, pero desconozco como, me podras apoyar?
Hola Hector, Esta macro es para ejecutar el click mediante código y activar la web y mostrar lo que interese. No es para subir archivos, tendría que estudiar hacer un post sobre eso.
Saludos.
Muchas gracias por contestar, igual seguiré investigando, pero estaré al tanto del contenido por si lo logras primero que yo, ahorita solo logre que arroje la ventana para elegir el archivo pero no logro hacer que lo elija de forma automática. Saludos!
Hola buen día
Si necesitara crear un formulario y que la información del formulario se ingresara en la página web?
Por Ejemplo Un usuario y contraseña.
Hola Daniel:
Tendrías que hacerlo en un userform con dos cuadros de texto y un botón de ejecución. En el evento del botón de comando incluir este código:
Private Sub CommandButton1_Click()
Dim IE As Object
Application.ScreenUpdating = False
'Creamos objeto internet explorer
Set IE = CreateObject("InternetExplorer.Application")
'abrimos web
IE.navigate "https://excelsignum.com/"
'esperamos a que se carguen todos los elementos
Do Until IE.ReadyState = 4
DoEvents
Loop
'si necesitamos más tiempo lo podemos configurar aquí
Application.Wait (Now + TimeValue("0:00:01"))
'usuario
IE.document.getElementById("elquecorresponda").Value = Me.TextBox1.Value '
'contraseña
IE.document.getElementById("elquecorresponda").Value = Me.TextBox2.Value '
'también buscamos ID correspondiente al botón para buscar el valor
IE.document.getElementById("elquecorresponda").Click
'hacemos visible la web.
IE.Visible = True
Set IE = Nothing
Application.ScreenUpdating = True
End Sub
Obviamente, el ID tendrás que obtener los Id de Usuario, Contraseña y botón de logeo de la página que vayas a abrir.
Saludos.
Hola buenas noches, me ha sido de mucha utilidad el ejemplo, pero me encuentro con la necesidad de que al acabar de entrar los datos en el formulario web tengo un botón para descargar un archivo csv con los datos y el explorador me pregunta para guardar o abrir el archivo. Sabrías decirme como puedo interactuar par hacer que lo guarde o abra desde el script.
Muchas gracias.
Hola Joan:
Tengo pendiente ampliar un post con lo que indicas. En estos momentos no puedo actualizar información, pero te dejo un enlace al foro:stackoverflow.com
https://stackoverflow.com/questions/50193629/vba-download-file-from-website-popup-window
Creo que estos es lo que necesitas. Saludos.
Buenas tardes, me he mirado el enlace y es exactamente mi problema pero no está resuelto, ya que para usar el URLDownloadToFile se requiere conocer el nombre del archivo y este se genera al hacer click en el botón a través de un script de java en la propia web.
La web de la que quería extraer la información rellenado el formulario es: https://re.jrc.ec.europa.eu/pvg_tools/es/tools.html
Y tu ejemplo es perfecto para rellenar el formulario apretar los botones que generan el archivo pero la página se queda esperando que le diga abrir o guardar. Y es lo que no se resolver
Muchas gracias.
Hola Joan:
Ya sé lo que quieres decir con descargar el archivo. Pero la complejidad de lo que deseas es alta, hay cosas en la red, pero no son concluyentes (bajo mi punto de vista). Son desarrollos muy complejos en algunos casos y en otros directamente no funcionan bien.
Te dejo un enlace a una discusión: https://stackoverflow.com/questions/32145437/controlling-ie11-do-you-want-to-open-save-dialogue-window-buttons-in-vba
Esto tengo que estudiarlo con calma, y ver si consigo un código que funcione.
Saludos.
Buenos dias, y se puede hacer este codigo para chrome?? saludos cordiales
Jesús
Hola Jechucho:
Aunque existe literatura al respecto (poca), actualmente aunque invoques el navegador, no podrás analizar el documento como con IE, dado que careces de una biblioteca.
Sobre el tema: https://code.google.com/archive/p/selenium-vba/
Saludos.
Hola
Tengo información similar en distintas hojas que se incrementan todos los días, yo agrego información en otras columnas y luego tengo que ingresar la información a un formulario web… como puedo resumir ese proceso?
Gracias.
Hola Federico: tu pregunta es demasiado general, tendría que analizar qué es lo que buscas en realidad. Si lo que deseas es agrupar la información de varias hojas, en esta web tienes varios códigos que te ayudarán a hacer (en el buscador indica: agrupar o consolidar
Saludos.
Hola, no encuentro cómo hacer para poder traer información desde esa página a la que ingreso. Me gustaría traer ciertos datos que se generan cuando ingreso la búsqueda, ¿cómo puedo hacerlo? Muchas gracias
Hola David:
Lo que buscas es hacer web scraping, y es algo bastante complejo, en este blog tienes un ejemplo muy básico para que veas de qué se trata:
https://excelsignum.com/2016/11/26/funcion-para-traducir-texto-en-nuestra-hoja-excel/
Saludos.
Hola amigo, tengo una duda.
Como hago para ejecutar la macro para una web en google chrome.
Es necesario desarrollarlo con el API de google y tendría que estudiarlo dado que no es un ejercicio sencillo.
Saludos.
Hola Segu.-Te quisiera consultar en relaciòn a la funciòn RTD ò, como en mi Excel ( versiòn actual ) RDTR.-Estoy, mediante este comando, obteniendo datos de pàgina web hacia mi formulario Excel.-La consulta que necesito hacerte es si es posible mediante algùn comando, macro, etc, enviar datos desde mi Excel hacia el programa que me provee dichos datos.-En este caso el programa se llama Thinkorswim y el comando RDTR se obtiene mediante el ProgID: «tos.rtd».- Desde ya muchas gracias.-
Hola Raul:
Lo desconozco, la macro que programé en este post es para pasar datos a una web desde Excel. No a un programa.
Saludos
Hola segu
Estoy intentando pasar una información del Excel a una página De intranet y según veo está diseñada Con algunas divisiones y frames que cuando identifico el id tiene unas subdivisiones y en el campo que necesito escribir no se cual sea el código para agregar el texto. He intentado con value con text pero no funciona
Como podría realizar el código para que me tome lo que quiero escribir?
Muchas Gracias
Hola Juan Pablo,
Tendría que ver un ejemplo del html de la web, así no puedo responderte. Saludos.
Hola buen día Segu
Tengo una duda si en vez de un cuadro de texto lo que quiero es rellenar una lista despegable como seria el código, gracias!!!!
Saludos.
Hola Silvestre:
Lo que indicas requiere un desarrollo aparte. No es únicamente enviar un dato a un cuadro de texto, es enviar un array a una lista desplegable. Trataré de estudiar el tema y ver si existe una solución.
Saludos
Gracias Segu!!!!
De nada!! Saludos
Hola Segu,
muchas gracias por todas las soluciones, en mi caso en conseguido rellenar los campos de un formulario de registro web pero al dar al botón de registrar no reconoce los datos que he introducido via macro y me pide que los rellene. Debajo de cada campo pone: «Indique su nombre» o «Indique su apellido». Es decir en el campo nombre yo veo en la pantalla Luis pero el formulario no lo reconoce y en el momento en que modifico el campo con una letra o un espacio lo reconoce y me desaparece la peticion de «Indique su nombre». Espero que me puedas ayudar pq creo que el resto lo tengo vien. Te adjunto mi código:
Sub inscripciones()
Dim IE As Object
Dim doc As HTMLDocument
Set IE = CreateObject(«InternetExplorer.Application»)
IE.Visible = True
IE.navigate «https://register.gotowebinar.com/register/8357104619320871183»
Do While IE.Busy Or IE.readyState 4
Application.Wait DateAdd(«s», 1, Now)
Loop
‘For intRow = 2 To 4
‘————————-este codigo inserta las variables pero no deja registrar———————–
IE.document.getElementById(«registrant.firstName»).Value = «luis»
IE.document.getElementById(«registrant.lastName»).Value = «romero»
IE.document.getElementById(«registrant.email»).Value = «lromero@aaaa.com»
IE.document.getElementById(«registration.submit.button»).Click
‘———————————————————————————————-
‘IE.document.getElementById(«registrant.firstName»).Value = ThisWorkbook.Sheets(«Hoja1»).Range(«A» & intRow).Value
‘IE.document.getElementById(«registrant.lastName»).Value = ThisWorkbook.Sheets(«Hoja1»).Range(«B» & intRow).Value
‘IE.document.getElementById(«registrant.email»).Value = ThisWorkbook.Sheets(«Hoja1»).Range(«C» & intRow).Value
‘IE.document.getElementById(«registration.submit.button»).Click
‘Application.Wait DateAdd(«s», 2, Now)
‘Next
‘IE.Quit
End Sub
Hola Beto:
Lo que ocurre es que la página tiene bloqueo antispam y por eso no es posible realizar lo que pretendes. No es sencillo encontrar un solución.
Saludos
Estimado Segu:
Por lo que puedo leer en este hilo, el codigo que porporcionaste amablemente es de mucha utilidad, y te doy mis mas granes felicitaciones y agradecimiento por este aporte..
Por otro lado, estoy tratando de replicar el ejemplo publicado y estoy teniendo un error, el cual es :
‘=======================
Run-time error ‘424’:
Object required
‘=======================
De casualidad tienes alguna idea de porque es este error y como puedo solucionarlo?.
es necesario que tenag el navegador abierto en la pagina que refencias?,
Te agardezco de antemanno.
Hola Yair:
Ese ejemplo no funciona en la web actual de Excel Signum porque hace unos meses cambié la plantilla y por lo tanto no lo mismo que en el ejemplo. Si quieres puedes probar con la web antigua cambiando en el código la url: https://excelsignum.wordpress.com/
Saludos
Hola q tal, muchas gracias por la respuesta, de hecho estaba tratando de replicarlo para entenderlo pq hay un procedimiento que necesito hacer pero la página donde quiero hacerlo, «sat.gob.mx», tambien me da un error de coneccion.
Tengo la sesión iniciada y el procedimiento es para captura de informacion de mil facturas
Sabes si necesito activar algo?! O si simplemente no se puede?!
Muchas gracias por tus prontos comentarios.
Saludos…
Muy buenas,
he visto tu entrada y estoy intentando usarla.
Quiero consultar desde un excel las multas de varios NIF de forma periodica, he conseguido con tu codigo que entre en la pagina y rellene los campos, pero no soy capaz de hacer el click y no sé como traerme el resultado.
On Error Resume Next
With Application
.DisplayAlerts = False
End With
DNI = Range(«a10»).Value
Desde = Range(«e3»).Value
Hasta = Range(«f3»).Value
Set IE = CreateObject(«InternetExplorer.Application»)
IE.navigate «https://www.boe.es/notificaciones/notificaciones.php»
Application.Wait (Now + TimeValue(«0:00:05»))
IE.document.all.Item(«dato[0]»).Value = DNI
IE.document.all.Item(«dato[4][0]»).Value = Desde
IE.document.all.Item(«dato[4][1]»).Value = Hasta
IE.document.getElementById(«buscar»).Click
Me puedes decir en qué estoy fallando y como traerme la respuesta?
Mil gracias por tu tiempo.
En esa web en concreto para activa el botón de buscar se hace así:
IE.document.getElementsByName(«accion»)(0).Click
Tienes en este post un ejemplo con ID y sin embargo pegas en la consulta otra macro. Te aconsejo que leas el post y pruebes la macro.
Saludos.
Hola, gracias a tu publicación he podido ejecutar el 90% de un proyecto personal que quería hacer desde hace rato.
Ahorita, estoy intentando cambiar un valor de una lista desplegable en una pagina web, pero no sé como cambiar el valor (la lista no se deja escribir.
Por otro lado, tampoco he logrado cargar un archivo automaticamente al dar click al botón que suele aparecer en internet como «cargar archivos», pero no sé como moverme dentro de la venta que se abre para buscar el documento dentro de mi pc.
Tienes algún comando recomendado para realizar estas dos cositas?.
Es posible que no se pueda realizar, sería necesario conocer la web y un ejemplo de los datos.
Saluds.
Buena noche disculpa la pregunta, estoy trabajando en una hoja de Excel y por medio de un macro envío un número a una página web formulario, la página me despliega información, lo que quiero es que la información que despliega la web almacenarla en una celda de la hoja de Excel.
Quizás este post te pueda ayudar:
https://excelsignum.com/2020/10/21/ejemplo-practico-web-scraping-extraer-precios-ibex35
Saludos
si quiero que sea para edge: como quedaría: Set IE = CreateObject(«InternetExplorer.Application»), realizo corrección de pregunta
Hola Edgar:
No es posible, VBA únicamente usa IE.
Saludos.
Hola Segu, gracias por tu post,
En mi caso al correr el código me genera el siguiente error en la linea IE.Document.getElementsByID
Se ha producido el error 462’´en tiempo de ejecución:
El equipo servidor remoto no existe o no está disponible
Quedo atento a tus comentarios.
Hola Eduardo puedes decirme qué web te está dando ese error y qué estás intentando enviar? El error puede ser por varios motivos:
Puedes intentar lo siguiente:
Sustituye:
Do Until IE.ReadyState = 4
DoEvents
Loop
Por esto:
While internet.busy
DoEvents
Wend
Hola segu, de mucha utilidad tu post,
Si en mi caso quisiera hacer que se rellenen los campos de una pagina que ya tenga abierta en vez de abrir una nueva, como seria?
Hola Ricardo: Tendría que ver si es posible, aunque me temo que no.
Saludos
Hola Segu, Podría utilizar este código para encontrar información específica de una fila por medio de un ID, por ejemplo, en la columna A de un excel poner 12345, y que al escribirlo en un input y le de enviar me aparezca la información de la fila donde está ese ID
Utilize tu código, hice los cambios, pero me sale rerrorcde ejecución.en la línea donde puse el ID vFACTURACOMENTARIOS
Me puedes ayudar??
Sub CARGAR_DATOS_WEB()
Dim IE As Object
Application.ScreenUpdating = False
‘Creamos objeto internet explorer
Set IE = CreateObject(«InternetExplorer.Application»)
‘abrimos web
IE.navigate «http://IPOS/CalculoOtros.aspx»
‘esperamos a que se carguen todos los elementos
Do Until IE.ReadyState = 4
DoEvents
Loop
‘si necesitamos más tiempo lo podemos configurar aquí
Application.Wait (Now + TimeValue(«0:00:01»))
‘localizamos el ID que hace referencia al cuadro de búsqueda
‘esto lo hacemos buscando en el código HTML de la página web
‘e igualamos el valor de la celda para realizar la búsqueda
IE.document.getElementById(«vFACTURACOMENTARIOS»).Value = «DATOS DE EXCEL IMPORTADO» ‘
‘también buscamos ID correspondiente al botón para buscar el valor
‘IE.document.getElementById(«searchsubmit»).Click
‘hacemos visible la web.
IE.Visible = True
Set IE = Nothing
Application.ScreenUpdating = True
End Sub
Tendría que ver el ejemplo concreto para poder ayudarte. Saludos