Un lector, llamado " J ", a secas, me plantea una buena situación: el conoce sobre la herramienta de Excel que nos permite tomar una tabla de cierta página Web (datos / obtener datos externos / consulta web) e importarla a Excel, para tener dichos registros en nuestra hoja de cálculos. Ya hemos tocado este asunto, el cual podrán encontrar en la sección "Datos" del blog; les dejo una imagen para refrescar la memoria:
[+/-] Ver el resto / Ocultar
Pero J necesita ir un paso mas allá: el no quiere toda la tabla.... solo ciertos datos de la misma. Allí la herramienta anteriormente expuesta nos queda "corta", ya que no posee esa opción. O importamos toda la tabla o no importamos nada.
Pero la solución (existen varias), entonces, será ir hacia una URL y leer su código HTML. Una vez realizada dicha labor, buscaremos ese dato en concreto y lo llevaremos hacia nuestra hoja de cálculos. Hace tiempo trabajé en un proyecto de similares características, en donde mi cliente (una PyME) deseaba abrir un libro de Excel y que, automaticamente, en una celda se coloque la cotización del dólar. Y me parece un buen punto de partida para encarar esta labor. Esto corresponde mas al lado de la programación en Visual Basic que a funciones específicas de Excel, y nos vendrá perfecto para seguir alabando al mejor programa del mundo; los campos que uno puede abarcar son, practicamente, inagotables.
Como mencioné, existen muchas formas distintas de hacer esto, algo muy común en el mundo de la programación. Para que el ejemplo sea sencillo y nos lleve a la utilización de pocos recursos y líneas de código, echaré mano a una función del Sistema Operativo: las API's de Windows. Con estas funciones nos será posible acceder a datos y realizar tareas que de otra forma serían imposibles de desarrollar.
Insertaremos un formulario en el proyecto y pegaremos esta función:
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Si, las API's de Windows tienen esa rara mezcla de programación, proto-chino, ruso y japonés que, a primera vista, nos confunde un poco. Pero si la leemos con atención veremos que solo es una función mas, la cual, en este caso, nos solicita 5 argumentos.
Resalté el nombre de la función: URLDownloadToFile, misma que posee una traducción totalmente técnica y sencilla: descargar a un archivo una dirección web (url). Luego hace referencia a la librería en la cual se encuentra, uno de esos tantos y populares archivos ".dll" (dinamyc library lynk) que populan dentro de Windows. Y por último el Alias de la misma, que no es otra cosa que el nombre por el cual deberá ser invocada, si es que posee dicho alias. Y eso es todo: nombre, librería y alias. Si bien no es determinante para nuestro ejemplo, nunca viene de mas analizar la estructura de estas funciones, para evitar posibles futuros sustos al leerlas. =)
Dije que nos pide 5 argumentos (o parámetros), pero en esta ocasión solo nos centraremos en 2: el segundo y tercero, a saber: ByVal szURL y ByVal szFileName. Estos, respectivamente, nos piden que le pasemos la URL que deseamos acceder y la ruta en donde guardaremos el código fuente (HTML) de la página.
Vamos a un ejemplo: queremos guardar en nuestro disco duro el código HTML correspondiente a la página de Google. Con lo visto hasta el momento podemos hacerlo sin problemas, de esta forma:
URLDownloadToFile 0 , "http://www.google.com", "D:\ejemplos\copia_html.txt", 0, 0
Y listo, así de simple. En el segundo argumento indico la URL completa del buscador y en el tercero, la ruta (incluyendo nombre de archivo) en donde guardaré su código HTML. Ejecutandola, este es el resultado:
En lo personal he utilizado mucho esto para extraer código CSS (hojas de estilo) y JavaScript, este último con el objeto analizar las funciones que generalmente se usan. Me dedico a la programación de sitios web y con esta técnica logré automatizar un pequeño "sistema espía", en donde catalogo los sitios de acuerdo a sus formatos y funciones. Algunos me dirán "-Y por qué no te vas hasta la página y ves su código HTML y listo?". Por una razón sencilla: al descargar ese código a un TXT, luego extraigo la información que me resulta útil, almacenándola en una base de datos. Y es justo lo que necesita mi lector, J.
Volvamos. Lo más fácil fue obtener el código y guardarlo en un archivo. Ahora viene otro tema: buscar la información deseada (entre miles de caracteres) y llevarla a Excel. Para esto también existen muchas técnicas y haré uso de una de las mas sencillas:
1) Abrir el TXT en modo Secuencial
2) Cargar su contenido en una variable de texto (tipo String)
3) Buscar el dato necesitado
4) Migrar ese dato a una celda.
Para lograr los pasos arriba detallados se nos hará fundamental una cosa: determinar unívocamente que estamos buscando. Aquí hablamos de identificar solo una porción de texto entre miles y miles de caracteres, así que este punto es de vital importancia. Aquí nos será de gran ayuda la sintaxis del lenguaje HTML, ya que los tags (etiquetas) y otros atributos nos darán buenos puntos de referencia.
No voy a utilizar una web real, para evitar posibles problemas de autoría, robo de datos, etc, etc, etc y todos esos etc's que aparecen cada vez que alguien quiera hacerte lío.
Voy a "imitar" el código de una página web de cotizaciones muy conocido:
Necesitamos extraer el precio del dólar. Vemos que existe una td (columna) que posee la class 'dolar' y contiene el valor buscado. Entonces ese será nuestro "punto de quiebre", ahí está nuestro valor.
Integraremos un formulario con los siguientes controles:
2 cuadros de texto: uno para la URL y otro para el valor que buscaremos.
1 boton de comando, para "disparar" nuestra macro.
Debe quedar así (no se preocupen en hacerlo, al final del post les dejo el link):
A continuación les dejo el código que logra poner en la celda A1 el valor del dólar que está "colgado" en una página web, dentro de una tabla y mezclado con cientos o miles de otros caracteres:
Lo principal, que era acceder al código HTML de una página web desde visual basic (vba en Excel) está cumplido y no es complicado. Restaría analizar cual es la mejor forma de buscar un determinado valor dentro del archivo TXT generado, pero allí si deberemos ajustar nuestra imaginación a las necesidades del proyecto, dado que existen cientos de formas distintas de llevarlo a cabo.
Podríamos mejorar esto con: a) un controlador de errores, b) una hoja que sirva de base de datos y vaya almacenando las URL y los Valores, para luego permitirle al usuario seleccionarlos y no repetir el ingreso de los datos, c) que la macro se ejecute al abrir el libro de excel, d) eliminar el archivo descargado, luego de utilizarlo. Y muchas mas, que dejo a criterio de cada uno. Ante la menor duda, me hacen un mensaje y listo.
Noten un asunto que, aunque no tiene nada que ver con todo esto, es primordial: la seguridad de los datos "colgados" en la web. El humilde robot que me diseñé hace un tiempo (con el objeto de almacenar código javascript y css) no es muy distinto a este ejemplo: con un bucle recorro cientos de páginas web (las que previamente guardé en una hoja de cálculos) buscando ciertos datos y me los llevo hacia Access, en donde finalmente creo consultas para discriminar lo recolectado por sitio, estructura, funciones.... todo con una simple macro, desde un pequeño libro de Excel, que no supera los 500 KB. ¿Puedo así obtener direcciones, números telefónicos, mails y otros asuntos? Si, por supuesto que puedo.
¿El tiempo que lleva? No me importa, por que dejo trabajando a mi "compu" unas buenas horas, mientras me voy a tomar unos exquisitos mates (con tortas fritas) a la costanera, disfrutando de un inmejorable paisaje.
Y luego vuelvo y puedo vender esos datos sin problemas, al gran y saludable mercado negro que hay en torno a este tipo de acciones. Así que cuidado con lo que escribimos.
Y ni hablé de la posibilidad de ingresar código PHP, redireccionando páginas o haciendo uso de ese potente lenguaje web desde una macro. Suerte y espero que este ejemplo les sea de utilidad en sus proyectos.
Link al ejemplo
el asistente para importar datos desde la web: seleccionando cualquiera de las "flechas con fondo amarillo" lograremos llevar esa tabla a Excel.
[+/-] Ver el resto / Ocultar
Pero J necesita ir un paso mas allá: el no quiere toda la tabla.... solo ciertos datos de la misma. Allí la herramienta anteriormente expuesta nos queda "corta", ya que no posee esa opción. O importamos toda la tabla o no importamos nada.
Pero la solución (existen varias), entonces, será ir hacia una URL y leer su código HTML. Una vez realizada dicha labor, buscaremos ese dato en concreto y lo llevaremos hacia nuestra hoja de cálculos. Hace tiempo trabajé en un proyecto de similares características, en donde mi cliente (una PyME) deseaba abrir un libro de Excel y que, automaticamente, en una celda se coloque la cotización del dólar. Y me parece un buen punto de partida para encarar esta labor. Esto corresponde mas al lado de la programación en Visual Basic que a funciones específicas de Excel, y nos vendrá perfecto para seguir alabando al mejor programa del mundo; los campos que uno puede abarcar son, practicamente, inagotables.
Como mencioné, existen muchas formas distintas de hacer esto, algo muy común en el mundo de la programación. Para que el ejemplo sea sencillo y nos lleve a la utilización de pocos recursos y líneas de código, echaré mano a una función del Sistema Operativo: las API's de Windows. Con estas funciones nos será posible acceder a datos y realizar tareas que de otra forma serían imposibles de desarrollar.
Insertaremos un formulario en el proyecto y pegaremos esta función:
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Si, las API's de Windows tienen esa rara mezcla de programación, proto-chino, ruso y japonés que, a primera vista, nos confunde un poco. Pero si la leemos con atención veremos que solo es una función mas, la cual, en este caso, nos solicita 5 argumentos.
Resalté el nombre de la función: URLDownloadToFile, misma que posee una traducción totalmente técnica y sencilla: descargar a un archivo una dirección web (url). Luego hace referencia a la librería en la cual se encuentra, uno de esos tantos y populares archivos ".dll" (dinamyc library lynk) que populan dentro de Windows. Y por último el Alias de la misma, que no es otra cosa que el nombre por el cual deberá ser invocada, si es que posee dicho alias. Y eso es todo: nombre, librería y alias. Si bien no es determinante para nuestro ejemplo, nunca viene de mas analizar la estructura de estas funciones, para evitar posibles futuros sustos al leerlas. =)
Dije que nos pide 5 argumentos (o parámetros), pero en esta ocasión solo nos centraremos en 2: el segundo y tercero, a saber: ByVal szURL y ByVal szFileName. Estos, respectivamente, nos piden que le pasemos la URL que deseamos acceder y la ruta en donde guardaremos el código fuente (HTML) de la página.
Vamos a un ejemplo: queremos guardar en nuestro disco duro el código HTML correspondiente a la página de Google. Con lo visto hasta el momento podemos hacerlo sin problemas, de esta forma:
URLDownloadToFile 0 , "http://www.google.com", "D:\ejemplos\copia_html.txt", 0, 0
Y listo, así de simple. En el segundo argumento indico la URL completa del buscador y en el tercero, la ruta (incluyendo nombre de archivo) en donde guardaré su código HTML. Ejecutandola, este es el resultado:
bien, todo correcto. Noten la barra de desplazamiento horizontal: está muy a la izquierda, lo que nos alerta de que dentro de ese TXT hay bastante código.
En lo personal he utilizado mucho esto para extraer código CSS (hojas de estilo) y JavaScript, este último con el objeto analizar las funciones que generalmente se usan. Me dedico a la programación de sitios web y con esta técnica logré automatizar un pequeño "sistema espía", en donde catalogo los sitios de acuerdo a sus formatos y funciones. Algunos me dirán "-Y por qué no te vas hasta la página y ves su código HTML y listo?". Por una razón sencilla: al descargar ese código a un TXT, luego extraigo la información que me resulta útil, almacenándola en una base de datos. Y es justo lo que necesita mi lector, J.
Volvamos. Lo más fácil fue obtener el código y guardarlo en un archivo. Ahora viene otro tema: buscar la información deseada (entre miles de caracteres) y llevarla a Excel. Para esto también existen muchas técnicas y haré uso de una de las mas sencillas:
1) Abrir el TXT en modo Secuencial
2) Cargar su contenido en una variable de texto (tipo String)
3) Buscar el dato necesitado
4) Migrar ese dato a una celda.
Para lograr los pasos arriba detallados se nos hará fundamental una cosa: determinar unívocamente que estamos buscando. Aquí hablamos de identificar solo una porción de texto entre miles y miles de caracteres, así que este punto es de vital importancia. Aquí nos será de gran ayuda la sintaxis del lenguaje HTML, ya que los tags (etiquetas) y otros atributos nos darán buenos puntos de referencia.
No voy a utilizar una web real, para evitar posibles problemas de autoría, robo de datos, etc, etc, etc y todos esos etc's que aparecen cada vez que alguien quiera hacerte lío.
Voy a "imitar" el código de una página web de cotizaciones muy conocido:
típico formato de un archivo html: las etiquetas, formatos y tablas.
Necesitamos extraer el precio del dólar. Vemos que existe una td (columna) que posee la class 'dolar' y contiene el valor buscado. Entonces ese será nuestro "punto de quiebre", ahí está nuestro valor.
Integraremos un formulario con los siguientes controles:
2 cuadros de texto: uno para la URL y otro para el valor que buscaremos.
1 boton de comando, para "disparar" nuestra macro.
Debe quedar así (no se preocupen en hacerlo, al final del post les dejo el link):
sencillo y simple
A continuación les dejo el código que logra poner en la celda A1 el valor del dólar que está "colgado" en una página web, dentro de una tabla y mezclado con cientos o miles de otros caracteres:
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long Dim MyURL, Valor, Ruta As String Private Sub cmdIniciar_Click() 'variables de uso local 'si no hay valor en alguno de los datos requeridos, aviso: '(utilizo a Trim() para eliminar cualquier espacio en blanco 'al principio o final de la cadena) If Trim(txtURL.Text) = "" Or Trim(txtValor.Text) = "" Then MsgBox "Faltan datos", vbExclamation, "Atención" Else 'concateno la cabecera a la dirección web ingresada por el usuario MyURL = "http://" & Trim(txtURL.Text) 'guardo el valor a buscar Valor = Trim(txtValor.Text) 'e indico donde descargaré el código html de la página Ruta = "D:\Ejemplos\Copia_Html.txt" 'llamo a la API, pasando los argumentos correctos: URLDownloadToFile 0, MyURL, Ruta, 0, 0 'ahora llamo a mi procedimiento, pasando los dos argumentos 'requeridos: MigrarValor Ruta, Valor End If End Sub Private Sub MigrarValor(ByVal R As String, ByVal V As String) 'variables de uso local Dim Cadena As String Dim Posicion, Posi2 As Long 'inicializo (por las dudas) la variable a 0 Posicion = 0 Open R For Input As #1 Do While Not EOF(1) 'tomo la línea de texto: Line Input #1, Cadena If InStr(1, Cadena, V) > 0 Then 'almaceno su posicion y salgo del bucle: Posicion = InStr(1, Cadena, V) Exit Do End If Loop Close #1 'si encontramos algo: If Posicion > 0 Then 'a la posicion original le sumo el largo (len()) 'del valor buscado: Posicion = Posicion + Len(V) 'ya tenemos donde empieza el valor buscado. podríamos ahora 'hacer uso nuevamente de INSTR() para buscar donde cierra la 'columna (tag ""), pero usaremos un bucle, para mostrar 'otras formas de realizar lo mismo. 'Recorro la cadena, hasta encontrar el signo "<", señal de 'que allí cierra la columna: For x = Posicion To Len(Cadena) 'cuando encuentro a "<" me voy del bucle, ya que en la 'variable "x" tengo la posición If Mid(Cadena, x, 1) = "<" Then Exit For End If Next x 'tenemos donde empieza y termina nuestro valor. entonces 'con Mid(texto, inicio, largo) extraemos el datos necesario. 'el largo (en este caso) está dado por la resta entre 'el final y la posicion inicial. 'en A1 colocamos el dato: Cells(1, 1).Value = Mid(Cadena, Posicion, (x - Posicion)) End If End Sub
ahá.. en A1 ya tenemos nuestra querida cotización, la cual va en alza (por lo menos aquí, en Argentina)
Lo principal, que era acceder al código HTML de una página web desde visual basic (vba en Excel) está cumplido y no es complicado. Restaría analizar cual es la mejor forma de buscar un determinado valor dentro del archivo TXT generado, pero allí si deberemos ajustar nuestra imaginación a las necesidades del proyecto, dado que existen cientos de formas distintas de llevarlo a cabo.
Podríamos mejorar esto con: a) un controlador de errores, b) una hoja que sirva de base de datos y vaya almacenando las URL y los Valores, para luego permitirle al usuario seleccionarlos y no repetir el ingreso de los datos, c) que la macro se ejecute al abrir el libro de excel, d) eliminar el archivo descargado, luego de utilizarlo. Y muchas mas, que dejo a criterio de cada uno. Ante la menor duda, me hacen un mensaje y listo.
Noten un asunto que, aunque no tiene nada que ver con todo esto, es primordial: la seguridad de los datos "colgados" en la web. El humilde robot que me diseñé hace un tiempo (con el objeto de almacenar código javascript y css) no es muy distinto a este ejemplo: con un bucle recorro cientos de páginas web (las que previamente guardé en una hoja de cálculos) buscando ciertos datos y me los llevo hacia Access, en donde finalmente creo consultas para discriminar lo recolectado por sitio, estructura, funciones.... todo con una simple macro, desde un pequeño libro de Excel, que no supera los 500 KB. ¿Puedo así obtener direcciones, números telefónicos, mails y otros asuntos? Si, por supuesto que puedo.
¿El tiempo que lleva? No me importa, por que dejo trabajando a mi "compu" unas buenas horas, mientras me voy a tomar unos exquisitos mates (con tortas fritas) a la costanera, disfrutando de un inmejorable paisaje.
Y luego vuelvo y puedo vender esos datos sin problemas, al gran y saludable mercado negro que hay en torno a este tipo de acciones. Así que cuidado con lo que escribimos.
Y ni hablé de la posibilidad de ingresar código PHP, redireccionando páginas o haciendo uso de ese potente lenguaje web desde una macro. Suerte y espero que este ejemplo les sea de utilidad en sus proyectos.
Link al ejemplo
POR CIERTO... ACA TOMO ESOS BENDITOS MATES:
simplemente hermoso
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Comentarios
Publicar un comentario