Vamos a abordar en este tercer artículo de la serie, otras 5 formas de optimizar nuestras macros en VBA para Excel.
1) Declarar variables con tipos de datos concretos
Al declarar una variable, debemos declarar las variables asignándole el tipo de dato que contendrá. Es decir, si necesito una variable llamada i para un bucle, debo asignarle un tipo de dato a la declaración. En este caso sería una variable con números enteros:
Sub Variable_i ()
Dim i As Integer
For i = 1 To 5
... mi código...
Next
End Sub
Si hubiéramos declarado la variable tan solo escribiendo Dim i o si no la hemos declarado, VBA asignará por defecto el tipo de variable Variant, para la que será necesario reservar y utilizar 16 bytes en la memoria de nuestro equipo. En su lugar, agregando As Integer a la declaración, se reservarán y utilizarán tan solo 2 bytes en memoria. Esta utilización, repetida muchas veces (como puede ser el caso de un bucle) hará que nuestra macro pueda ejecutarse más lenta o más rápida, dependiendo de los bytes reservados en memoria para la variable.
Cuidado con declarar varias variables a la vez de esta forma...
Dim i, f, t, x as Integer
... puesto que así, solo hemos asignado un tipo de datos a la última variable de la lista. Para aprender más sobre cómo declarar variables, haga clic en el siguiente enlace: Declaración de variables en VBA para Excel (I)
2) Utilizar "Select Case" en vez de "IF... Then..."
Sub MiMacro ()
IF Range("A1") = 100 Then
Range("A2") = 200
End IF
IF Range("A1") = 200 Then
Range("A3") = 400
End IF
IF Range("A1") = 300 Then
Range("A4") = 600
End IF
End Sub
Es más óptimo utilizar el siguiente código:
Dim MiValor As Integer
MiValor = Range("A1")
Select Case MiValor
Case 100
Range("A2") = 200
Case 200
Range("A3") = 400
Case 300
Range("A4") = 600
End Select
End Sub
El motivo es que la instrucción Select Case solo evalúa hasta el caso en el que es verdadero y después termina de evaluar. Sin embargo, con IF...THEN... , VBA debe entrar a valorar todas las expresiones. No debería hacer falta decir que es conveniente situar en primera posición la opción que tiene más posibilidades de cumplirse.
3) Limpiar las variables objeto al final de cada macro
Sub MiMacro ()
Dim MiRango As Range
Set MiRango = Range("A1")
..... mi código ....
Set MiRango = Nothing
End Sub
4) Escribir macros que están relacionadas entre si, en el mismo módulo
Si tenemos una macro que nos remite a otra y esta a su vez remite a otra.... sería conveniente que todas las macros que van a ejecutarse de forma sucesiva estuvieran en el mismo módulo. De esta forma, VBA no tendría que cargar en memoria varios módulos durante la ejecución.
De hecho, también es conveniente que durante el trabajo cotidiano con nuestra aplicación en Excel no permanezcan abiertos módulos del editor de Visual Basic. Por supuesto, también es mejor que ni siquiera el editor de VBA esté abierto.
De hecho, también es conveniente que durante el trabajo cotidiano con nuestra aplicación en Excel no permanezcan abiertos módulos del editor de Visual Basic. Por supuesto, también es mejor que ni siquiera el editor de VBA esté abierto.
5) Precalcular con variables todo lo que esté dentro de un bucle
Sub MiMacro ()
Dim i As Integer
For i = 1 To 5000
Cells (i,3) = Range("B7")*459
Next
End Sub
Sub MiMacro ()
Dim i As Integer
Dim Operacion as Double
Operacion = Range("B7")*459
For i = 1 To 5000
Cells (i,3) = Operacion
Next
End Sub
... en el que podemos ver que la operación que hay dentro del bucle la calculamos con anterioridad y depositamos el valor en una variable (Operacion). De esta forma, VBA no tiene que realizar 5000 veces el cálculo, sino que solo tiene que transferir el resultado de la memoria a la celda Cells(i,3).
Buenas noches
ResponderEliminarMe surge una duda en el punto 2 con el if vs select case
En el ejemplo ponen if then end if then end, en lugar de if then elseif else end if, si usamos el ejemplo que propongo, aun asi es mas obtimo el select case
Saludos cordiales
Estudie hace poco en esta web https://formacionprofesional.com.es/cu-fp-sistemas-microinformaticos-y-redes de sistemas microinformáticos y redes y los materiales de estudio estaban bien estructurados y organizados.
ResponderEliminar