jueves, 4 de julio de 2013

VBA: Diferencias entre las propiedades .Formula, .Value y .Text del objeto Range.

Han sido varias las ocasiones en que algún alumno me ha preguntado sobre las semejanzas o diferencias entres las propiedades del objeto Range: .Formula, .Value y .Tex; en apariencia muy similares y muchas veces con resultados idénticos.
Las diferencias son escasas y sólo salen a relucir cuando existen ciertas condiciones. Hoy aprenderemos a trabajar con éstas.


Comenzaremos con la propiedad .Formula, empleada habitualmente para introducir fórmulas en nuestras hojas de cálculo, por ejemplo:
Range("C1").Formula = "=SUM(A1:B1)"

o bien en su forma local:
Range("C2").FormulaLocal = "=SUMA(A2:B2)"

Esta propiedad .Formula nos 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 (.FormulaLocal hace lo mismo en el lenguaje de nuestra instalación).
Las condiciones en las que esta propiedad funciona serían:
  1. Si la celda contiene una constante, esta propiedad la devolverá. Si está vacía, devolverá una cadena vacía. Si la celda contiene una fórmula, la propiedad .Formula devolverá la fórmula en forma de cadena, con el mismo formato en que se presentaría en la barra de fórmulas (incluido el signo igual).
  2. Si se define el valor o la fórmula de una celda como una fecha, Excel comprueba si dicha celda ya tiene uno de los formatos numéricos de fecha u hora; de lo contrario, cambia el formato numérico al formato numérico de fecha corta predeterminado.
  3. Si se define la fórmula para un rango de varias celdas, se rellenan todas las celdas del rango con la fórmula.

Claro que si nos detenemos un segundo y ejecutamos la propiedad .Value como sigue:
Range("C3").Value = "=SUM(A3:B3)"
el resultado es el mismo... aunque las condiciones de uso son algo diferentes.


Lo probamos todo. En un módulo del Editor de VBA añadiremos las líneas de nuestra macro:

Sub pruebas()
Range("C1").Formula = "=SUM(A1:B1)"
Range("C2").FormulaLocal = "=SUMA(A2:B2)"
'''''''''''''''''''''''''''''''''''
Range("C3").Value = "=SUM(A3:B3)"
End Sub


Lo vemos en la imagen en modo Mostrar fórmula:

VBA: Diferencias entre las propiedades .Formula, .Value y .Text del objeto Range.



Y si obtenemos lo mismo por qué y para qué existen estas propiedades???... pues por que nuestras macros, según lean una u otra podrían devolvernos 'cosas' diferentes' (un valor ya calculado o bien una fórmula). Veámoslo con un sencillo ejemplo, donde aplicaremos ambas propiedades.

VBA: Diferencias entre las propiedades .Formula, .Value y .Text del objeto Range.


La propiedad .Formula devolverá, como sabemos, una fórmula si es tal cosa lo que hemos indicado, pero si no es así, es decir, si no contine fórmula, obtendremos un .Value o Valor.
Por ejemplo, sobre los datos de la imagen anterior, para la celda D3, al indicar la propiedad .Formula y .Value conseguiremos precisamente esa fórmula incorporada a la celda:
Range("D3").Formula = "=(C3-B3)/B3"
Sin embargo, si aplicamos la propiedad .Value conseguiremos el valor calculado, el valor puro, sin fórmula (y sin formato).
Range("D3").Value


Verifiquémoslo. En un módulo del Editor de VBA añadiremos las líneas de nuestra macro:

Sub Prueba2()
'incluimos una fórmula en D3
Range("D3").Formula = "=(C3-B3)/B3"
'''''''''''''''''''''''''''''''''''
Set c = Range("D3")
'damos estilo de celda porcentual
c.Style = "Percent"

MsgBox c.Formula 'mostramos el valor de la celda con la propiedad .Formula
MsgBox c.Value   'mostramos el valor de la celda con la propiedad .Formula
End Sub


Al ejecutar nuestra macro Prueba2 rápidamente se observan las diferencias...

Por si fuera poco, tenemos alguna otra propiedad 'en discordia': la propiedad .Text, la cual devuelve en forma literal lo que aparece en la celda (además si el contenido de la celda es numérico lo obtendremos incluyendo el formato.
En el ejemplo anterior, si añadireamos a nuestra macro una última línea
MsgBox c.Text
nos mostraría el valor calculado con su formato porcentual.
Esta es una propiedad sólo de Lectura!!.


La conclusión final, podríamos decir que la diferencia principal entre estas propiedades, es la lectura que hace de ellas nuestra MAcro, y no tanto a la hora de escribir en nuestra hoja de cálculo.

1 comentario: