martes, 19 de diciembre de 2017

El indiscriminado uso de las variables tipo Variant

En un artículo anterior (https://abrahamexcel.blogspot.pe/2017/11/consejos-para-el-uso-de-variables-en.html) ya comentábamos sobre los constantes problemas de la mala declaración de variables o de no declararlas y como aquello consumía recursos innecesarios.

Cuando usamos variables y no las hemos declarado VBA les asigna, automáticamente, el tipo Variant. El tipo de variables Variant admite números enteros, decimales, texto y en general cualquier tipo de dato que podamos usar, pero es justamente esa capacidad la que hace que dicho tipo de variable requiera una gran cantidad de memoria. Las variables Variant reservan 22 bytes de la memoria (en algunos casos 16 bytes) y a eso hay que sumarle lo que ocupa el valor que le asignemos a la variable.

Para entenderlo mejor tratemos de ejemplificarlo pero primero recordemos que, de modo general, un carácter cualquiera ocupa 1 byte (hay variaciones por si acaso).  Entonces veamos:

Sub Probando ()
CadenadeTexto = “Abraham” 
End Sub 

Como no se declaró la variable “CadenadeTexto”, nuestro VBA le reservo 22 bytes de la memoria y al tener siete caracteres la palabra “Abraham”, en total la variable está ocupando 29 bytes.  Pero, veamos ahora que pasaría si declarábamos la variable de forma adecuada:

Sub Probando ()
Dim CadenadeTexto As String 
Let CadenadeTexto = “Abraham"
End Sub 

En ese caso, al ser del tipo String, se le reservó 10 bytes, a eso le sumamos los siete que ocupa la palabra y tenemos en total que nuestra variable ocupó 17 bytes, bastante menos que los 29 bytes que ocupó como tipo Variant.

¿Por eso deberíamos dejar de usar variables del tipo Variant? No necesariamente pero no es recomendable usar siempre ese tipo de variable cuando hay varias del tipo adecuado para nuestras necesidades  (String, Double, etc.). Como bien dicen muchos programadores, las características de las actuales computadoras permiten tener varios Gigabytes de memoria que, aparentemente, no harían que se perciba problema con el uso indiscriminado de las variables tipo Variant pero, no olvides que la programación no solo debería ser eficaz, sino que también debe de ser eficiente y además, nuestras macros no será lo único que ocupe la memoria de nuestra computadora.

Para terminar, hay ocasiones en que será necesario usar las variables del tipo Variant como cuando no tengamos la certeza, por algún motivo, de qué tipo de valores usarán nuestros usuarios finales.

Abraham Valencia

sábado, 2 de diciembre de 2017

El uso, y abuso, de Select y Selection en Excel (VBA)

Primero que nada debemos recordar que “Select” es un método del VBA de Excel que se aplica a objetos y que nos permite, justamente, seleccionarlos para, si deseamos, trabajar con y/o sobre ellos. Segundo, hay que recordar que “Selection” es una propiedad que representa la selección realizada, en ese momento, de algún objeto.

Un ejemplo muy común de su uso es el código generado por nuestra vieja amiga la “Grabadora de Macros”:

Un ejemplo de macro grabada en donde colocamos color de relleno a un rango de celdas:

Sub Macro1()
'
' Macro1 Macro
'
'
Range("A1:B6").Select
With Selection.Interior         
.Pattern = xlSolid 
.PatternColorIndex = xlAutomatic  
.Color = 65535         
.TintAndShade = 0 
.PatternTintAndShade = 0     
End With     
Range("A1").Select 
End Sub 

Para, sobre todo, quienes se inician en el mundo del VBA, definitivamente la grabadora es una herramienta muy útil y ayuda mucho a aprender el uso métodos y las propiedades de los objetos pero hay que saber que hay mucho código innecesario que termina, no solo alargando nuestra macro, sino que en muchos casos hace más lentos lo procesos. Por ejemplo, lo que nos ha generado la grabadora en el ejemplo anterior, podríamos dejarlos así:

Sub Mi_Macro()
Range("A1:B6").Interior.Color = 65535 
End Sub 

Como se puede ver, no es necesario el uso de “Select” o de “Selection” para conseguir el mismo resultado, las propiedades de los objetos, en este caso un objeto “Range” (Rango), pueden ser modificadas sin necesidad de seleccionarlo.

Un ejemplo más como para que nos quede totalmente claro. Activamos la grabadora y borramos el contenido de un grupo de celdas:

Sub Macro4()
'
' Macro4 Macro
'
'
Range("A1:H5").Select
Selection.ClearContents 
End Sub 

Para, sobre todo, quienes se inician en el mundo del VBA, definitivamente la grabadora es una herramienta muy útil y ayuda mucho a aprender el uso métodos y las propiedades de los objetos pero hay que saber que hay mucho código innecesario que termina, no solo alargando nuestra macro, sino que en muchos casos hace más lentos lo procesos. Por ejemplo, lo que nos ha generado la grabadora en el ejemplo anterior, podríamos dejarlo así:

Sub BorrandoCeldas()
Range("A1:H5").ClearContents 
End Sub 

Aunque solo son dos líneas, podría quedar en una sola y además no olvidemos que es menos tiempo, y recursos en general, si no seleccionamos los objetos.

A veces nos acostumbramos tanto a seleccionar los objetos que aún sin usar la grabadora continuamos haciéndolo. He visto eso, sobre todo, cuando de copiar y pegar celdas se trata:

Sheets(“Hoja1”).Select 
Range(“A1:A10”).Select
Selection.Copy
Sheets(“Hoja2”).Select
Range(“D1”).Select
ActiveSheet.Paste

Todas esas líneas podríamos dejarlas de la siguiente forma sin recurrir a seleccionar objetos:

Sheets(“Hoja1”).Range(“A1:A10”).Copy Destination:= Sheets(“Hoja2”).Range(“D1”)  

Entonces, evitemos, de ser posible tanto el uso de “Select” como de “Selection”. Hasta la próxima.

Abraham Valencia

domingo, 19 de noviembre de 2017

Consejos para el uso de variables en VBA de Excel

Primero que nada debemos recordar que las variables son elementos que tienen como función hacer de contenedores polivalentes que pueden albergar distintos valores o datos. Dichos valores pueden ser constantes o no. Las variables en VBA son utilizadas para guardar valores y su tipo dependerá de la clase de dato que deseamos guardar dentro de ellas.

Segundo, es bueno recordar que si bien no es obligatorio declarar las variables, al no hacerlo estamos consumiendo más recursos de los necesarios y por lo tanto ocupando más espacio en la memoria. Cuando no declaramos las variables, al usarlas el VBA les asigna el tipo “Variant” que ocupa más memoria que otros tipos de variable. Del mismo modo tener las variables declaradas ayuda a entender mejor la programación que se realizará.

Una forma de no olvidarnos nunca de declarar las variables es hacer que el VBA nos lo recuerde, para eso en el Editor de VBA tenemos que ir a “Herramientas” – “Opciones” y en la pestaña “Editor” activamos el “check” de “Requerir declaración de variables”, de ese modo en todos los módulos de manera automática en la parte superior nos aparecerá la línea “Option Explicit” que es una instrucción que fuerza la declaración explícita de todas las variables.

Como para entendernos mejor, un ejemplo de lo que no es recomendable hacer sería el siguiente:

Sub DeclaracióndeVariables()
strNombre = "Abraham"
MsgBox strNombre
End Sub 

Con lo mismos datos, lo mejor sería colocar así la rutina:

Sub DeclaracióndeVariables()
Dim strNombre As String
strNombre = "Abraham"
MsgBox strNombre
End Sub 

Otra forma de hacerlo usando abreviaturas de variables:

Sub DeclaracióndeVariables()
Dim strNombre$
strNombre$ = "Abraham"
MsgBox strNombre$
End Sub 

Al declarar las variables otra cosa importante es asignarles el tipo de dato adecuado. En muchas ocasiones se ven declaraciones de variables de este tipo:

Dim A, B, C, D As String 

Recordemos que cuando declaramos una variable sin darle un tipo de dato, el sistema automáticamente le asigna un tipo “Variant”. Es decir, Dim A Significa que a la variable “A” le estamos dando un dato del tipo Variant. Asimismo, en una línea con Dim a cada variable se le tiene que asignar su tipo, sino, serán tipo “Variant”, por lo tanto la línea anterior es igual a colocar:

Dim A As Variant, B As Variant, C As Variant, D As String  

Entonces suponiendo que todas las variables serán cadenas, lo correcto sería colocar lo siguiente:

Dim A As String, B As String, C As String, D As String 

Hasta la próxima.

Abraham Valencia