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í

1 comentario:

  1. hello, there is a way to change it to work in chrome. thank you

    ResponderBorrar