sábado, 31 de agosto de 2019

Ver nuestro archivo Excel a través de una web

En muchas ocasiones he recibido consultas sobre cómo lograr que nuestro archivo Excel se vea a través de una web y que, al actualizar los datos del archivo, automáticamente se visualicen en dicha web (Ojo, no descargar un archivo, sino, verlo en la misma web). La primera respuesta que casi siempre se lee o escucha es “no se puede”, pues incluso convirtiendo un archivo Excel en formato HTML al ser incluido en una página web, necesariamente hay que reemplazar el archivo por uno nuevo para que se vean los datos actualizados. Entonces ¿es correcto responde que no se puede? Veámoslo hoy.

En esta ocasión vamos a suponer que queremos compartir a través de una pagina web los resultados de nuestras ventas, incluyendo algún gráfico, y tal como hemos mencionado queremos que cualquier persona lo vea y tan solo utilizando Excel. Nuestra hoja tiene de este modo los datos y un gráfico:



Ahora guardaremos nuestro archivo en OneDrive, en mi caso, y para facilitar las cosas, tengo la app respectiva en el Windows 10 de mi portátil.

Una vez guardado, ya sea por web o por la app, podremos ver dicho archivo en nuestro OneDrive

.

En la versión web de OneDrive, dale clic derecho al archivo y elige “Insertar”.

En la ventana que se abrirá dale clic al botón “Generar”

.

En la siguiente ventana dale clic a “Personalizar la forma en que este libro insertado se mostrará a otros usuarios”.

En la página que se abrirá, personalicen la hoja de Excel eligiendo las opciones que más les convengan para que las personas visualicen.

Una vez hecho eso, no olvides copiar el código del final de la página.

No olvides guardar el código copiado en algún lado, como por ejemplo en el Bloc de Notas.

En nuestra web, crearemos una página, en mi caso uso Blogger y se vería algo así, tanto en diseño como en código HTML.

Ahora agregaremos el código copiado a nuestra página web. Debería quedar algo así:

Luego, en nuestra web debería verse como esto, por supuesto dependiendo del tamaño que hayamos elegido, así como las opciones activadas.

Ahora, cuando cambien los datos en su archivo de Excel, sea en la app o a través de Excel Online, dichas modificaciones ser podrán visualizar directamente en el enlace respectivo. En mi caso, este: Enlace

Y eso es todo por hoy, espero les sea útil.

Abraham Valencia

Nota: El formato de fecha, separador de miles o separador de decimales que se ve en la web generada, depende del de tu Excel Online.

lunes, 19 de agosto de 2019

Cambio de divisas con macros (VBA)

No es inhabitual que muchas personas por razones de trabajo, estudio o personales, necesiten saber el cambio de su moneda nacional por alguna extranjera o quizá entre aquellas. Hoy en día, y con la masificación del uso de internet, es muy fácil encontrar miles de webs que realizan el cambio de modo rápido e incluso de forma gratuita, pero veamos cómo podemos tener esto en nuestro archivo de Excel.

Lo primero es mencionar que usaremos el objeto Internet Explorer que, si bien en ocasiones puede ser un poco lento, es más fácil de entender y usar (Enlace). Segundo, para el ejercicio vamos a usar la siguiente web: Enlace. Y tercero e importante, para tener los tipos de moneda vamos a usar el estándar internacional ISO 4217 que fue creado por la ISO con el objetivo de definir códigos de tres letras para todas las divisas del mundo (Enlace).

Ahora veamos como funciona la web de cambio. Si entramos a ella, ingresamos un monto y elegimos los tipos de moneda:

Al darle clic al botón correspondiente nos hará el cambio de divisas solicitado.

Lo que más nos interesa es el enlace generado. Veámoslo con detalle:

https://www.xe.com/es/currencyconverter/convert/?Amount=100&From=PEN&To=USD

Como quizás ya se dieron cuenta, aparece el monto (100), así como el código de las dos monedas seleccionadas (PEN y USD).  Si prueban más montos y monedas verán el mismo efecto. Ojo con algo importante, dicha web solo acepta la coma (,) como separador de decimales, nunca el punto (.). Entonces, si logramos reemplazar el monto y los códigos con los que necesitemos, y lo enviamos a Internet Explorer, tendremos los resultados que necesitamos.

