Hoy hablaré del tratamiento que debemos dar a los decimales si queremos trabajar con ellos en nuestras macros. Y a modo de ejemplo, propondré un ejercicio de filtro avanzado con macros, ya que es una cuestión bastante reiterativa planteada por los lectores del blog.
Lo que vamos a ver es cómo debemos tratar los valores decimales si queremos que nuestro código VBA lo entienda, y es que sabemos (seguro lo hemos sufrido alguna vez) en nuestras líneas de programación los valores decimales no emplean nuestro mismo sistema de puntuación (miles y decimales con puntos y comas respectivamente), ya que normalmente en nuestras hojas de cálculo ponemos los puntos para miles y las comas para decimales, justo al contrario que en las sentencias de código VBA.
Nuestro trabajo consistirá entonces en convertir y hacer comprensible nuestro decimal a nuestra macro. El ejercicio consite entonces en aplicar un Filtro avanzado sobre una base de datos, para obtener los registros superiores a un valor decimal....
Ojo, siempre estamos hablando al trabajar con macros!!! (no existe ningún problema o incompatibilidad al trabajar normalmente sobre la hoja de cálculo).
Veamos nuestra base de datos en el rango A1:A16, y el Rango de criterios en G1:G2, a ambos rangos les hemos asignado un Nombre definido:
Criterios =Hoja1!$G$1:$G$2
datos =Hoja1!$A$1:$E$16
que usaremos en nuestras macros.
El objetivo de nuestra macro será señalar una celda del campo 'Precio total' para que a continuación muestre todos aquellos registros de la base de dato que cumplan la condición de ser mayores estrictamente al valor indicado. Como vemos, esos importes de 'Precio Total' tienen decimales, lo que normalmente provocaría un error en el filtrado, no reconociendo el importe y sus decimales!!!.
Accederemos al Editor de VBA (alt+F11) e insertaremos un Módulo, y dentro de él el siguiente código, como primera versión:
En este primer código conseguimos reemplazar los signos de puntuación de miles y decimales, con la función de VBA Replace; sencillamente tratamos el valor obtenido como un texto y reemplzamos en el el signo decimal de puntuación por el que emplea el código VBA, es decir, la coma por el punto. Luego, simplemente, llevamos el texto alfanumérico a la celda G2, y aplicamos el filtro avanzado desde la macro, obteniendo el resultado esperado.
Podemos verlo en el video siguiente:
El siguiente código actúa de igual forma, excepto por el método empleado para convertir el decimal, de una manera más técnica, usando la propiedad .Formula, ya que esta propiedad tiene la virtud de representar el valor o fórmula de la celda en el lenguaje de la macro.
Accederemos al Editor de VBA (alt+F11) e insertaremos en el mismo Módulo de antes (u otro diferente a elegir) el siguiente código, como segunda versión de nuestra macro:
Tras realizar la prueba se comprueba que con ambas versiones, el resultado es el mismo, el que esperábamos, la macro ha 'comprendido' y ejecutado adecuadamente el proceso con el decimal.
Sin este tratamiento nuestas macros fallarían de igual forma que si en nuestras hojas de cálculo emplearamos la puntuación cambiada, es decir, puntos para decimales y comas para miles...
Lo que vamos a ver es cómo debemos tratar los valores decimales si queremos que nuestro código VBA lo entienda, y es que sabemos (seguro lo hemos sufrido alguna vez) en nuestras líneas de programación los valores decimales no emplean nuestro mismo sistema de puntuación (miles y decimales con puntos y comas respectivamente), ya que normalmente en nuestras hojas de cálculo ponemos los puntos para miles y las comas para decimales, justo al contrario que en las sentencias de código VBA.
Nuestro trabajo consistirá entonces en convertir y hacer comprensible nuestro decimal a nuestra macro. El ejercicio consite entonces en aplicar un Filtro avanzado sobre una base de datos, para obtener los registros superiores a un valor decimal....
Ojo, siempre estamos hablando al trabajar con macros!!! (no existe ningún problema o incompatibilidad al trabajar normalmente sobre la hoja de cálculo).
Veamos nuestra base de datos en el rango A1:A16, y el Rango de criterios en G1:G2, a ambos rangos les hemos asignado un Nombre definido:
Criterios =Hoja1!$G$1:$G$2
datos =Hoja1!$A$1:$E$16
que usaremos en nuestras macros.
El objetivo de nuestra macro será señalar una celda del campo 'Precio total' para que a continuación muestre todos aquellos registros de la base de dato que cumplan la condición de ser mayores estrictamente al valor indicado. Como vemos, esos importes de 'Precio Total' tienen decimales, lo que normalmente provocaría un error en el filtrado, no reconociendo el importe y sus decimales!!!.
Accederemos al Editor de VBA (alt+F11) e insertaremos un Módulo, y dentro de él el siguiente código, como primera versión:
Sub Filtro1v1()
Dim criteria As Range
Dim precio As String
'preguntamos celda donde esté el valor-Preci- sobre el que filtrar
Set valor = Application.InputBox("Valor precio", Default:="$G$2", Type:=8)
'componemos con el valor y el operador de Mayor el importe del precio
'en este caso lo importante es el Reemplazamiento de la coma por el punto
'para convertir en decimal en algo entendible por nuestro código
precio = ">" & (Replace(valor, ",", "."))
'llevamos la composición final (el decimal con punto y no con coma) a la celda G2
Sheets("Hoja1").Range("$G$2").Value = precio
'aplicamos el filtro avanzado
Set criteria = Sheets("Hoja1").Range("G1:G2")
Range("datos").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range(criteria.Address) _
, CopyToRange:=Sheets("Hoja1").Range("$G$5"), Unique:=False
Set criteria = Nothing
Set valor = Nothing
End SubEn este primer código conseguimos reemplazar los signos de puntuación de miles y decimales, con la función de VBA Replace; sencillamente tratamos el valor obtenido como un texto y reemplzamos en el el signo decimal de puntuación por el que emplea el código VBA, es decir, la coma por el punto. Luego, simplemente, llevamos el texto alfanumérico a la celda G2, y aplicamos el filtro avanzado desde la macro, obteniendo el resultado esperado.
Podemos verlo en el video siguiente:

El siguiente código actúa de igual forma, excepto por el método empleado para convertir el decimal, de una manera más técnica, usando la propiedad .Formula, ya que esta propiedad tiene la virtud de representar el valor o fórmula de la celda en el lenguaje de la macro.
Accederemos al Editor de VBA (alt+F11) e insertaremos en el mismo Módulo de antes (u otro diferente a elegir) el siguiente código, como segunda versión de nuestra macro:
Sub Filtro1v2()
Dim criteria As Range
Dim precio As String
'preguntamos celda donde esté el valor-Preci- sobre el que filtrar
Set valor = Application.InputBox("Valor precio", Default:="$G$2", Type:=8)
'componemos con el valor y el operador de Mayor el importe del precio
'en este caso lo importante es que aplicamos sobre el valor la propiedad .Formula
'que devuelve o establece un valor de tipo Variant que representa
'la fórmula del objeto en notación de estilo A1 y en el lenguaje de la macro;
'es decir, para convertir en decimal en algo entendible por nuestro código.
precio = Range(valor.Address).Formula
precio = ">" & precio
'llevamos la composición final (el decimal con punto y no con coma) a la celda G2
Sheets("Hoja1").Range("$G$2").Value = precio
'aplicamos el filtro avanzado
Set criteria = Sheets("Hoja1").Range("G1:G2")
Range("datos").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range(criteria.Address) _
, CopyToRange:=Sheets("Hoja1").Range("$G$5"), Unique:=False
Set criteria = Nothing
Set valor = Nothing
End Sub
Tras realizar la prueba se comprueba que con ambas versiones, el resultado es el mismo, el que esperábamos, la macro ha 'comprendido' y ejecutado adecuadamente el proceso con el decimal.
Sin este tratamiento nuestas macros fallarían de igual forma que si en nuestras hojas de cálculo emplearamos la puntuación cambiada, es decir, puntos para decimales y comas para miles...











