El operador With...End With permite simplificar el acceso a las propiedades y métodos de un objeto, para no repetir el nombre del objeto en cada expresión. Todas las referencias dentro del bloque se refieren al objeto especificado.
Ejemplo de uso:
With myCustomer .Name = "Ivanov" .Balance += 1000 .LastPurchase = Now End With
Utilidad:
Pregunta: ¿Se puede anidar un bloque With dentro de otro? ¿Qué sucede con las referencias a propiedades y métodos en el bloque anidado?
Respuesta: Sí, la anidación es posible. Pero dentro del bloque interno, la referencia con punto (.) se interpretará en relación con el objeto interno. Si se utiliza el mismo nombre de propiedad, surgirá ambigüedad.
With obj1 .Value = 10 With obj2 .Value = 20 ' Este es obj2.Value, no obj1.Value End With End With
Historia
En la sección With anidada se utilizaron propiedades con el mismo nombre en diferentes objetos, y el desarrollador esperaba que la asignación afectara al objeto externo. Como resultado, los datos se escribieron en el lugar incorrecto; el problema se manifestó solo al generar un informe complejo, cuando los valores estaban confundidos.
Historia
Al refactorizar el código, se confundieron los finales de los bloques End With. En un gran fragmento de código, esto llevó a que las expresiones comenzaran a referirse a otra instancia del objeto (ya cerrada), en lugar de la esperada, lo que resultó en errores de ejecución y errores difíciles de detectar.
Historia
En la lógica de negocio se utilizó With para colecciones anidadas. Después de actualizar la estructura de la clase, se añadió una nueva propiedad con un nombre que coincidía con las propiedades del objeto interno, lo que provocó un conflicto y un error de compilación, no detectado debido a la falta de pruebas unitarias para estos casos.