Saltar al contenido
PROGRAMAR EN VBA MACROS DE EXCEL

ESTADISTICAS Mundiales del CORONAVIRUS – Web Scraping – Raspado Web – 1007 Parte 3

Datos actualizados covid19 coronavirus

Estadísticas País por País del Coronavirus – Scraping Web – Raspado Web – Parte 3

En esta última parte del ejemplo, como hacer web scraping o raspado web con Excel VBA a página de estadísticas obteniendo las estadísticas mundiales actualizadas de Coronnavirus – Covid 19, veremos en detalle como se obtienen datos específicos de la web con Excel VBA, ya anteriormente vimos como recuperar una tabla con valores que son las estadísticas país por país de los casos de coronavirus covid-19, ahora veremos extraer datos específicos, ordenar los datos y guardarlos en Access.

Recuerden que cualquier otra explicación adicional que se requiera sobre las macros contenidas en este libro de Excel se debe hacer en los comentarios del vídeo tutorial asociado y se hará un ejemplo explicando lo que se requiera.

Entre otras cosas, lo más importante que se quiere mostrar, es como hacer scraping web o raspado web a un página de internet con Excel – VBA y como guardar datos en Access desde Excel, pero existen muchas macros más contenidas en este libro, que ya están explicadas en esta Web y en nuestro canal de YouTube, por ello se explicará en forma puntual lo contenido en este libro a pedido de los suscriptores del canal.

Los links de las tres partes de este ejemplo macro de Excel para realizar web scraping se muestra a continuación:

https://macrosenexcel.com/estadisticas-mundiales-del-coronavirus-web-scraping-raspado-web-1007/parte1

https://macrosenexcel.com/estadisticas-mundiales-del-coronavirus-web-scraping-raspado-web-1007-parte2

https://macrosenexcel.com/estadisticas-mundiales-del-coronavirus-web-scraping-raspado-web-1007-parte3/

Opera Excel como los mejores haz click acá, si quieres aprender sobre Excel en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet, te lo recomiendo no te arrepentirás.

Suscribe a nuestro canal de You Tube, mira el playlist con  vídeos relacionados donde podrás ver la macro en acción con una explicación en forma visual que ayudará a entender el ejemplo en forma más fácil.

Estadísticas on line Coronavirus en Excel – Scraping Web

Lo que se mostrará en esta tercera y última parte del ejemplo, será como obtener dato puntuales de la web (Scraping Web), lo que no quita que se explique en forma adicional relacionado con el tema lo que soliciten nuestros suscriptores en nuestro canal de you tube, ya que este ejemplo contiene muchas macros como modificación de Ribbon o Menu Excel para agregar pestaña e iconos personalizados, conectar con Access y guardar datos, Exportar datos a Excel, Exportar a PDF, Exportar a Word, Imprimir y muchas macros más que se pueden observar en el código al descargar el libro de ejemplo.

Se obtendrán datos específicos que existen en la web a la que se le hizo Sraping Web o Raspado Web con Excel – VBA, obteniendo la fecha de actualización, cantidad de casos actualizados de coronavirus o covid-19, cantidad de recuperados, etc., todos estos datos serán extraídos de la web https://www.worldometers.info/coronavirus/



Quizás también interese leer:

Punto de Venta con Excel – Access
Punto de Venta con Excel – Insertar Clientes Masivamente 
Punto de Venta con Excel – Menu Ribbon Personalizado 

Explicación de la Macro de Excel que Hace Scraping Web y Obtiene Datos de las Estadísticas Actualizadas Covid-19

En la parte 2 de este ejemplo se había visto como extraer los datos de la tabla que se encuentra en la página a la que se está haciendo un Raspado Web para obtener datos de una Tabla Web y Mostrarlos en Excel con VBA, ahora se mostrará como obtener datos puntuales, es decir se obtendrá del Html extraído y guardado en la variable «MyRespu» los datos que necesitamos para mostrar en Excel, recuerden que entre otros datos se necesita la fecha de ultima actualización, total de casos coranavirus a nivel mundial, total de recuperados etc..

En las filas 6 a 19 se muestran los totales a nivel mundial, estos son los datos que vamos a extraer de la variable «MyRespu», se va a explicar como se extrae el dato «fecha de actualización», porque el procedimiento para extraer el resto de los datos es muy similar.

El dato que se va a extraer con el siguiente código es la fecha de última actualización, que si ingresan a la web de la cual se está haciendo scraping web se encuentra en la parte superior, nosotros ya tenemos el código de toda la página en la variable «MyRespu» de ella vamos a extraer los datos que se necesitan:

Debemos ir a la web usando el navegador Chrome o cualquier otro, con segundo botón del mouse se debe elegir el menú inspeccionar y se muestra el código Htlm, se debe buscar donde se encuentra el código con el dato que necesitamos en este caso la fecha de actualización.

Como información útil también funciona si gravamos la variable «MyRespu» en una celda, copiamos y pegamos en un archivo TXT y buscamos el código allí, me parece que inspeccionando de Google Chrome es más fácil, cada uno lo hará como le resulte más practico.

Entonces vamos a buscar el dato que necesitamos y luego una cadena de texto anterior y otra posterior al dato, es decir el dato quedará entre medio de esas cadenas de texto, luego se usa códigos para trabajar con cadena de texto en Excel – VBA, para extraer el dato necesario.

Entonces el texto anterior al dato que necesitamos lo colocamos en la variable principio así:


Principio = «>Last updated: «

El texto que esta posterior al dato que necesitamos en este caso fecha de última actualización, lo colocamos en la variable final:

Final = «<a href=»»/coronavirus/coronavirus-cases/»»> Case Graphs»



Para limpiar el texto obtenemos la posición inicial de la variable Principio y de la Variable final, extrayendo de todo el código Html contenido en la variable MyRespu obteniendo una cadena de texto con el dato que buscamos entre medio de esa cadena, ahora solo resta limpiar la cadena de texto o string para obtener el dato deseado, se usan los siguientes códigos:

Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))

Luego eliminamos la cadena de texto de la variable principio y que está contenida en la variable dato, reemplazándola por un carácter vacío, obteniendo una Variable Lastupdate con el dato que necesitamos, es decir la ultima fecha de actualización y una porción de cadena de texto detrás que hay que eliminar, de la siguiente forma:

Lastupdate = Replace(dato, Principio, «»)

Luego eliminamos las comillas de la cadena de texto para que sea más fácil trabajar en VBA eso se hace usando el código Ascii que representa a las comillas y se reemplaza por un carácter vacío:

Lastupdate = Replace(Lastupdate, Chr(34), «»)

Finalizando se elimina la parte de atrás o la que sigue a cadena de caracteres que contiene el dato que necesitamos, para ello se elimina en dos pasos el código así:

Lastupdate = Replace(Lastupdate, «</div>», «»)
Lastupdate = Replace(Lastupdate, «<div style=margin-top:20px; text-align:center; font-size:14px>», «»)

Ahora los resta eliminar las tabulaciones que pudieren existir y queda el dato buscado totalmente limpio para pegar en la celda hoja de Excel donde lo necesitamos.

Lastupdate = Replace(Lastupdate, Chr(10), «») ‘elimina tabulaciones

Lo mismo se hace con cada uno de los datos que necesitamos en la hoja de Excel, la macro una vez obtenido los datos los pega en la hoja de Excel así:

b.Range(«D7») = TotalCasos
b.Range(«D8») = TotalMuertos
b.Range(«D9») = TotalRecuperados

Como dar Formato a los Datos Extraídos de la Web por medio de Web Scrapin o Raspado Web

En este caso se le da formato de color alternado para que sea más fácil de seguir los datos visualmente, esto se logra con este bucle:

For x = 23 To uf Step 2
d.Range(«A» & x & «:I» & x).Interior.Color = 13082801 ‘morado claro 13082801 ‘5296274 verde claro
Next x

Primero se le da formato a la celdas de encabezado de las columnas, dando color al interior de la celda negro, fuente color blanca y negrita, así:

With d.Range(«A21:I21»)
.Interior.Color = 0 ‘negro
.Font.Color = 16777215 ‘blanco
.Font.Bold = True
.HorizontalAlignment = xlCenter
End With

Luego el ancho a las columnas, así:

d.Range(«A:A»).ColumnWidth = 17
d.Range(«B:B»).ColumnWidth = 10.71
d.Range(«C:C»).ColumnWidth = 12.14
d.Range(«D:D»).ColumnWidth = 12
d.Range(«E:E»).ColumnWidth = 14
d.Range(«F:F»).ColumnWidth = 11.86
d.Range(«G:G»).ColumnWidth = 12.43
d.Range(«H:H»).ColumnWidth = 12.57
d.Range(«I:I»).ColumnWidth = 12.43

Se le da borde a las celdas de la siguiente manera:

With d.Range(«A21:I» & uf)
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeLeft).Weight = xlThin
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeTop).Weight = xlThin
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Weight = xlThin
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeRight).Weight = xlThin
.Borders(xlInsideVertical).LineStyle = xlContinuous
.Borders(xlInsideVertical).Weight = xlThin
.Borders(xlInsideHorizontal).LineStyle = xlNxlContinuousone
.Borders(xlInsideHorizontal).Weight = xlThin
.VerticalAlignment = xlCenter
End With

Por último se hace un link a Google Maps con cada país que figura en el listado de países con casos de coronavirus o covid 19, se usa el siguiente código:

uf = d.Range(«A» & Rows.Count).End(xlUp).Row – 1
For x = 22 To uf
d.Range(«I» & x) = d.Range(«I» & x) * 1 ‘multiplica por 1 para tranformar texto en número
d1 = «https://maps.google.es/maps?q=» & d.Range(«A» & x)
dt = d.Range(«A» & x)
d.Hyperlinks.Add Anchor:=d.Range(«A» & x), Address:=d1, TextToDisplay:=dt
Next x

Como Guardar en Access desde Excel Datos Obtenidos por Scraping Web de las Estadísticas Actualizadas del Coronavirus

El código se encuentra en el módulo Insertar de este ejemplo de macro de Excel para hace raspado web, en primer lugar se crean los objetos conexión y recordset que contendrá los datos de la consulta SQL, así:

Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset

Luego determinamos la dirección de la base de datos de Access a la cual nos conectaremos para guardar los datos, por ello es importante que desde el setup se elija donde se encuentra guardado el archivo con la base de datos.

Es posible puede poner una dirección estática, pero se optó por obtener la misma desde la configuración para que pueda ser dinámica y cada uno elija donde quiere guardar la base de datos, en el caso del ejemplo el Setup para configurar donde se encuentra el archivo de Access con la base de datos, esta se guarda en la hoja «Parametros» y desde ahí se obtiene la dirección de la base de datos que se carga en la variable «mybookindice», se usa el siguiente código:

mybookindice = Sheets(«Parametros»).Range(«C2»)

Luego se abre la conexión entre Excel y Access, de la siguiente forma:
cn.Open «Provider=Microsoft.ACE.OLEDB.12.0; » & «data source=» & mybookindice & «;»



Conectado con la base de datos de Access se consulta la fecha que se pretende guardar está en la base de datos de Access desde Excel, en caso de se positivo no se deja guardar el dato y se sale de la macro, no realizándose absolutamente nada, se usa el siguiente código.