Para los códigos de las monedas podemos conseguirlos de enlace respectivo que he compartido líneas arriba de tal modo que en una hoja (que yo he llamado “Códigos”) tendremos algo así:

Creen un Userform y agréguenle un TextBox y dos Combobox (y algunos Labels como título y sub títulos, si desean claro).

Como vieron yo en mi hoja “Códigos” tengo tres columnas: Código (que es el que más nos interesa), divisa (moneda) y el país; por ende, en la propiedad ColumnCount he colocado 3. Para llenarlos he usado el evento Initialize del Userform.

Private Sub UserForm_Initialize() 
Me.CmbCodigos.RowSource = "=Códigos!A2:C180" 
Me.CmbCodigos2.RowSource = "=Códigos!A2:C180" 
End Sub 

Con el TextBox vamos a hacer que solamente acepte números y la coma decimal (no olviden que la web no acepta punto como separador de decimales) haciendo uso de su evento KeyPress. Ah, por cierto, solo dejaremos que se ingrese una coma como máximo.

Private Sub TxtMoneda_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii < 48 Or KeyAscii > 57) And KeyAscii <> 44 Then
     KeyAscii = 0 
End If 
End Sub  

También agregaremos algunos Label más para los resultados obtenidos, así como un botón.

Ahora en el evento Click del botón vamos a agregar tres variables que reemplazarán al monto y las dos divisas a reemplazar para usar el mismo enlace que obtuvimos líneas arriba. Además, vamos a obtener los valores del cambio y pasarlos a nuestros Label. Como ya en otro artículo he explicado como usar los valores de los elementos/objetos de la web, aquí simplemente los colocaré directamente. Entonces, el código quedará así:

Private Sub CmdCambio_Click() 

Dim IE As Object 
Dim MiMonto$, maCambiar$, mCambio$, MiURL$ 

If TxtMoneda = "" Or CmbCodigos = "" Or CmbCodigos2 = "" Then
     MsgBox "No dejes campos en blanco", vbOKOnly, "Todo Sobre Excel"
     TxtMoneda.SetFocus
     Exit Sub 
End If 

Application.Cursor = xlWait 

Set IE = CreateObject("InternetExplorer.Application") 
Let MiMonto = TxtMoneda: Let maCambiar = CmbCodigos: Let mCambio = CmbCodigos2 
Let MiURL = "https://www.xe.com/es/currencyconverter/convert/?Amount=" & MiMonto & "&From=" & CmbCodigos & "&To=" & CmbCodigos2 

IE.Navigate MiURL 

Do Until IE.ReadyState = 4
     DoEvents 
Loop 

Label6 = IE.document.getElementsByClassName("converterresult-conversionTo")(0).innerText 
Label7 = IE.document.getElementsByClassName("sc-EHOje lkcPkj")(0).innerText & _
     vbNewLine & IE.document.getElementsByClassName("sc-EHOje lkcPkj")(1).innerText 

IE.Quit 

Application.Cursor = xlDefault 

Set IE = Nothing 

End Sub   

Si todo quedó bien obtendremos un resultado de este estilo:

Y eso es todo por hoy, hasta la próxima.

.Abraham Valencia

Descargue el ejemplo aquí

viernes, 9 de agosto de 2019

Datos de encuestas en línea a través de Excel y Power Query (I): Formularios Google, Hoja de Cálculo de Google y Google Drive

Ya hace varias semanas escribí sobre cómo conectar Excel con un archivo de la Hoja de Cálculo de Google (Enlace) y con un archivo de Excel que se encuentra en OneDrive Personal (Enlace). A raíz de esos artículos algunas personas me preguntaron que si era posible hace encuestas y, tal cuál como los ejemplos citados, conectarlas con un archivo de Excel en nuestra PC. Probablemente lo primero que uno dirá es que casi todas las encuetas en línea tienen la herramienta para exportar a Excel, pero la idea es no tener que estar entrando a la encuesta sino hacerlo todo desde nuestra PC. Pues bueno, eso es lo que haremos hoy.

