Páginas

martes, 29 de julio de 2014

VBA Excel: Macro para abrir una pagina WEB.



Para este ejemplo vamos a usar excel para entrar a una pagina Web, la de DHL, ingresar nuestro usuario y contraseña, hacer una consulta de facturacion sobre un rango de fechas, y al final extraer los datos de la consulta y pegarlos en el reporte de excel.

Key 1: Se necesita instalar las librerias Microsoft HTML objects Library y Microsoft Internet Controls. Estas librerias nos permiten usar los objetos metodos y propiedades que usamos en Javascript.
Key 2: Se debe crear un objeto Internet Explorer  y un objeto HTMLDocument
Key 3: Se debe buscar los <tags> de los botones y formularios en las paginas web.
Key 4: GetElementById accede a esos objetos y parentWindow.execScript ejecuta las acciones detro de esos objects.

Sub parser()

Dim pagina As HTMLDocument
Dim explorador As InternetExplorer
Dim direccion As String

direccion = "https://dhl.e-custodia.com.ec/indexdhl.php"
usuario = "nombreDeUsuario"
contrasena = "tuContrasena"

'Con esto se crea una nueva ventana en el explorador, que es el primer paso

Set explorador= New InternetExplorer

'Aqui definimos si queremos ver todo lo que pasa en el exploardor o no, por ahora Sí, asi que TRUE

explorador.Visible = True

'Navega a la direccion deseada

explorador.Navigate direccion

'Aqui la macro espera hasta que el explorador cargue la pagina completamente.

Do
DoEvents
Loop Until explorador.ReadyState = READYSTATE_COMPLETE

'con la pagina cargada, asignamos el contenido al objeto pagina

Set pagina= explorador.Document



'Para llenar los campos de usuario y contrasena, necesitamos ver como estan identificados en el codigo html de la pagina, eso se explora haciendo click en el boton derecho sobre la ventana y seleccionando "inspect element". Por ejemplo el "id" del campo de usuario es "user":



'Asi mismo busco el de la contrasena, el cual es "pass".
'Tambien se debe buscar cual es la funcion que se activa cuando hacemos click en el boton de enviar. En este caso es un nombre super largo que viene despues de  onclick=, solo lo copio todo.



'Ahora si, usando el metodo getElementById, y execScript:

pagina.getElementById("user").innerText = usuario
pagina.getElementById("pass").innerText = contrasena
pagina.parentWindow.execScript ("if(document.getElementById('user').value!='' && document.getElementById('pass').value!=''){document.getElementById('form1').submit()}")

'Luego de esto la ventana del explorador irá a otra pagina, lo que hay que hacer es esperar a que el explorador cargue.  Por alguna razon explorador.ReadyState no funciona bien en este paso, pero la siguiente solucion es excelente:
Do While explorador.Busy

Loop

'Se queda pensando hasta que la pagina en el explorador cargue completamente.  Se puede repetir el proceso cada vez que tengamos que pasar a otras paginas mientras exploramos.

End Sub



Cada pagina web es diferente, si la macro no funciona como esperabas, enviame un mail y si no es muy complicado el asunto quizas pueda darte una ayuda extra.

9 comentarios:

  1. Hola Buenas. El problema que quiero solucionar es el siguiente. Nosotros rellenamos un formulario (reserva) en excel que luego me gustaría poner en el calendario. Que hasta ahora lo que hacíamos es copiar y pegar a mano. Se podría hacer una macro que nos copiara ese texto automáticamente en el día correspondiente de google calendar? no nos importaría abonar algo por los servicios. Gracias!

    ResponderEliminar
    Respuestas
    1. Pues yo creo que sí es posible. Enviarme un mail a eljayan@gmail.com con una descripción más detallada del problema. Saludos!

      Eliminar
  2. Hola Buenos días. El inconveniente que tengo es el siguiente, ingreso a una pagina con clave y contraseña esta no la puedo abrir desde macro porque la contraseña cambia cada minuto, entonces necesito desde macro tener acceso a ella una vez ya esta abierta. De antemano Gracias.

    ResponderEliminar
  3. HOLA, QUISIERA SABER SI ME PODRIAS AYUDAR, QUISIERA SIMPLEMENTE PODER ABRIR LA SIGUIENTE PAGINA EN EXCEL, PERO NO SE COMO HACERLE. http://www.facemama.com/gestograma-facemama/gestograma.html SALUDOS....

    ResponderEliminar
  4. Hola, gracias por la info me parece buen trabajo.. sera posible que me hagas llegar el archivo de excel ya incluido el codigo por favor.
    slds, Carlos

    ResponderEliminar
  5. Saludos, es posible hacer algo similar pero con Chrome y no con IE...?

    ResponderEliminar
  6. Hola a todos,
    Intento realizar una consulta directa desde excel utilizando el siguiente codigo
    Sub Website()

    Dim IE As Object, Doc As Object, UserName As Object, Password As Object, strCode As String


    Set IE = CreateObject("internetexplorer.application")
    IE.Visible = True
    ' IE.navigate "http://fieldwork.genesisenergy.co.nz/"

    IE.navigate "http://dgii.gov.do/servicios/consultas/Paginas/ConsultaNCF.aspx"

    Do While IE.readystate <> 4: DoEvents: Loop

    Set Doc = CreateObject("htmlfile")
    Set Doc = IE.document

    Set UserName = Doc.getelementbyid("txtRNC")
    UserName.Value = "131102139"


    Set Password = Doc.getelementbyid("txtNCF")
    Password.Value = "A010010010100000001"


    Set btnLogin = Doc.getelementbyid("btnConsultar")
    btnLogin.Click
    End Sub

    pero al ejecutarlo me indica el siguiente mensanje

    Se ha producido el error 424 en tiempo de ejecucion se requiere un objeto

    Ayuda!!

    ResponderEliminar
  7. Hola, quisiera saber si es posible abrir un listado de paginas en X rando de Columna (1 pag por celda) con google chrome.

    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola, hasta donde conozco solo funciona con Internet Explorer amigo. Con chrome no creo que sea posible

      Eliminar