Sentencia With
Al programar en VBA, frecuentemente necesitas acceder a múltiples propiedades o métodos del mismo objeto de forma repetida. La sentencia With facilita mucho esta tarea. Este artículo explica todo, desde los conceptos básicos hasta el uso avanzado, con ejemplos concretos.
Cuándo necesitas la sentencia With
Al trabajar con celdas de Excel, hojas de cálculo, gráficos y otros objetos en VBA, es común establecer múltiples propiedades o ejecutar múltiples métodos sobre el mismo objeto.
Considera el siguiente código que aplica varias configuraciones a una celda:
Sub SinWithEjemplo()
ActiveSheet.Range("A1").Value = "Título"
ActiveSheet.Range("A1").Font.Bold = True
ActiveSheet.Range("A1").Font.Size = 14
ActiveSheet.Range("A1").Font.Color = RGB(0, 0, 255)
ActiveSheet.Range("A1").Interior.Color = RGB(255, 255, 200)
ActiveSheet.Range("A1").HorizontalAlignment = xlCenter
End Sub
Este código repite ActiveSheet.Range("A1") múltiples veces, causando varios problemas:
- Código verboso que es más difícil de leer
- Mayor riesgo de errores tipográficos
- Degradación del rendimiento (la resolución de referencias ocurre cada vez)
- Pobre mantenibilidad (cambiar la celda objetivo requiere modificar cada línea)
La sentencia With resuelve estos problemas.
¿Qué es la sentencia With?
La sentencia With te permite escribir múltiples operaciones sobre el mismo objeto juntas. Una vez que especificas la referencia del objeto después de With, puedes usar la notación abreviada comenzando con un punto (.) dentro del bloque With...End With.
Sintaxis básica
With objeto
.Propiedad1 = Valor1
.Propiedad2 = Valor2
.Metodo1
End With
Especifica el objeto destino después de With, luego accede a sus miembros comenzando con . (punto) dentro del bloque.
Usar la sentencia With significa que la resolución de referencias ocurre solo una vez al principio, lo cual puede mejorar el rendimiento.
Ejemplos prácticos de la sentencia With
Uso básico
Reescribamos el ejemplo anterior usando la sentencia With:
Sub WithEjemplo()
With ActiveSheet.Range("A1")
.Value = "Título"
.Font.Bold = True
.Font.Size = 14
.Font.Color = RGB(0, 0, 255)
.Interior.Color = RGB(255, 255, 200)
.HorizontalAlignment = xlCenter
End With
End Sub
La referencia ActiveSheet.Range("A1") ahora aparece solo una vez, haciendo el código mucho más limpio.
Sentencias With anidadas
Las sentencias With pueden anidarse. Por ejemplo, puedes usar sentencias With separadas para una celda y su objeto Font:
Sub WithAnidadoEjemplo()
With ActiveSheet.Range("A1")
.Value = "Aviso Importante"
.HorizontalAlignment = xlCenter
With .Font
.Name = "Arial"
.Size = 16
.Bold = True
.Color = RGB(255, 0, 0)
End With
With .Interior
.Color = RGB(255, 255, 200)
.Pattern = xlSolid
End With
End With
End Sub
Anidar sentencias With demasiado profundamente puede reducir la legibilidad. Generalmente, se recomienda mantener 2-3 niveles de anidamiento.
Configuración por lotes para múltiples celdas
Sub MultipleRangeWithEjemplo()
Dim i As Long
' Configuración de fila de encabezado
With ActiveSheet.Range("A1:E1")
.Value = Array("Nombre", "Edad", "Departamento", "Cargo", "Salario")
.Font.Bold = True
.Font.Size = 11
.Interior.Color = RGB(200, 200, 255)
.HorizontalAlignment = xlCenter
End With
' Formato de filas de datos
For i = 2 To 10
With ActiveSheet.Rows(i)
.Font.Size = 10
.RowHeight = 20
' Colores de fondo alternados
If i Mod 2 = 0 Then
.Interior.Color = RGB(240, 240, 240)
End If
End With
Next i
End Sub
Configuración de gráficos
La sentencia With es particularmente útil para configurar gráficos, que tienen muchas configuraciones:
Sub ConfigurarGraficoConWith()
Dim chartObj As ChartObject
Set chartObj = ActiveSheet.ChartObjects.Add(100, 100, 400, 300)
With chartObj.Chart
.ChartType = xlColumnClustered
.SetSourceData Source:=Range("A1:B10")
With .ChartTitle
.Text = "Ventas Mensuales"
.Font.Size = 14
.Font.Bold = True
End With
With .Axes(xlCategory)
.HasTitle = True
.AxisTitle.Text = "Mes"
End With
With .Axes(xlValue)
.HasTitle = True
.AxisTitle.Text = "Ventas ($)"
End With
.Legend.Position = xlLegendPositionBottom
End With
End Sub
Consideraciones importantes
No mezclar referencias externas
Dentro de un bloque With, cualquier . que no comience la línea se refiere al objeto With:
Sub WithPrecaucionEjemplo()
Dim otraHoja As Worksheet
Set otraHoja = Worksheets("Hoja2")
With ActiveSheet.Range("A1")
.Value = "Valor Principal"
' Esto está bien - usando un objeto diferente explícitamente
otraHoja.Range("A1").Value = "Otro Valor"
' Esto referencia el objeto With
.Font.Bold = True
End With
End Sub
Evitar anidamiento excesivo
Aunque el anidamiento es poderoso, demasiados niveles hacen el código difícil de seguir.
Resumen
La sentencia With es una característica esencial de VBA que:
- Reduce la repetición: Escribe referencias de objetos solo una vez
- Mejora la legibilidad: Hace el código más fácil de entender
- Mejora la mantenibilidad: Los cambios requieren editar solo una ubicación
- Puede mejorar el rendimiento: Reduce la sobrecarga de resolución de objetos
Domina la sentencia With para escribir código VBA más limpio y eficiente.