Comenzaremos con los Formularios de Google (Personal). Crearemos una encuesta para el ejemplo con solo cuatro preguntas.

Para poder probar formatos, como ven, una es de texto, otra de fecha, una con opción de elección y una última numérica. Luego en la parte superior de la encuesta vamos a elegir la opción “Respuestas” y en ella veremos un botón verde (“Crear hoja de cálculo) al que le daremos clic.

En las opciones que salen elijan la que mejor les convenga; yo pondré “Crear una hoja de cálculo”.

Si hicimos todo bien tendremos algo como esto en nuestra pantalla:

Supongamos que ya difundieron el enlace de la encuesta y en ella ya hay varios datos que queremos ir viendo/analizando en nuestro Excel, entonces lo que haremos ahora es ir al menú “Archivo” en nuestra hoja de cálculo de Google y elegir la opción “Publicar en la Web” (a partir de aquí casirepetiré pasos de un artículo anterior, pero realmente creo que vale la pena).

En el cuadro de dialogo que sale vamos a elegir, en la primera lista, el nombre de la encuesta (en mi caso “Respuestas de formulario 1”) y en la segunda lista vamos a elegir la opción “Valores separados por tabuladores (.tsv)”. En la parte inferior verificar que el check de “Volver a publicar automáticamente cuando se hagan cambios” esté activado. Ahora démosle clic al botón “Publicar”.

Luego de ello, Google nos brindará un enlace que debemos copiar. No olvidar eso o no podremos realizar la conexión.

Luego de todo eso, vamos Excel. En el libro y hoja en donde queremos los datos vamos a la pestaña “Datos” y en el grupo “Obtener y transforma datos” vamos a darle clic al botón “Desde el texto/CSV” y en el cuadro de dialogo que se abrirá, pegaremos el enlace de Google en la parte de “Nombre de archivo:”

Veremos cómo se abre el editor de Power Query y ahí le daremos doble clic a la imagen en donde dice “docs.google.com”.

El resultado, si hicimos todo bien, debe ser similar a este:

Si lo notaron, es como que todos los datos están en una sola columna, pero no se preocupen, ya lo arreglaremos. Además, si al igual que en mi caso hay tildes en las respuestas y algunos datos se ven con caracteres raros como en la imagen anterior, no se preocupen, hay una forma de arreglarlo. En el editor de Power Query vamos a la pestaña “Inicio” y en el grupo “Consulta” elige el botón “Editor avanzado” y al abrirse buscaremos los siguiente:

¿Ven el número 1252? Pues reemplácenlo por el 65001, que es el correspondiente al formato UTF-8, denle clic al botón “Listo” y ahora los datos se verán así:

Ahora elijan la pestaña “Transformar” y en el grupo “Tabla” elige “Usar la primera fila como encabezado” y en la lista que se despliega elige la opción del mismo nombre. En el grupo “Columna de texto” elige “Dividir columna” y ahí “Por delimitador”, en el cuadro que tendrán a la vista, verifiquen que estas opciones estén activadas y denle click a “Aceptar”:

Nuestros datos se verán, ahora, algo así:

Si se dan cuenta los encabezados están precedidos de las palabras “Marca temporal”, no se preocupen, denles doble clic y edítenlos. No olviden que, si bien la encuesta tiene cuatro preguntas, Google adiciona una (la del extremo izquierdo) en donde guarda la fecha y hora en que se ingresaron los datos respectivos.

En la pestaña “Archivo” elijan “Cerrar y cargar” para enviar los datos a nuestra hoja de Excel.

Ahora en la pestaña “Datos” de la Cinta de Opciones, vayan al grupo “Consultas y conexiones”, denle clic al botón “Actualizar todo” y en la lista respectiva elijan “Propiedades de conexión…” y en la pestaña “Uso” activen, si lo desean, “Actualizar cada” y coloquen la cantidad de minutos deseados, activen la opción “Actualizar al abrir el archivo” y verifiquen que la opción “Actualizar esta conexión en Actualizar Todo” esté activada; por último, activar “Habilitar la carga de datos”.

Listo, ahora nuestra hoja de Excel se actualizará con los datos que se cambien/agreguen/eliminen en nuestra encuesta, ah, y lo bueno es que se respetarán los encabezados que editamos, así como las tildes. Espero les sea útil. Hasta la próxima.

Abraham Valencia

miércoles, 31 de julio de 2019

Usando el Traductor de Google en Excel

Desde hace ya varias versiones Microsoft ha introducido la capacidad de sus productos de Office de traducir palabras en diversos idiomas. Por supuesto que eso incluye al Excel.


:

Dicha herramienta hace uso de lo servicios de traducción de Microsoft, los cuales se incluyen como para de la suite Office (dentro de los programas), pero son de pago si se quiere acceder, por ejemplo, desde las macros (VBA) para personalizarlas de algún modo.

Una alternativa a ellos es usar Google Traductor que, si bien ha cambiado su interfase de internet y la actual dificulta un poco el acceso, no es imposible lograrlo. Por cierto, es necesario tener acceso a internet, así como tener el navegador Internet Explorer instalado (todos los Windows lo tienen, incluso el 10, así sea el Edge el predeterminado, por si acaso).

Entonces, ahora quiero comentar que he usado el objeto Internet Explorer dado que es más fácil su uso, aunque acepto que para hacer Web Scraping (o similares) es más rápido usar MSXML2 (lo usaré en una próxima oportunidad).

Ahora sí, manos a la obra. Lo primero es comentarles que inicialmente pensé en detectar los elementos/objetos de la web del traductor (Enlace) y enviar el texto a traducir para que ellos ocurra de modo automático en los idiomas predeterminados ¿cuál era el dilema con eso? Pues elegir algún otro idioma, a través de las listas respectivas en dicha web, suponía una dificultad cuya programación, además de costar buen tiempo, no necesariamente iba a ser de fácil entendimiento. Decidido eso opte por usar otro método que se me ocurrió al observar el enlace que se genera cuando uno ingresa algún texto que desea traducir ¿cómo es eso? Pongamos por ejemplo la palabra “Hola”.

¿Notan lo qué ocurre? Veámoslo con más detenimiento:

https://translate.google.com/#view=home&op=translate&sl=es&tl=en&text=Hola

Si aún no lo notan, cambien la palabra por “Adiós” y obtendrán esto:

https://translate.google.com/#view=home&op=translate&sl=es&tl=en&text=Adios

“sl” por “star Lenguage” y “lt” por “translated language” y después del “Text=” el texto a traducir. En el caso de los idiomas, no fue difícil darse cuenta que respondía al código de idiomas según ISO 639-1 (Enlace). Hallado eso, se me ocurrió que, mandando desde el Excel el enlace con la combinación de idiomas necesario más el texto requerido, pues daría como resultado dicho texto traducido y aquel podría extraerse de la web. Igual antes hice unas pruebas con signos diversos a ver si significaban algún dilema. Para que se entienda, ingresen esto “Hola ¿cómo estás? Yo bien, espero tú igual” (sin las comillas) y el enlace será el siguiente:

https://translate.google.com/#view=home&op=translate&sl=es&tl=en&text=Hola%20¿cómo%20estás%3F%20Yo%20bien%2C%20espero%20tú%20igual

Como se aprecia, los espacios en blanco y algunos caracteres son reemplazados por su correspondiente código hexadecimal precedido de un signo “%”. Después de algunas pruebas, pude ver cuáles eran y los coloqué en una hoja que llamé “Signos”, del siguiente modo:

He omitido ahí el signo de porcentaje (%) y el de interrogación de cierre (¿), ya explicaré el por qué. Del mismo modo elegí algunos de los idiomas y los coloqué así en la misma hoja:

En una hoja que he llamado “Traductor” vamos a usar la celda A2 para ingresar el texto a traducir; si bien Google Traductor permite hasta 5000 caracteres, por una cuestión de orden vamos a poner un límite de 4000 en nuestro libro. En C2 y D2 incluiremos listas desplegables de validación basadas en la columna F de la hoja “Signos”, la única diferencia es que en C” incluiremos “Automático” y en D2 no, de ese modo de necesitar traducir un texto cuyo idioma se desconoce, basta usar dicha opción para que Google Traductor lo detecte.

Si bien el texto a cambiar lo vamos a colocar en A2, para luego cambiar, lo correspondiente, a código hexadecimal, enviaremos todo a F1.

Dim MiHoja As Worksheet 
Set MiHoja = Worksheets("Traductor") 
MiHoja.Range("F1").Value = MiHoja.Range("A2").Value 

Luego convertiremos los caracteres necesarios de F1 en código hexadecimal. Vamos a comenzar por los signos de porcentaje (%) primero usando Replace, ya que el código hexadecimal debe ir precedido de dicho signo en cada caso y entonces es mejor cambiarlo(s) primero pues si se hace a la par de lo demás (con un bucle, como usaremos), podría reemplazarse todo lo que sí necesitaremos para enviar en el enlace que del traductor.

With MiHoja.Range("F1")
     .Replace What:="%", Replacement:="%25", LookAt:=xlPart, _
         SearchOrder:=xlByRows 

25 es el hexadecimal del signo %, y obviamente también debe ir precedido de ese mismo signo (%).

Luego, igualmente usando Replace, con un bucle (For Each) recorreremos todos los códigos de los caracteres que deseamos reemplazar en la celda F1 y los convertiremos en hexadecimales precedidos de %.

For Each Celda In Worksheets("Signos").Range("C2:C20")
         .Replace What:=ChrW(Celda.Value), Replacement:="%" & Celda.Offset(0, -2).Value, LookAt:=xlPart, _
             SearchOrder:=xlByRows
Next Celda 

Por último, haremos los mismo con el signo ?. Lo dejamos al último dado que puede ser confundido por Excel y/o VBA como un comodín y hacer que cambie todo el texto por él.

   .Replace What:="~?", Replacement:="%3F", LookAt:=xlPart, _
         SearchOrder:=xlByRows
 End With 

Para los idiomas haremos algo parecido, pero usando Find para encontrar el(los) elegidos y su diminutivo dado que eso último es lo que enviaremos al enlace de la web. Para ello usaremos dos variables.

'El uso de Let no es necesario, se puede dar el valor sin usarlo (es equivalente), pero 
'tengo la costumbre de dejarlo. Igual, en casos como este se puede omitir Value, pero 
'considero que colocarlo permite entender mejor a que propiedad se hace referencia 
Dim CeldaaEncontrar As Range 
Dim ValoraBuscar$, PrimerIdioma$, SegundoIdioma$ 
Let ValoraBuscar = MiHoja.Range("C2").Value 
Set CeldaaEncontrar = Worksheets("Signos").Range("F2:F62").Find(ValoraBuscar) 
Let PrimerIdioma = CeldaaEncontrar.Offset(0, 1).Value 
Let ValoraBuscar = MiHoja.Range("D2").Value 
Set CeldaaEncontrar = Worksheets("Signos").Range("F3:F62").Find(ValoraBuscar) 
Let SegundoIdioma = CeldaaEncontrar.Offset(0, 1).Value 

Hasta aquí ya tenemos el texto con los caracteres convertidos en hexadecimal (en F1) y en variables los diminutivos de los idiomas, aquí lo que hay que hacer es usar el objeto Internet Explorer, que abra la web del traductor con toda la cadena necesaria y con eso lograremos que lo traduzca.

Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
With IE
     .Navigate "https://translate.google.com/#view=home&op=translate&sl=" & PrimerIdioma & "&tl=" & SegundoIdioma & "&text=" & MiHoja.Range("F1").Value
      
      Do Until .ReadyState = 4
         DoEvents
     Loop     
End With 
Como ven, he incluido un bucle que de tiempo para que cargue de forma correcta y de ese modo tener la traducción. Para finalizar solo queda extraer dicha traducción y enviarla a nuestra celda A5, borrar F1, proteger la hoja y cerrar el Internet Explorer (si bien nunca se verá el navegador, sí se abre).
With MiHoja
     .Range("A5").Value = IE.document.querySelector(".tlid-translation.translation").innerText
     .Range("F1").ClearContents
     .Protect "1234"
