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.

22 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
  8. Ruben:

    Tengo el siguiente problema: estoy intentando ingresar a una intranet de mi empresa, para buscar ciertas cosas. Sin embargo, cuando ejecuto el código, me lanza el error 91, problema con bloque With (o algo así)

    Este es mi código:

    Sub navegar()

    'las declaraciones son opcionales, pero ayudan a visualizar las opciones mientras se digita
    Dim ie As InternetExplorer
    Dim pagina As HTMLDocument
    Dim buscar As HTMLButtonElement
    Dim precios As Object
    Dim precio As Object
    Dim cate As String


    'On Error Resume Next

    'cual es la cantidad de items a mostrar
    cate = CStr(Range("B1").Value)

    'crea el explorador de internet
    Set ie = New InternetExplorer

    'hacemos visible el explorador
    ie.Visible = True

    'navega a la página de aribnb
    ie.navigate "https://c.na43.visual.force.com/apex/ShippingAdminCategories"

    'espera a que la página cargue
    Do
    DoEvents
    Loop Until ie.readyState = READYSTATE_COMPLETE

    'la página cargada la asignamos a la variable "pagina"
    Set pagina = ie.document

    'asignamos el valor de una ciudad

    Set cat = pagina.getElementsByClassName("ch-points-ltrt")(0)

    cat.Value = ThisWorkbook.Sheets("Hoja1").Range("B1").Value ' Aquí lanza el error



    'pagina.getElementsByClassName("nav-search-btn")(0).Click

    stat = pagina.readyState

    'Espera a que la página cargue
    Do While stat = "loading"
    Application.Wait (Now + TimeValue("0:00:01"))
    stat = pagina.readyState
    Loop

    End Sub



    * El codigo donde quiero insertar dicha búsqueda es este:



    * tuve que borrar las "n" de i*put, pues no me dejaba postearlo con dicho concepto (fue raro eso)

    ¿Cómo puedo solucionarlo?

    ResponderEliminar
    Respuestas
    1. Que es cat? Una lista desplegable?

      Eliminar
    2. No, sólo es el nombre que le quise dar.
      En realidad es una celda que contiene lo que quiero pegar en la página

      Eliminar
    3. Entonces es al revés, intenta con

      ThisWorkbook.Sheets("Hoja1").Range("B1").Value = cat.innerText

      Eliminar
    4. Me lanza el mismo error:
      "Se ha producido el error 91 en tiempo de ejecución: Variable de objeto o bloque With no establecido"

      Eliminar
    5. ¿Qué puede ser? ¿Se puede solucionar?

      Eliminar
    6. Es difícil sin ver el html de la página pero según el error que aparece ñ, el problema es en la línea
      Set cat = pagina.getElementsByClassName("ch-points-ltrt")(0)
      Quizás "ch-points-ltrt" no es un ClassName sino un id? Puedes copiarme el código html de esa parte?

      Eliminar
    7. Este es el codigo donde quiero ingresar el dato contenido en B1. No me deja ingresar la palabra IPUT (CON N), por ello las reemplazé por nada




      Eliminar
    8. Este es el codigo donde quiero ingresar el dato contenido en B1. No me deja ingresar la palabra IPUT (CON N), por ello las reemplazé con vacío


      Eliminar
    9. ' iput name="search-category-iput" class="ch-points-ltrt" id="search-category-iput" required="" type="text" size="20" placeholder="Ingresa el ID de la categoría" '

      Eliminar
    10. ¿Alguna posible solución?

      Eliminar
  9. Buenos días Ruben.
    Necesito hacer algo similar.
    Te he mandado un correo a eljayan@gmail.com
    Si te parece puedo explicarte lo que necesito y si hay que pagar se paga.
    Gracias.
    Saludos.

    ResponderEliminar