‘Sql = «SELECT Fecha, Pais, Casos, Nuevos_Casos, Muertes, Nuevas_Muertes, Recuperados, Casos_Activos, Casos_Criticos, Casos_1M_Pob FROM DB_COVID_19 WHERE Fecha = ‘» & a.ComboBox2 & «‘»
Sql = «SELECT Fecha FROM DB_COVID_19 WHERE Fecha = ‘» & a.ComboBox2 & «‘»
Set rs = cn.Execute(Sql)
myfecha = rs.fields(0)
Set rs = Nothing
If myfecha <> Empty Then MsgBox («Los datos ya existen en la base de datos»), vbCritical, «AVISO»: Exit Sub

Si la fecha que se pretende guardar no se encuentra en la base de datos Excel permite guardar los datos en Access, para ello utiliza SQL más precisamente la sentencia INSERT INTO, que establece cuales son los títulos de los campos o encabezado de columnas y cuales son los datos que se van a guardar, en este caso se hace un bucle desde la primer a la última fila con datos, es decir se guardarán los datos del primer país listado hasta el último país listado, se usa el siguiente código:

‘Graba datos en base de datos
uf = a.Range(«A» & Rows.Count).End(xlUp).Row – 1
For x = 22 To uf
Sql = «INSERT INTO DB_COVID_19 (Fecha, Pais, Casos, Nuevos_Casos, Muertes, Nuevas_Muertes, Recuperados, Casos_Activos, Casos_Criticos, Casos_1M_Pob) VALUES (‘» & a.ComboBox2 & «‘, ‘» & a.Cells(x, «A») & «‘, » & a.Cells(x, «B») & «, » & a.Cells(x, «C») & «, » & a.Cells(x, «D») & «, » & a.Cells(x, «E») & «, » & a.Cells(x, «F») & «, » & a.Cells(x, «G») & «, » & a.Cells(x, «H») & «, ‘» & a.Cells(x, «I») & «‘)»
cn.Execute Sql
Next x

Por último se actualiza el combobox con las fechas registradas en la base de datos se usa el siguiente código para llegar combobox con datos obtenidos por SQL desde Access:


a.ComboBox2.Clear
Sql = «SELECT DISTINCT Fecha FROM DB_COVID_19»
Set rs = cn.Execute(Sql)
Do While rs.EOF = False
a.ComboBox2.AddItem rs.fields(0)
rs.MoveNext
Loop

Descarga del Libro Excel con código del ejemplo Como Hacer Scraping Web o Raspado Web

Seguidamente al código que se existe en los distintos módulos que componen la programación del Libro de Excel como hacer Sraping Web o Raspado Web y obtener Estadísticas Mundiales del Coronavirus Covid 19 País por País, se encuentra el link de descarga del libro de ejemplo usado, es un archivo comprimido que contiene tres archivos: la macro de Excel, archivo de Access con la base de datos y un Pdf que se usa para la ayuda, se deben guardar los tres en el mismo directorio y ejecutar el setup para indicarle a la macro donde está la base de datos de Access para que pueda guardar los datos, caso contrario no funcionará el guardado en Access si funcionará el resto de la macro, aporta a sostener la esta web si está dentro de tus posibilidades, desde ya muchas gracias.

Código que va en el módulo Actualizar

Sub ObtieneEstadistica()
Dim MyRespu As String, MyTable As Object
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next

‘Elimina, crea hoja, asigna nombre
For Each she In Worksheets
mys = she.Name
If she.Name = «Actualizar» Then she.Delete
Next
ActiveWorkbook.Sheets.Add AFTER:=Worksheets(Worksheets.Count)
ActiveSheet.Name = «Actualizar»

UserForm1.ProgressBar1.Value = 20
UserForm1.Label1.Caption = «20 %»
DoEvents

Set a = Sheets(«Actualizar»)
a.Cells.Delete
Set b = Sheets(«Estadisticas»)

UserForm1.ProgressBar1.Value = 30
UserForm1.Label1.Caption = «30 %»
DoEvents

Application.DisplayAlerts = False

With CreateObject(«MSXML2.XMLHTTP»)
.Open «GET», «https://www.worldometers.info/coronavirus/», False
.send
ActiveWindow.Application.SendKeys «(~)»
MyRespu = StrConv(.responseBody, vbUnicode)
End With

MyRespu = Mid$(MyRespu, InStr(1, MyRespu, «<!DOCTYPE «))

With CreateObject(«htmlFile»)
.Write MyRespu

Set MyTable = .getElementsByTagName(«table»)(0)
End With

UserForm1.ProgressBar1.Value = 40
UserForm1.Label1.Caption = «40 %»
DoEvents

Sheets(«Actualizar»).Select
WriteTable MyTable

UserForm1.ProgressBar1.Value = 50
UserForm1.Label1.Caption = «50 %»
DoEvents

‘Copia y ordena los datos en la hoja Estadistica
If b.FilterMode = True Then b.ShowAllData
ufb = b.Range(«A» & Rows.Count).End(xlUp).Row
If ufb <= 21 Then ufb = 22
b.Range(«A22:I» & ufb).Clear

b.Range(«F2:I2»).Merge
b.Range(«F2:I2»).HorizontalAlignment = xlCenter

b.Range(«A6») = «TOTAL CASOS CORONAVIRUS – COVID 19»
b.Range(«A7») = «TOTAL CASOS»
b.Range(«A8») = «TOTAL MUERTOS»
b.Range(«A9») = «TOTAL RECUPERADOS»

b.Range(«A11») = «TOTAL CASOS ACTIVOS»
b.Range(«A12») = «TOTAL INFECTADOS»
b.Range(«A13») = «TOTAL CONDICION LEVE»
b.Range(«A14») = «TOTAL CONDICION CRITICA»

b.Range(«A16») = «TOTAL CASOS CERRADOS»
b.Range(«A17») = «TOTAL CASOS TUVIERON RESULTADO»
b.Range(«A18») = «TOTAL RECUPERADOS»
b.Range(«A19») = «TOTAL MUERTOS»

UserForm1.ProgressBar1.Value = 60
UserForm1.Label1.Caption = «60 %»
DoEvents

a.ranga(«J1») = MyRespu

‘Ultima actualización
Principio = «>Last updated: «
Final = «<a href=»»/coronavirus/coronavirus-cases/»»> Case Graphs»
Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))
Lastupdate = Replace(dato, Principio, «»)
Lastupdate = Replace(Lastupdate, Chr(34), «»)
Lastupdate = Replace(Lastupdate, «</div>», «»)
Lastupdate = Replace(Lastupdate, «<div style=margin-top:20px; text-align:center; font-size:14px>», «»)
Lastupdate = Replace(Lastupdate, Chr(10), «») ‘elimina tabulaciones

‘Total de Casos
Principio = «<span style=»»color:#aaa»»>»
Final = «<a href=»»#countries»»>view by country</a>»
Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))
TotalCasos = Replace((Replace(dato, Principio, «»)), «,», «»)
Posi3 = InStr(TotalCasos, » «)
TotalCasos = Left(TotalCasos, Posi3)
TotalCasos = Replace(TotalCasos, «,», «»)

‘Total de Muertos
Principio = «<h1>Deaths:</h1>»
Final = «<h1>Recovered:</h1>»
Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))
TotalMuertos = Replace((Replace(dato, Principio, «»)), «,», «»)
TotalMuertos = Replace(TotalMuertos, Chr(34), «») ‘elimina comillas
TotalMuertos = Replace(TotalMuertos, «<div class=maincounter-number>», «»)
TotalMuertos = Replace(TotalMuertos, «<span>», «») ‘elimina texto
TotalMuertos = Replace(TotalMuertos, «</span>», «»)
Posi3 = InStr(TotalMuertos, «</div>»)
TotalMuertos = Left(TotalMuertos, Posi3 – 1)
TotalMuertos = Replace(TotalMuertos, Chr(32), «») ‘elimina espacio blanco
TotalMuertos = Replace(TotalMuertos, Chr(10), «») ‘elimina tabulaciones

‘Total de Recuperados
Principio = «<h1>Recovered:</h1>»
Final = «<div style=»»margin-top:50px;»»>»
Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))
TotalRecuperados = Replace((Replace(dato, Principio, «»)), «,», «»)
TotalRecuperados = Replace(TotalRecuperados, Chr(34), «») ‘elimina comillas
TotalRecuperados = Replace(TotalRecuperados, «<div class=maincounter-number style=color:#8ACA2B >», «»)
TotalRecuperados = Replace(TotalRecuperados, «<span>», «») ‘elimina texto
TotalRecuperados = Replace(TotalRecuperados, «</span>», «»)
Posi3 = InStr(TotalRecuperados, «</div>»)
TotalRecuperados = Left(TotalRecuperados, Posi3 – 1)
TotalRecuperados = Replace(TotalRecuperados, Chr(32), «») ‘elimina espacio blanco
TotalRecuperados = Replace(TotalRecuperados, Chr(10), «») ‘elimina tabulaciones

UserForm1.ProgressBar1.Value = 70
UserForm1.Label1.Caption = «70 %»
DoEvents

‘Total de Infectados
Principio = «<div class=»»panel-body»» style=»»text-align:center; height:200px;»»>»
Final = «<div style=»»font-size:13.5px»»>Currently Infected Patients»
Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))
TotalInfectados = Replace((Replace(dato, Principio, «»)), «,», «»)
TotalInfectados = Replace(TotalInfectados, Chr(34), «») ‘elimina comillas
TotalInfectados = Replace(TotalInfectados, «<div class=panel_flip>», «»)
TotalInfectados = Replace(TotalInfectados, «<div class=panel_front style=width:100%;height:100%;>», «»)
TotalInfectados = Replace(TotalInfectados, «<div class=number-table-main>», «»)
Posi3 = InStr(TotalInfectados, «</div>»)
TotalInfectados = Left(TotalInfectados, Posi3 – 1)
TotalInfectados = Replace(TotalInfectados, Chr(32), «») ‘elimina espacio blanco
TotalInfectados = Replace(TotalInfectados, Chr(10), «») ‘elimina tabulaciones

‘Total de Condicion Leve
Principio = «Currently Infected Patients</div>»
Final = «<div style=»»font-size:13px»»>in Mild Condition»
Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))
TotalLeves = Replace((Replace(dato, Principio, «»)), «,», «»)
TotalLeves = Replace(TotalLeves, Chr(34), «») ‘elimina comillas
TotalLeves = Replace(TotalLeves, «<div style=padding-top:20px;position:relative;text-align:center; >», «»)
TotalLeves = Replace(TotalLeves, «<div style=float:left; text-align:center>», «»)
TotalLeves = Replace(TotalLeves, «<span class=number-table style=color:#8080FF>», «»)
Posi3 = InStr(TotalLeves, «</span>»)
TotalLeves = Left(TotalLeves, Posi3 – 1)
TotalLeves = Replace(TotalLeves, Chr(32), «») ‘elimina espacio blanco
TotalLeves = Replace(TotalLeves, Chr(10), «») ‘elimina tabulaciones

‘Total de Condición Critica
Principio = «in Mild Condition</div>»
Final = «<div style=»»font-size:13px»»>Serious or Critical»
Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))
TotalCriticos = Replace((Replace(dato, Principio, «»)), «,», «»)
TotalCriticos = Replace(TotalCriticos, Chr(34), «») ‘elimina comillas
TotalCriticos = Replace(TotalCriticos, «<br>», «»)
TotalCriticos = Replace(TotalCriticos, «</div>», «»)
TotalCriticos = Replace(TotalCriticos, «<div style=float:right; text-align:center><span class=number-table style=color:red >», «»)
Posi3 = InStr(TotalCriticos, «</span>»)
TotalCriticos = Left(TotalCriticos, Posi3 – 1)
TotalCriticos = Replace(TotalCriticos, Chr(32), «») ‘elimina espacio blanco
TotalCriticos = Replace(TotalCriticos, Chr(10), «») ‘elimina tabulaciones

‘Total de Casos Cerrados
Principio = «Closed Cases</span>»
Final = «<div style=»»font-size:13.5px»»>Cases which had an outcome:»
Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))
TotalCerrado = Replace((Replace(dato, Principio, «»)), «,», «»)
TotalCerrado = Replace(TotalCerrado, Chr(34), «») ‘elimina comillas
TotalCerrado = Replace(TotalCerrado, «</div>», «»)
TotalCerrado = Replace(TotalCerrado, «<div class=panel-body style=text-align:center;height:200px;>», «»)
TotalCerrado = Replace(TotalCerrado, «<div class=panel_flip>», «»)
TotalCerrado = Replace(TotalCerrado, «<div class=panel_front style=width:100%;height:100%;>», «»)
TotalCerrado = Replace(TotalCerrado, «<div class=number-table-main>», «»)
Posi3 = InStr(TotalCerrado, «</div>»)
TotalCerrado = Left(TotalCerrado, Posi3 – 1)
TotalCerrado = Replace(TotalCerrado, Chr(32), «») ‘elimina espacio blanco
TotalCerrado = Replace(TotalCerrado, Chr(10), «») ‘elimina tabulaciones



‘Total de Recuperados
Principio = «Cases which had an outcome:</div>»
Final = «<div style=»»font-size:13px»»>Recovered»
Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))
TotalCerradoRecuperados = Replace((Replace(dato, Principio, «»)), «,», «»)
TotalCerradoRecuperados = Replace(TotalCerradoRecuperados, Chr(34), «») ‘elimina comillas
TotalCerradoRecuperados = Replace(TotalCerradoRecuperados, «<div style=padding-top:20px >», «»)
TotalCerradoRecuperados = Replace(TotalCerradoRecuperados, «<div style=float:left; text-align:center>», «»)
TotalCerradoRecuperados = Replace(TotalCerradoRecuperados, «<span class=number-table style=color:#8ACA2B>», «»)
Posi3 = InStr(TotalCerradoRecuperados, «</span>»)
TotalCerradoRecuperados = Left(TotalCerradoRecuperados, Posi3 – 1)
TotalCerradoRecuperados = Replace(TotalCerradoRecuperados, Chr(32), «») ‘elimina espacio blanco
TotalCerradoRecuperados = Replace(TotalCerradoRecuperados, Chr(10), «») ‘elimina tabulaciones

‘Total de Muertos
Principio = «Recovered / Discharged</div>»
Final = «<div style=»»font-size:13px»»>Deaths»
Posi1 = InStr(MyRespu, Principio)
Posi2 = InStr(MyRespu, Final)
dato = Mid(MyRespu, Posi1, (Posi2 – Posi1))
TotalCerradoMuertos = Replace((Replace(dato, Principio, «»)), «,», «»)
TotalCerradoMuertos = Replace(TotalCerradoMuertos, Chr(34), «») ‘elimina comillas
TotalCerradoMuertos = Replace(TotalCerradoMuertos, «<br>», «»)
TotalCerradoMuertos = Replace(TotalCerradoMuertos, «</div>», «»)
TotalCerradoMuertos = Replace(TotalCerradoMuertos, «<div style=float:right; text-align:center><span class=number-table>», «»)
Posi3 = InStr(TotalCerradoMuertos, «</span>»)
TotalCerradoMuertos = Left(TotalCerradoMuertos, Posi3 – 1)
TotalCerradoMuertos = Replace(TotalCerradoMuertos, Chr(32), «») ‘elimina espacio blanco
TotalCerradoMuertos = Replace(TotalCerradoMuertos, Chr(10), «») ‘elimina tabulaciones

UserForm1.ProgressBar1.Value = 80
UserForm1.Label1.Caption = «80 %»
DoEvents

b.Range(«F2») = Lastupdate
Application.EnableEvents = False
b.ComboBox2 = Lastupdate

b.Range(«D7») = TotalCasos
b.Range(«D8») = TotalMuertos
b.Range(«D9») = TotalRecuperados

b.Range(«D12») = TotalInfectados
b.Range(«D13») = TotalLeves
b.Range(«D14») = TotalCriticos

b.Range(«D17») = TotalCerrado
b.Range(«D18») = TotalCerradoRecuperados
b.Range(«D19») = TotalCerradoMuertos

uf = a.Range(«A» & Rows.Count).End(xlUp).Row + 1
a.Range(«A2:I» & uf).Copy
b.Range(«A22»).PasteSpecial xlPasteValues

b.Range(«A21») = «País»
b.Range(«B21») = «Casos»
b.Range(«C21») = «Nuevos Casos»
b.Range(«D21») = «Muertes»
b.Range(«E21») = «Nuevas Muertes»
b.Range(«F21») = «Recuperados»
b.Range(«G21») = «Casos Activos»
b.Range(«H21») = «Casos Criticos»
b.Range(«I21») = «Casos/1M Pob»

uf = b.Range(«A» & Rows.Count).End(xlUp).Row – 1
For x = 3 To 9
For j = 22 To uf
If b.Cells(j, x) = Empty Then b.Cells(j, x) = 0
Next j
Next x

UserForm1.ProgressBar1.Value = 90
UserForm1.Label1.Caption = «90 %»
DoEvents

‘uf = b.Range(«A» & Rows.Count).End(xlUp).Row
‘For x = 23 To uf Step 2
‘b.Range(«A» & x & «:I» & x).Interior.Color = 13082801 ‘morado claro 13082801 ‘5296274 verde claro
‘Next x
‘b.Range(«A» & uf & «:I» & uf).Font.Bold = True
Call Formato

Application.DisplayAlerts = False
Application.ScreenUpdating = False
‘MsgBox («Los datos se han importado con éxito » & b.Range(«E2»)), vbInformation, «AVISO»
a.Delete
b.Select
Range(«A1»).Select

UserForm1.ProgressBar1.Value = 100
UserForm1.Label1.Caption = «100 %»
DoEvents

Unload UserForm1
Application.StatusBar = Clear
‘Application.EnableEvents = True
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Public Sub WriteTable(ByVal MyTable As Object, Optional ByVal StarR As Long = 1, Optional ByVal Ws As Worksheet)
Dim tSection As Object, tRow As Object, tCell As Object, tr As Object, td As Object, R As Long, C As Long, tBody As Object
Dim Titulos As Object, Titulo As Object, CantCol As Long

If Ws Is Nothing Then Set Ws = ActiveSheet
R = StarR
With ActiveSheet
Set Titulos = MyTable.getElementsByTagName(«th»)
For Each Titulo In Titulos
CantCol = CantCol + 1
.Cells(StarR, CantCol) = Titulo.innerText
Next Titulo
StarR = StarR + 1
Set tBody = MyTable.getElementsByTagName(«tbody»)
For Each tSection In tBody ‘HTMLTableSection
Set tRow = tSection.getElementsByTagName(«tr») ‘HTMLTableRow
For Each tr In tRow
R = R + 1
Set tCell = tr.getElementsByTagName(«td»)
C = 1
For Each td In tCell ‘DispHTMLElementCollection
.Cells(R, C).Value = td.innerText ‘HTMLTableCell
C = C + 1
Next td
Next tr
Next tSection
End With
End Sub

Código que va en el módulo Herramientas

Sub Formato()
Set d = Sheets(«Estadisticas»)

d.Range(«A2:V4»).Interior.Color = 12611584 ‘celeste oscuro
d.Range(«E2:I4,B2:C4»).Font.Color = 12611584 ‘celeste oscuro
d.Range(«A2:A3,D3»).Font.Color = 16777215 ‘blanco
d.Range(«A1:V1»).Interior.Color = 0 ‘negro
d.Range(«A1:V1»).Font.Color = 16777215 ‘blanco
d.Range(«F6:I19»).Interior.Color = 16777215 ‘blanco
d.Range(«F6:I6»).Interior.Color = 13082801 ‘Morado claro

With d.Range(«A21:I21»)
.Interior.Color = 0 ‘negro
.Font.Color = 16777215 ‘blanco
.Font.Bold = True
.HorizontalAlignment = xlCenter
End With

uf = d.Range(«A» & Rows.Count).End(xlUp).Row
If uf < 21 Then uf = 21

For x = 23 To uf Step 2
d.Range(«A» & x & «:I» & x).Interior.Color = 13082801 ‘morado claro 13082801 ‘5296274 verde claro
Next x

d.Range(«J:J»).Interior.Color = xlNone
d.Range(«J1:J» & uf).Interior.Color = 49407

d.Range(«B22:H» & uf & «,D7:D9,D12:D14,D17:D19»).NumberFormat = «#,##0»
d.Range(«I22:I» & uf & «,D7:D9,D12:D14,D17:D19»).NumberFormat = «#,##0.00»

d.Range(«A:A»).ColumnWidth = 17
d.Range(«B:B»).ColumnWidth = 10.71
d.Range(«C:C»).ColumnWidth = 12.14
d.Range(«D:D»).ColumnWidth = 12
d.Range(«E:E»).ColumnWidth = 14
d.Range(«F:F»).ColumnWidth = 11.86
d.Range(«G:G»).ColumnWidth = 12.43
d.Range(«H:H»).ColumnWidth = 12.57
d.Range(«I:I»).ColumnWidth = 12.43

With d.Range(«A21:I» & uf)
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeLeft).Weight = xlThin
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeTop).Weight = xlThin
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Weight = xlThin
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeRight).Weight = xlThin
.Borders(xlInsideVertical).LineStyle = xlContinuous
.Borders(xlInsideVertical).Weight = xlThin
.Borders(xlInsideHorizontal).LineStyle = xlNxlContinuousone
.Borders(xlInsideHorizontal).Weight = xlThin
.VerticalAlignment = xlCenter
End With