End With 
IE.Quit 

Y listo, ya tenemos nuestro traductor de Google en nuestro archivo de Excel. La macro completa quedará así:

Sub Traductor ()
Dim Celda As Range, CeldaaEncontrar As Range
Dim IE As Object 
Dim MiHoja As Worksheet 
Dim ValoraBuscar$, PrimerIdioma$, SegundoIdioma$ 

Set MiHoja = Worksheets("Traductor") 

If MiHoja.Range("A2") = "" Or MiHoja.Range("C2") = "" Or MiHoja.Range("D2") = "" Then
     MsgBox "No debe dejar vacío los campos del texto a traducir o los idiomas", vbOKOnly, "Todos Sobre Excel"
     Exit Sub
End If

If Len(MiHoja.Range("A2")) >= 4000 Then
     MsgBox "No debes exceder de 4000 caracteres, por favor cambiar. Tienes " & Len(MiHoja.Range("A2")) & " caracteres en este momento", vbOKOnly, "Todos Sobre Excel"
     Exit Sub
End If

Application.ScreenUpdating = False
MiHoja.Unprotect "1234" 
MiHoja.Range("F1").Value = MiHoja.Range("A2").Value

With MiHoja.Range("F1")
'Convertimos los signos % a hexadecimal, lo hacemos antes de los demás ya que % es un signo usado 
'varias veces y entraríamos casi en un bucle de convertirlo junto con todos los otros signos
     .Replace What:="%", Replacement:="%25", LookAt:=xlPart, _
         SearchOrder:=xlByRows 
'en este bucle convertimos los signos a hexadecimal
     For Each Celda In Worksheets("Signos").Range("C2:C20")
         .Replace What:=ChrW(Celda.Value), Replacement:="%" & Celda.Offset(0, -2).Value, LookAt:=xlPart, _
             SearchOrder:=xlByRows
     Next Celda 
'aquí lo hacemos con el signo ?, ya que si se usa el Replace junto con los demás signos y este, en un bucle, transforma todo
     .Replace What:="~?", Replacement:="%3F", LookAt:=xlPart, _
         SearchOrder:=xlByRows
End With

'El uso de Let no es necesario, se puede dar el valor sin usarlo (es equivalente), pero 
'tengo la costumbre de dejarlo. Igual, en casos como este se puede omitir Value, pero 
'considero que colocarlo permite entender mejor a que propiedad se hace referencia 
Let ValoraBuscar = MiHoja.Range("C2").Value 
Set CeldaaEncontrar = Worksheets("Signos").Range("F2:F62").Find(ValoraBuscar) 
Let PrimerIdioma = CeldaaEncontrar.Offset(0, 1).Value 
Let ValoraBuscar = MiHoja.Range("D2").Value 
Set CeldaaEncontrar = Worksheets("Signos").Range("F3:F62").Find(ValoraBuscar) 
Let SegundoIdioma = CeldaaEncontrar.Offset(0, 1).Value 
Set IE = CreateObject("InternetExplorer.Application")

With IE
     .Navigate "https://translate.google.com/#view=home&op=translate&sl=" & PrimerIdioma & "&tl=" & SegundoIdioma & "&text=" & MiHoja.Range("F1").Value
      Do Until .ReadyState = 4
         DoEvents
     Loop      
End With

With MiHoja
     .Range("A5").Value = IE.document.querySelector(".tlid-translation.translation").innerText
     .Range("F1").ClearContents
     .Protect "1234"
 End With 

IE.Quit

'En módulos estándar no es necesario colocar en True el ScreenUpdating ya que con el 
'End Sub lo hace, pero es mi costumbre de programador colocarlo 
Application.ScreenUpdating = True 
'Asimismo, el End Sub libera las variables, pero siempre uso el Nothing por costumbre
Set CeldaaEncontrar = Nothing: Set MiHoja = Nothing: Set IE = Nothing 
MsgBox "Traducción realizada", vbOKOnly, "Todos Sobre Excel" 

End Sub 


Espero les guste, hasta la próxima.

Abraham Valencia

Descargue el ejemplo aquí