L'opérateur With...End With permet de simplifier l'accès aux propriétés et méthodes d'un même objet, afin de ne pas répéter le nom de l'objet dans chaque expression. Toutes les références à l'intérieur du bloc se réfèrent à l'objet spécifié.
Exemple d'utilisation :
With myCustomer .Name = "Ivanov" .Balance += 1000 .LastPurchase = Now End With
Avantages :
Question : Peut-on imbriquer un bloc With dans un autre ? Que se passe-t-il avec les références aux propriétés et méthodes dans le bloc imbriqué ?
Réponse : Oui, l'imbrication est possible. Mais à l'intérieur du bloc interne, la référence avec un point (.) sera interprétée par rapport à l'objet interne. Si on utilise le même nom de propriété, cela entraînera une ambiguïté.
With obj1 .Value = 10 With obj2 .Value = 20 ' C'est obj2.Value, et non obj1.Value End With End With
Histoire
Dans la section With imbriquée, des propriétés avec le même nom ont été utilisées dans différents objets, et le développeur s'attendait à ce que l'attribution affecte l'objet externe. En conséquence, les données étaient écrites à un endroit incorrect, le problème n'est apparu qu'à la génération d'un rapport complexe, lorsque les valeurs ont été mélangées.
Histoire
Lors du refactoring de code, les fins de blocs End With ont été confondues. Dans un grand morceau de code, cela a conduit à ce que les expressions commencent à se référer à une autre instance d'objet (déjà fermée) et non celle attendue, ce qui a entraîné des erreurs d'exécution et des bogues difficilement détectables.
Histoire
Dans la logique métier, un With était utilisé pour des collections imbriquées. Après la mise à jour de la structure de la classe, une nouvelle propriété a été ajoutée avec un nom identique à ceux des propriétés de l'objet interne, ce qui a causé un conflit et une erreur de compilation, non détectée en raison de l'absence de tests unitaires pour ces cas.