miércoles, 30 de enero de 2019

Interactuando con internet (I)

Sin duda el uso de internet para diversas, tareas, consultas, trabajos, etc., es cada vez mayor y del mismo modo el número de usuarios/as de Microsoft Excel sigue en ascenso lo que ocasiona que muchas de las preguntas en diversos foros sea sobre cómo usar/navegar por internet desde Excel.

Por supuesto que la respuesta es el uso de VBA pero lo más importante es reconocer y/o identificar los objetos de las páginas web con las que queremos interactuar. Algo que es importante aclarar es que si no deseamos usar aplicaciones (o librerías u otros) de terceros necesariamente interactuaremos con Internet Explorer, no con Edge o Chrome..

Lo primero será crear un objeto “Internet Explorer” del siguiente modo:

Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application") 

Después usaremos su método “Navigate” para abrir una página web y la propiedad “Visible” para que se vea la aplicación recién abierta.

IE.navigate "https://www.google.com.pe" 
IE.Visible = True Set 
IE = Nothing 

De ese modo tendremos el IE abierto con google cargado. Por cierto, para ver/leer sobre otras propiedades, eventos y métodos del objeto Internet Explorer, miren por aquí: Enlace

Ahora vamos a interactuar con los objetos (elementos) dentro de Google, pero para eso debemos saber que será necesario usar la propiedad “Document” así como cualquiera de los cuatro métodos siguientes:

getElementById
getElementsByTagName  
getElementsByClassName  
getElementsByName 

Con cualquiera de ellos podremos identificar el objeto/elemento con el cual queremos interactuar, solo basta encontrar el Id, Tag, Clase (Class) o Nombre (name) y usar el método correspondiente. No todos los objetos/elementos tienen/usan las cuatro, pero nos bastará hallar una para poder lograr nuestro cometido.

Siguiendo con Google, vamos a suponer que lo tenemos abierto en nuestro Chrome, entonces situaremos el cursor dentro del cuadro de texto de la web y le daremos click derecho con lo que se nos mostrará el siguiente menú contextual:

Automáticamente le daremos Click a “Inspeccionar” y nos dará el siguiente resultado:

Se puede apreciar que el cuadro de texto tiene dos formas que nos ayudan a identificarlo, su clase (Class = gLFyf gsfi) y su nombre (Name = q). Usaremos el nombre y a su vez la propiedad “Value” del objeto/elemento, por lo que tendríamos que colocar así:

IE.document.getElementsByName("q").Value = "Hola a todos"
Previo a eso agregaremos un bucle que permita que, antes de intentar enviar valores al cuadro de texto, la página web cargue completamente. Para eso usaremos la propiedad “ReadyState” con el valor cuatro (4) equivalente a que el objeto ha recibido todos los datos. Entonces, hasta el momento tendremos esto:Entonces, dicho todo eso, nuestra macro debería quedar así:
Sub Navegar() 
Dim IE As Object 
Set IE = CreateObject("InternetExplorer.Application") 
IE.Navigate "https://www.google.com.pe" 
Do Until IE.ReadyState = 4     
 DoEvents 
Loop 
IE.document.getElementsByName("q").Value = "Hola a todos" 
IE.Visible = True 
Set IE = Nothing 
End Sub 

Al correr la macro nos dará un error en la línea en donde estamos intentando enviar un valor (una frase) al cuadro de texto de la web. Dado que en el caso de las web muchas veces los métodos arrojan resultados de lista de nodos, algunas veces se hace necesario identificar dicho índice. Entonces, para evitar dicho error agregaremos el índice del objeto/elemento del siguiente modo:

IE.document.getElementsByName("q")(0).Value = " Hola a todos"

Ahora solo nos falta hacer “click” al botón correspondiente para terminar. Si usamos otra vez “Inspeccionar” pero esta vez previamente colocando el cursor sobre el botón “Buscar con Google”, veremos que su nombre es “btnK”. Con ese nombre (al que agregaremos también el índice) y su evento “Click” habremos terminado. Coloca esta línea posterior a la que vimos antes de este párrafo:

IE.Document.getElementsByName("btnK")(0).Click

Listo, ahora al correr la macro abrirá Internet Explorer, cargará Google, colocará “Hola a todos” y buscará esa frase dándonos como resultado miles de enlaces.

Hasta la próxima.

Abraham Valencia

2 comentarios:

  1. Excelente aporte. A esto se le podría agregar que entre en la primera opción o enlace que encontró y por supuesto nos muestre la respectiva web?

    ResponderBorrar
  2. IE.Navigate "https://www.google.com.pe"
    Do Until IE.ReadyState = 4
    DoEvents
    Loop
    Mi pregunta es: Que pasa si la pagina web buscada no existe. Termina el Do/Loop y la variable IE no cargo valores. Como seria para preguntar con if/then .

    ResponderBorrar