Si el lector ya está familiarizado con el concepto de variable en el primer artículo de la serie ¿Qué es una variable en VBA para Excel? y también ha entendido el artículo Declaración de variables en VBA para Excel (I) , podría disponerse a leer este artículo que a buen seguro, le resultará interesante.
En el anterior post hablábamos de variables que representaban a valores (ya sean fechas, números enteros, decimales, etc.). En este artículo veremos las variables que representan a objetos (debemos saber que en VBA llamamos objetos a cualquier elemento de Excel como hojas, celdas, gráficos, formas, tablas, etc.).
Declarar variables de objeto está, si cabe, más justificado que declarar variables de valores, puesto que el ahorro en tiempo de escritura de código, en tiempo de ejecución del mismo, así como la organización y orden conseguidos en la estructura del procedimiento o macro, son espectaculares.
¿Cómo declarar una variable de objeto?
La declaración de una variable de objeto sería:
Dim Variable As TipoObjeto
Que significa:
Establecer Variable como TipoDeObjeto
Una vez declarada la variable, se le puede asignar un tipo de objeto, pero en este caso (a diferencia de las variables asignadas a valores) debemos comenzar la línea con la palabra Set , como en esta macro:
Sub VariableObjeto()
Dim MiCelda As Range
Set MiCelda = Worksheets("Hoja1").Range("A1")
MiCelda.Value = 4560
MiCelda.Interior.Color = RGB(166, 210, 241)
MiCelda.Font.Italic = True
MiCelda.Font.Bold = True
End Sub
La macro anterior declara la variable "MiCelda" como un rango, después asigna la variable a la celda A1 y posteriormente (en las últimas líneas) realiza varias acciones con la celda, nombrándola en todas las líneas siempre con el nombre de variable declarado al principio (en una línea inserta el valor 4560, en otra línea proporciona el color azul claro, en otra aplica cursiva y en la última aplica negrita).
Si no hubiéramos utilizado una variable de objeto , el código de las 3 líneas que modifican la celda A1 podría haber sido así de largo:
Sub VariableObjeto()
Worksheets("Hoja1").Range("A1")= 4560
Worksheets("Hoja1").Range("A1").Interior.Color = RGB(166, 210, 241)
Worksheets("Hoja1").Range("A1").Font.Italic = True
Worksheets("Hoja1").Range("A1").Font.Bold= True
End Sub
El primer código se ejecuta de forma más rápida que este último, porque Visual Basic no tiene que buscar una y otra vez la ruta de la celda A1. Aunque aun podríamos perfeccionarlo (en cuanto a eficiencia) de la siguiente forma:
Sub VariableObjeto()
Dim MiCelda As Range
Set MiCelda = Worksheets("Hoja1").Range("A1")
With MiCelda
.Value = 4560
.Interior.Color = RGB(166, 210, 241)
.Font.Italic = True
.Font.Bold = True
End With
End Sub
Siendo este el código más corto y rápido de todos.
¿Qué tipos de objetos pueden establecerse como variables?
En el ejemplo anterior, el tipo de objeto era Range, puesto que se quería asignar la variable a una celda. También sería Range si quisiéramos asignarla a columnas, filas, etc.
En el caso de querer asignar variables a un tipo de objeto "Hoja", deberíamos poner Worksheet . Otro ejemplo podría ser ListObject para referirnos a objetos tipo "Tabla de Excel". El usuario puede elegir el tipo de objeto al que refererirse en la lista que el editor de VBA ofrece mientras se escribre:
Otras utilidades
Declarar variables de objeto no sirve únicamente para acortar el código y hacerlo más eficiente, un ejemplo lo tenemos en el siguiente código, que utiliza una variable de objeto para que Excel vaya recorriendo una serie de hojas hasta que encuentra una que se llama "HojaClave" y la seleccione.
Sub VariableObjeto()
Dim MiHoja As Worksheet
For Each MiHoja In Worksheets
If MiHoja.Name = "HojaClave" Then
MiHoja.Select
End If
Next MiHoja
End Sub
Después de declarar la variable de objeto, utilizamos un bucle For Each - Next y dentro de él, utilizamos un condicional If - End If. Declarar una variable nos ha evitado tener que nombrar mediante código cada una de todas las hojas que tengamos para buscar la que deseamos.
Si tradujéramos el código a lenguaje castellano, sería:
Iniciamos Subrutina VariableObjeto()
Establezco MiHoja como TipoDeObjetoHojaDeExcel
Por Cada MiHoja En LaColecciónDeHojasDeMiLibro
Si MiHoja.Nombre = "HojaClave" Entonces
MiHoja.Seleccionada
FinalDelCondicionalSI
ExaminarSiguiente MiHoja
End Sub
Recorrer hojas o celdas en busca de una que cumpla con una condición, es una de las utilidades mayores de la declaración de variables de objeto, puesto que permite utilizarse con bucles y condicionales que detectan si se cumple la condición que queremos y pueden actuar.
Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company: