Trabajando en un objeto
Como en cualquier otro idioma, todavía puede acaecer situaciones en VBA en las que estemos trabajando continuamente en un objeto específico. En esta ocasión vamos a entender como usar la instrucción whith en VBA
Por ejemplo, queremos aplicar formato condicional a una celda en función de la información cambiando la fuente, el color de la fuente, el color de fondo, el subrayado, la negrita o la cursiva, etc. Cuando se va a codificar esta bono, debemos usar un pedrusco de código donde cada segmento comience con:
Sheets(“<sheet name>”).cells( <row num> , <col num> ).
El pedrusco «with-terminando with»
La parte repetitiva del código, como se ve en el ejemplo antedicho, puede estar de moda una vez y hacerse global a todas las líneas del pedrusco usando el with–Terminar with pocas declaraciones.
Sintaxis
With <object expression>
[<block of code where each line starts with a period .>]
End With
Cierto
- El pedrusco de código/declaraciones entre las declaraciones «With» y «Terminar con» son completamente opcionales.
<object expression>
se puede elaborar como
<object name > [. <property name>][. <property name>][. <property name>]……
Ejemplo
Para desarrollar nuestro ejemplo antedicho, el código para formatear una celda sería:
Sub format_cell() Cells(20, 1).Interior.Pattern = xlSolid Cells(20, 1).Interior.PatternColorIndex = xlAutomatic Cells(20, 1).Interior.Color = 65535 Cells(20, 1).Interior.TintAndShade = 0 Cells(20, 1).Interior.PatternTintAndShade = 0 Cells(20, 1).Font.ThemeColor = xlThemeColorAccent6 Cells(20, 1).Font.TintAndShade = 0 Cells(20, 1).Font.Bold = True Cells(20, 1).Font.Italic = True Cells(20, 1).Font.Underline = xlUnderlineStyleSingle End Sub
Pero este código todavía se puede escribir como:
Sub format_cell_with() With Cells(20, 1).Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 65535 .TintAndShade = 0 .PatternTintAndShade = 0 End With With Cells(20, 1).Font .ThemeColor = xlThemeColorAccent6 .TintAndShade = 0 .Bold = True .Italic = True .Underline = xlUnderlineStyleSingle End With End Sub
Uso de «With-End» anidado con instrucciones
Una o más declaraciones «With» pueden ser: anidado adentro de otras declaraciones «With», según sus requisitos. Por ejemplo, la expresión de objeto de la confesión «with» externa debe ser parte de la expresión de objeto completa de la expresión de objeto de pedrusco «with» interna.
Aquí hay un ejemplo para ayudarlo a entender:
Formulario de legatario: formato de cuadro de texto
En este ejemplo, estableceremos las propiedades de un cuadro de texto específico utilizando el módulo de código VBA. Estas líneas se escriben en el método de «inicializar» del formulario de legatario para que los títulos de propiedad se establezcan cuando se carga el formulario.
Private Sub UserForm_Initialize() TextBox1.BorderStyle = fmBorderStyleSingle TextBox1.BackColor = yellow TextBox1.AutoSize = True TextBox1.BackStyle = fmBackStyleTransparent TextBox1.CanPaste = True TextBox1.Enabled = True TextBox1.Font.Bold = True TextBox1.Font.Italic = True TextBox1.Font.Size = 5 End Sub
Esto todavía se puede hacer fácilmente usando la confesión «With y Terminar With»:
Private Sub UserForm_Initialize() With TextBox1 .BorderStyle = fmBorderStyleSingle .BackColor = yellow .AutoSize = True .BackStyle = fmBackStyleTransparent .CanPaste = True .Enabled = True End With With TextBox1.Font .Bold = True .Italic = True .Size = 5 End With End Sub
Ahora todavía podemos escribir el mismo código usando un pedrusco «With» anidado.
En este caso, la expresión de objeto para el primero con pedrusco Textbox1
y la expresión de objeto para el segundo con pedrusco es Textbox1.Font
† La expresión de objeto del primero es parte del segundo. Entonces podemos reescribir el código como:
Private Sub UserForm_Initialize() With TextBox1 .BorderStyle = fmBorderStyleSingle .BackColor = yellow .AutoSize = True .BackStyle = fmBackStyleTransparent .CanPaste = True .Enabled = True With .Font .Bold = True .Italic = True .Size = 5 End With End With End Sub
Ambiente en tiempo verdadero: use la confesión «With» con la confesión «Si»
En este ejemplo, resaltaremos una celda en color naranja y cambiaremos las propiedades de la fuente si contiene la palabra «India».
Sub format_cell_with() For i = 1 To 9 For j = 1 To 4 cellcontent = Cells(i, j).Value If InStr(cellcontent, "India") &amp;gt; 0 Then With Cells(i, j).Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent2 .TintAndShade = 0.399975585192419 .PatternTintAndShade = 0 With Cells(20, 1).Font .Bold = True .Italic = True .Underline = xlUnderlineStyleSingle End With End With End If Next Next End Sub
Inferencia
Esta confesión «With-End With» ayuda a organizar y estrechar la cantidad de caracteres en su código, lo que facilita su mantenimiento. Al mismo tiempo, puede ser difícil depurar los problemas con dicho código si hay demasiadas instrucciones en el pedrusco. Esto se debe a que podemos desplazarnos por la página para descubrir el código y nos resulta difícil comprender las expresiones de objeto asociadas con las declaraciones en ese pedrusco. Esto puede conducir a errores de tiempo de ejecución que nos hagan perder el tiempo.
En VBA, si queremos repasar el estado o las propiedades de un objeto en tiempo de ejecución, simplemente resaltamos la relato en el código y seleccionamos «añadir a la ventana gráfica» en el menú contextual para agregarlos a la ventana gráfica. Con relato a otros lenguajes como UFT que nos brindan: informador de objetos y marcar objeto característica, esta confesión «Con» puede ser un obstáculo, ya que necesitamos resaltar toda la segmento de código durante la depuración.
En prontuario, cuando se usa la confesión «With», puede volverse engorroso en tiempo de ejecución marcar la relato completa al objeto, aunque es posible.