Curso Excel VBA y Macros – Cap. 18 – Instrucción With…End With para facilicitar nuestro código
La instrucción With…End With nos ayudará a ser más eficientes al momento de escribir código VBA, ya que nos permite hacer referencia a un objeto y luego podemos manipular sus propiedades, pero sin tener que escribir de nuevo toda la referencia al objeto.
With-End With ejecuta una serie de instrucciones que hacen referencia de manera repetitiva a un mismo objeto.
Ver video Capítulo 18 Excel VBA & Macros
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Por qué debo usar With End With
Existen varias razones por las que es recomendable utilizar la instrucción en nuestras macros:
-
Ejecutar código VBA más rápido.
-
Simplificar la lectura de nuestras macros
-
Escribir menos código a evitar escribir la misma referencia a un objeto.
Sintaxis de la instrucción With…End With
La sintaxis de esta instrucción es sencilla, pero a su vez, y como lo vimos anteriormente, nos facilitará mucho la escritura o codificación de nuestras macros.
With ReferenciaObjeto
[ intrucciones ]
End With
Donde:
-
With. Es el inicio de la estructura.
-
ReferenciaObjeto. Esta referencia al un objeto realmente es una expresión que devolverá un objeto, y puede ser tan compleja como deseemos.
-
Instrucciones. De manera opcional podemos manejas varias sentencias o instrucciones y escribir o leer propiedades y métodos de ReferenciaObjeto.
-
End With. Es el cierre de la instrucción
La importancia del punto
Cuando usamos una expresión o la referencia a un objeto después de End With, si en la sección de instrucciones ingresamos solo el punto “.” Estaremos haciendo referencia al objeto en cuestión, solo que, en lugar de escribir toda la referencia, solo la escribimos una vez y luego solo usamos el punto.
Después de End With cualquier referencia a un objeto de deberá hacer de manera jerárquica.
Ejemplos de uso de With-End With
En esta macro le cambiaremos las propiedades de Nombre de fuente, tamaño de fuente y Negritas a un rango de celdas. Lo haremos de la manera tradicional, sin With End With.
Sub Intrucción_With() ThisWorkbook.Sheets("Hoja1").Range("A3").CurrentRegion.Font.Name = "Calibri" ThisWorkbook.Sheets("Hoja1").Range("A3").CurrentRegion.Font.Size = 20 ThisWorkbook.Sheets("Hoja1").Range("A3").CurrentRegion.Font.Bold = True End Sub
Imaginemos que accedemos a más de 5 propiedades del rango anterior. Repetir la misma referencia en varias líneas, puede perjudicar al rendimiento de la macro, además de verse saturada.
En esta macro usamos With End With y vemos cómo el código se vuelve más legible y se ve claramente el bloque de la estructura.
Sub Intrucción_With2() With ThisWorkbook.Sheets("Hoja1").Range("A3").CurrentRegion.Font .Name = "Calibri" .Size = 20 .Bold = True End With End Sub
Ahora veremos una macro que hace lo mismo que las anteriores, pero haremos uso de una variable de objeto, asignando la propiedad CurrentRegion a la variable MiRango.
Sub Instrucción_With3() Dim MiRango As Range Set MiRango = ThisWorkbook.Sheets("Hoja1").Range("A3").CurrentRegion With MiRango.Font .Name = "Calibri" .Size = 20 .Bold = True End With End Sub
Y para repasar los temas de las Variables de objeto y las variables a nivel Módulo, en las siguientes dos macros realizaremos los siguiente:
-
Declaramos 3 variables a nivel Módulo.
-
Estas variables guardarán el formato inicial de un rango. Usamos Nombre, Tamanio y Negrita.
-
En la primera macro guardamos el formato actual en las variables y posteriormente le asignamos otro formato al rango.
-
En la segunda macro leeremos los valores guardados en las variables y los asignaremos de formato de las celdas, así vemos cómo se resetea el formato de las celdas.
Option Explicit Dim Nombre As String Dim Tamanio As Byte Dim Negrita As Boolean Sub Formato() Dim MiRango As Range Set MiRango = ThisWorkbook.Sheets("Hoja1").Range("A3").CurrentRegion With MiRango.Font Nombre = .Name Tamanio = .Size Negrita = .Bold End With With MiRango.Font .Name = "Calibri" .Size = 20 .Bold = True End With End Sub Sub ResetearFormato() Dim MiRango As Range Set MiRango = ThisWorkbook.Sheets("Hoja1").Range("A3").CurrentRegion With MiRango.Font .Name = Nombre .Size = Tamanio .Bold = Negrita End With End Sub
Descarga el archivo de ejemplo
Si te gustó este tutorial por favor regístrate en nuestra Lista de correo y Suscríbete a nuestro canal de YouTube para que estés siempre enterado de lo nuevo que publicamos.