With d.Range(«A» & uf & «:I» & uf)
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeLeft).Weight = xlThin
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeTop).Weight = xlThin
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Weight = xlThin
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeRight).Weight = xlThin
.Font.Bold = True
End With

‘Link a google maps
uf = d.Range(«A» & Rows.Count).End(xlUp).Row – 1
For x = 22 To uf
d.Range(«I» & x) = d.Range(«I» & x) * 1 ‘multiplica por 1 para tranformar texto en número
d1 = «https://maps.google.es/maps?q=» & d.Range(«A» & x)
dt = d.Range(«A» & x)
d.Hyperlinks.Add Anchor:=d.Range(«A» & x), Address:=d1, TextToDisplay:=dt
Next x
End Sub

Sub Limpiar()
Set a = Sheets(«Estadisticas»)
a.Range(«C2:D3»).ClearContents
a.TextBox2.Visible = False
a.ComboBox1 = «País»
a.TextBox1 = Clear
End Sub

Sub GuardarPDF()
Set b = Sheets(«Estadisticas»)
uf = Range(«A» & Rows.Count).End(xlUp).Row
nompdf = b.Range(«A1″) & » » & Date
nompdf = Replace(nompdf, «\», «-«)
nompdf = Replace(nompdf, «/», «-«)
nompdf = Replace(nompdf, «:», «-«)
nompdf = Replace(nompdf, «*», «-«)
nompdf = Replace(nompdf, «?», «-«)
nompdf = Replace(nompdf, «»»», «-«)
nompdf = Replace(nompdf, «<«, «-«)
nompdf = Replace(nompdf, «>», «-«)
nompdf = Replace(nompdf, «|», «-«)
nompdf = Replace(nompdf, «(«, «»)
nompdf = Replace(nompdf, «)», «-«)

ruta = Sheets(«Parametros»).Range(«E2»)
rutapdf1 = ruta & «\» & nompdf & «.pdf»
b.Range(«A1:I» & uf).ExportAsFixedFormat Type:=xlTypePDF, Filename:=rutapdf1, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
MsgBox («El archivo se guardó con éxito»), vbInformation, «AVISO»
End Sub

Sub ExportaExcel()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set b = Sheets(«Estadisticas»)
uf = Range(«A» & Rows.Count).End(xlUp).Row
nomexc = b.Range(«A1″) & » » & Date
nomexc = Replace(nomexc, «\», «-«)
nomexc = Replace(nomexc, «/», «-«)
nomexc = Replace(nomexc, «:», «-«)
nomexc = Replace(nomexc, «*», «-«)
nomexc = Replace(nomexc, «?», «-«)
nomexc = Replace(nomexc, «»»», «-«)
nomexc = Replace(nomexc, «<«, «-«)
nomexc = Replace(nomexc, «>», «-«)
nomexc = Replace(nomexc, «|», «-«)
nomexc = Replace(nomexc, «(«, «»)
nomexc = Replace(nomexc, «)», «-«)

ruta = Sheets(«Parametros»).Range(«D2»)
rutaexc1 = ruta & «\» & nomexc & «.xlsx»
nomarchi = nomexc & «.xlsx»

ActiveSheet.Copy
ActiveSheet.Shapes(«Combobox1»).Delete
ActiveSheet.Shapes(«Textbox1»).Delete
‘ActiveSheet.Columns(«A:H»).AutoFit

ActiveWorkbook.SaveAs Filename:=rutaexc1, FileFormat:=xlOpenXMLWorkbook
Workbooks(nomarchi).Close True

MsgBox («El archivo Excel se generó con éxito»), vbInformation, «AVISO»
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Sub VistaPrevia()
On Error Resume Next
Application.Dialogs(xlDialogPrintPreview).Show
End Sub

Sub Imprime()
On Error Resume Next
ActiveSheet.PrintOut Copies:=2, Collate:=True, IgnorePrintAreas:=False
End Sub

Sub Ordenar()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
Set a = Sheets(«Estadisticas»)
‘Ordena datos de la base en forma descendente para cargar datos descendente en combobox
uf = a.Range(«C» & Rows.Count).End(xlUp).Row
R = «I14:I» & uf
r1 = «A14:I» & uf

‘sorts the data
a.Sort.SortFields.Clear
a.Sort.SortFields.Add Key:=Range(R), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With a.Sort
.SetRange Range(r1)
.header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Sub Quitafiltro()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
On Error Resume Next
Set a = Sheets(«Estadisticas»)
If a.FilterMode = True Then a.ShowAllData
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Código que va en el módulo Insertar

Sub InsertaEstadisticasCovid19()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim cn As ADODB.Connection, rs As ADODB.Recordset
On Error Resume Next
Set a = Sheets(«Estadisticas»)
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
mybookindice = Sheets(«Parametros»).Range(«C2»)
cn.Open «Provider=Microsoft.ACE.OLEDB.12.0; » & «data source=» & mybookindice & «;»

‘Verifica si la fecha y hora que se intenta ingresar ya fue registrada
‘Sql = «SELECT Fecha, Pais, Casos, Nuevos_Casos, Muertes, Nuevas_Muertes, Recuperados, Casos_Activos, Casos_Criticos, Casos_1M_Pob FROM DB_COVID_19 WHERE Fecha = ‘» & a.ComboBox2 & «‘»
Sql = «SELECT Fecha FROM DB_COVID_19 WHERE Fecha = ‘» & a.ComboBox2 & «‘»
Set rs = cn.Execute(Sql)
myfecha = rs.fields(0)
Set rs = Nothing
If myfecha <> Empty Then MsgBox («Los datos ya existen en la base de datos»), vbCritical, «AVISO»: Exit Sub

‘Graba datos en base de datos
uf = a.Range(«A» & Rows.Count).End(xlUp).Row – 1
For x = 22 To uf
Sql = «INSERT INTO DB_COVID_19 (Fecha, Pais, Casos, Nuevos_Casos, Muertes, Nuevas_Muertes, Recuperados, Casos_Activos, Casos_Criticos, Casos_1M_Pob) VALUES (‘» & a.ComboBox2 & «‘, ‘» & a.Cells(x, «A») & «‘, » & a.Cells(x, «B») & «, » & a.Cells(x, «C») & «, » & a.Cells(x, «D») & «, » & a.Cells(x, «E») & «, » & a.Cells(x, «F») & «, » & a.Cells(x, «G») & «, » & a.Cells(x, «H») & «, ‘» & a.Cells(x, «I») & «‘)»
cn.Execute Sql
Next x

‘Application.EnableEvents = False ‘Anula el evento change del combbox al escribir en el
‘Carga combobox
a.ComboBox2.Clear
Sql = «SELECT DISTINCT Fecha FROM DB_COVID_19»
Set rs = cn.Execute(Sql)
Do While rs.EOF = False
a.ComboBox2.AddItem rs.fields(0)
rs.MoveNext
Loop
‘Application.EnableEvents = True

Set rs = Nothing
cn.Close
Set cn = Nothing

MsgBox («Las estadísticas se guardaron con éxito en la base de datos access»), vbInformation, «AVISO»
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Código que va en el módulo Menu



#If VBA7 And Win64 Then
‘Si es de 64 bits
Public Declare PtrSafe Function ShellExecute Lib «shell32.dll» Alias «ShellExecuteA» (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
Public Declare PtrSafe Function FindWindow Lib «user32» Alias «FindWindowA» (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Public Declare PtrSafe Function GetWindowLongPtr Lib «user32» Alias «GetWindowLongPtrA» (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
Public Declare PtrSafe Function SetWindowLongPtr Lib «user32» Alias «SetWindowLongPtrA» (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Public Declare PtrSafe Function DrawMenuBar Lib «user32» (ByVal hwnd As Long) As LongPtr
Public Declare PtrSafe Function RegOpenKeyA Lib «advapire32.dll» (ByVal hKey As LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As LongPtr
Public Declare PtrSafe Function SetCursorPos Lib «user32» (ByVal x As LongPtr, ByVal y As LongPtr) As LongPtr
Public Declare PtrSafe Sub mouse_event Lib «user32» (ByVal dwFlags As LongPtr, ByVal dx As LongPtr, ByVal dy As LongPtr, ByVal cButtons As LongPtr, ByVal dwExtraInfo As LongPtr)
Public Declare PtrSafe Function SetWindowPos Lib «user32» (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As LongPtr, ByVal y As LongPtr, ByVal cx As LongPtr, ByVal cy As LongPtr, ByVal wFlags As LongPtr) As LongPtr
Public Declare PtrSafe Function SetForegroundWindow Lib «user32» (ByVal hwnd As LongPtr) As LongPtr
#Else
‘Si es de 32 bits
Public Declare Function ShellExecute Lib «shell32.dll» Alias «ShellExecuteA» (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Declare Function FindWindow Lib «USER32» Alias «FindWindowA» (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowLong Lib «USER32» Alias «GetWindowLongA» (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib «USER32» Alias «SetWindowLongA» (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function DrawMenuBar Lib «USER32» (ByVal hwnd As Long) As Long
Public Declare Function RegOpenKeyA Lib «advapire32.dll» (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Public Declare Function SetCursorPos Lib «USER32» (ByVal x As Long, ByVal y As Long) As Long
Public Declare Sub mouse_event Lib «USER32» (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Declare Function SetWindowPos Lib «USER32» (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
PUBLIC Declare Function SetForegroundWindow Lib «user32» (ByVal hwnd As Long) As Long
#End If

Public llama

Sub macro11(control As IRibbonControl)
‘Menu Vista previa planilla
On Error Resume Next
Call VistaPrevia
End Sub
Sub macro12(control As IRibbonControl)
‘Menu imprime planilla
On Error Resume Next
Call Imprime
End Sub
Sub macro13(control As IRibbonControl)
‘Menu guarda en PDF
On Error Resume Next
Call GuardarPDF
End Sub
Sub macro14(control As IRibbonControl)
‘Menu exporta a Excel
On Error Resume Next
Call ExportaExcel
End Sub
Sub macro15(control As IRibbonControl)
‘Actualiza desde Explorer
On Error Resume Next
llama = 15
UserForm1.Show
End Sub
Sub macro16(control As IRibbonControl)
‘Guardar en Access
On Error Resume Next
Call InsertaEstadisticasCovid19
End Sub
Sub macro17(control As IRibbonControl)
‘Menu Ordena datos
On Error Resume Next
UserForm4.Show
End Sub
Sub macro18(control As IRibbonControl)
‘Menu Limpia textbox y combobox para realizar nueva busqueda
On Error Resume Next
Call Limpiar
End Sub

Sub macro22(control As IRibbonControl)
‘Menu Setup
On Error Resume Next
UserForm3.Show
End Sub
Sub macro23(control As IRibbonControl)
‘Menu ayuda
On Error Resume Next
ActiveWorkbook.FollowHyperlink ThisWorkbook.Path & «\» & «1007 Estadisticas Munciales Coronavirus Covid 19.pdf», , True
End Sub
Sub macro24(control As IRibbonControl)
‘Menu Actualiza y obtiene estadisticas de la web
On Error Resume Next
llama = 24
UserForm1.Show
End Sub
Sub macro25(control As IRibbonControl)
‘Menu Configurar Encabezado Hoja Excel
On Error Resume Next
UserForm2.Show
End Sub
Sub macro26(control As IRibbonControl)
‘Menu exporta a Word
On Error Resume Next
Call ExportaWord
End Sub
Sub macro27(control As IRibbonControl)
‘Menu quita filtro
On Error Resume Next
Call Quitafiltro
End Sub



Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.

If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.

Donate:
Cuenta Paypal: https://paypal.me/programarexcel
Cuenta Bitcoin: 1KBGGb8fyDzyR3X1Rie6m7VguzaAfngNbd
Cuenta Ether: 0x41Bbd24556914C83a31217eBb3BC49789b66e407

Summary
Author Rating
1star1star1star1star1star
Aggregate Rating
no rating based on 0 votes